blob: cb54aef8fa771a2ed55881efbaadec351939735b [file] [log] [blame]
/*
* Copyright (C) 2014 Square, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.squareup.okhttp;
import java.io.IOException;
import okio.Buffer;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public final class FormEncodingBuilderTest {
@Test public void urlEncoding() throws Exception {
RequestBody formEncoding = new FormEncodingBuilder()
.add("a+=& b", "c+=& d")
.add("space, the", "final frontier")
.add("%25", "%25")
.build();
assertEquals("application/x-www-form-urlencoded", formEncoding.contentType().toString());
String expected = "a%2B%3D%26%20b=c%2B%3D%26%20d&space%2C%20the=final%20frontier&%2525=%2525";
assertEquals(expected.length(), formEncoding.contentLength());
Buffer out = new Buffer();
formEncoding.writeTo(out);
assertEquals(expected, out.readUtf8());
}
@Test public void addEncoded() throws Exception {
RequestBody formEncoding = new FormEncodingBuilder()
.addEncoded("a+=& b", "c+=& d")
.addEncoded("e+=& f", "g+=& h")
.addEncoded("%25", "%25")
.build();
String expected = "a+%3D%26%20b=c+%3D%26%20d&e+%3D%26%20f=g+%3D%26%20h&%25=%25";
Buffer out = new Buffer();
formEncoding.writeTo(out);
assertEquals(expected, out.readUtf8());
}
@Test public void encodedPair() throws Exception {
RequestBody formEncoding = new FormEncodingBuilder()
.add("sim", "ple")
.build();
String expected = "sim=ple";
assertEquals(expected.length(), formEncoding.contentLength());
Buffer buffer = new Buffer();
formEncoding.writeTo(buffer);
assertEquals(expected, buffer.readUtf8());
}
@Test public void encodeMultiplePairs() throws Exception {
RequestBody formEncoding = new FormEncodingBuilder()
.add("sim", "ple")
.add("hey", "there")
.add("help", "me")
.build();
String expected = "sim=ple&hey=there&help=me";
assertEquals(expected.length(), formEncoding.contentLength());
Buffer buffer = new Buffer();
formEncoding.writeTo(buffer);
assertEquals(expected, buffer.readUtf8());
}
@Test public void buildEmptyForm() throws Exception {
RequestBody formEncoding = new FormEncodingBuilder().build();
String expected = "";
assertEquals(expected.length(), formEncoding.contentLength());
Buffer buffer = new Buffer();
formEncoding.writeTo(buffer);
assertEquals(expected, buffer.readUtf8());
}
@Test public void characterEncoding() throws Exception {
assertEquals("%00", formEncode(0)); // Browsers convert '\u0000' to '%EF%BF%BD'.
assertEquals("%01", formEncode(1));
assertEquals("%02", formEncode(2));
assertEquals("%03", formEncode(3));
assertEquals("%04", formEncode(4));
assertEquals("%05", formEncode(5));
assertEquals("%06", formEncode(6));
assertEquals("%07", formEncode(7));
assertEquals("%08", formEncode(8));
assertEquals("%09", formEncode(9));
assertEquals("%0A", formEncode(10)); // Browsers convert '\n' to '\r\n'
assertEquals("%0B", formEncode(11));
assertEquals("%0C", formEncode(12));
assertEquals("%0D", formEncode(13)); // Browsers convert '\r' to '\r\n'
assertEquals("%0E", formEncode(14));
assertEquals("%0F", formEncode(15));
assertEquals("%10", formEncode(16));
assertEquals("%11", formEncode(17));
assertEquals("%12", formEncode(18));
assertEquals("%13", formEncode(19));
assertEquals("%14", formEncode(20));
assertEquals("%15", formEncode(21));
assertEquals("%16", formEncode(22));
assertEquals("%17", formEncode(23));
assertEquals("%18", formEncode(24));
assertEquals("%19", formEncode(25));
assertEquals("%1A", formEncode(26));
assertEquals("%1B", formEncode(27));
assertEquals("%1C", formEncode(28));
assertEquals("%1D", formEncode(29));
assertEquals("%1E", formEncode(30));
assertEquals("%1F", formEncode(31));
assertEquals("%20", formEncode(32)); // Browsers use '+' for space.
assertEquals("%21", formEncode(33));
assertEquals("%22", formEncode(34));
assertEquals("%23", formEncode(35));
assertEquals("%24", formEncode(36));
assertEquals("%25", formEncode(37));
assertEquals("%26", formEncode(38));
assertEquals("%27", formEncode(39));
assertEquals("%28", formEncode(40));
assertEquals("%29", formEncode(41));
assertEquals("*", formEncode(42));
assertEquals("%2B", formEncode(43));
assertEquals("%2C", formEncode(44));
assertEquals("-", formEncode(45));
assertEquals(".", formEncode(46));
assertEquals("%2F", formEncode(47));
assertEquals("0", formEncode(48));
assertEquals("9", formEncode(57));
assertEquals("%3A", formEncode(58));
assertEquals("%3B", formEncode(59));
assertEquals("%3C", formEncode(60));
assertEquals("%3D", formEncode(61));
assertEquals("%3E", formEncode(62));
assertEquals("%3F", formEncode(63));
assertEquals("%40", formEncode(64));
assertEquals("A", formEncode(65));
assertEquals("Z", formEncode(90));
assertEquals("%5B", formEncode(91));
assertEquals("%5C", formEncode(92));
assertEquals("%5D", formEncode(93));
assertEquals("%5E", formEncode(94));
assertEquals("_", formEncode(95));
assertEquals("%60", formEncode(96));
assertEquals("a", formEncode(97));
assertEquals("z", formEncode(122));
assertEquals("%7B", formEncode(123));
assertEquals("%7C", formEncode(124));
assertEquals("%7D", formEncode(125));
assertEquals("%7E", formEncode(126));
assertEquals("%7F", formEncode(127));
assertEquals("%C2%80", formEncode(128));
assertEquals("%C3%BF", formEncode(255));
}
private String formEncode(int codePoint) throws IOException {
// Wrap the codepoint with regular printable characters to prevent trimming.
RequestBody body = new FormEncodingBuilder()
.add("a", new String(new int[] { 'b', codePoint, 'c' }, 0, 3))
.build();
Buffer buffer = new Buffer();
body.writeTo(buffer);
buffer.skip(3); // Skip "a=b" prefix.
return buffer.readUtf8(buffer.size() - 1); // Skip the "c" suffix.
}
}