package io.vertx.test.core;
import io.vertx.core.MultiMap;
import io.vertx.core.http.CaseInsensitiveHeaders;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.junit.Assert.*;
public class CaseInsensitiveHeadersTest {
@Test
public void testCaseInsensitiveHeaders()
throws Exception {
MultiMap result = new CaseInsensitiveHeaders();
assertNotNull(result);
assertTrue(result.isEmpty());
assertEquals(0, result.size());
assertEquals("", result.toString());
}
@Test
public void testAddTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
HashMap<String, String> map = new HashMap<String, String>();
map.put("a", "b");
MultiMap result = mmap.addAll(map);
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(1, result.size());
assertEquals("a: b\n", result.toString());
}
@Test
public void testAddTest2()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
HashMap<String, String> map = new HashMap<String, String>();
map.put("a", "b");
map.put("c", "d");
assertEquals("a: b\nc: d\n", mmap.addAll(map).toString());
}
@Test
public void testAddTest3()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
HashMap<String, String> map = new HashMap<String, String>();
map.put("a", "b");
assertEquals("a: b\n", mmap.addAll(map).toString());
}
@Test
public void testAddTest4()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
Map<String, String> map = new HashMap<String, String>();
assertEquals("", mmap.addAll(map).toString());
}
@Test
public void testAddTest5()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
MultiMap headers = new CaseInsensitiveHeaders();
assertEquals("", mmap.addAll(headers).toString());
}
@Test
public void testAddTest7()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
CharSequence name = "name";
CharSequence value = "value";
assertEquals("name: value\n", mmap.add(name, value).toString());
}
@Test
public void testAddTest8()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
CharSequence name = "name";
ArrayList<CharSequence> values = new ArrayList<CharSequence>();
values.add("somevalue");
assertEquals("name: somevalue\n", mmap.add(name, values).toString());
}
@Test
public void testAddTest9()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "";
ArrayList<CharSequence> values = new ArrayList<CharSequence>();
values.add("somevalue");
assertEquals(": somevalue\n", mmap.add(name, values).toString());
}
@Test
public void testAddTest10()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "a";
ArrayList<CharSequence> values = new ArrayList<CharSequence>();
values.add("somevalue");
assertEquals("a: somevalue\n", mmap.add(name, values).toString());
}
@Test
public void testAddTest11()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "";
String strVal = "";
assertEquals(": \n", mmap.add(name, strVal).toString());
}
@Test
public void testAddTest12()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "a";
String strVal = "b";
assertEquals("a: b\n", mmap.add(name, strVal).toString());
}
@Test
public void testAddTest13()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "aaa";
String strVal = "";
assertEquals("aaa: \n", mmap.add(name, strVal).toString());
}
@Test
public void testAddTest14()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "";
String strVal = "aaa";
assertEquals(": aaa\n", mmap.add(name, strVal).toString());
}
@Test
public void testAddIterable()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "name";
List<String> values = new ArrayList<String>();
values.add("value1");
values.add("value2");
MultiMap result = mmap.add(name, values);
assertEquals(1, result.size());
assertEquals("name: value1\nname: value2\n", result.toString());
}
@Test
public void testAddMultiMap()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
MultiMap mm = new CaseInsensitiveHeaders();
mm.add("Header1", "value1");
mm.add("Header2", "value2");
MultiMap result = mmap.addAll(mm);
assertEquals(2, result.size());
assertEquals("Header1: value1\nHeader2: value2\n", result.toString());
}
@Test
public void testClearTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
MultiMap result = mmap.clear();
assertNotNull(result);
assertTrue(result.isEmpty());
assertEquals(0, result.size());
assertEquals("", result.toString());
}
@Test
public void testContainsTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
CharSequence name = String.valueOf(new Object());
assertFalse(mmap.contains(name));
}
@Test
public void testContainsTest2()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "";
assertFalse(mmap.contains(name));
}
@Test
public void testContainsTest3()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "0123456789";
boolean result = mmap.contains(name);
assertFalse(result);
mmap.add(name, "");
result = mmap.contains(name);
assertTrue(result);
}
@Test
public void testEntriesTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
List<Map.Entry<String, String>> result = mmap.entries();
assertNotNull(result);
assertEquals(0, result.size());
}
@Test
public void testGetTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
CharSequence name = String.valueOf(new Object());
assertNull(mmap.get(name));
}
@Test
public void testGetTest2()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "1";
assertNull(mmap.get(name));
}
@Test
public void testGetTest3()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "name";
String result = mmap.get(name);
assertNull(result);
mmap.add(name, "value");
result = mmap.get(name);
assertEquals("value", result);
}
@Test(expected = NullPointerException.class)
public void testGetNPE() {
new CaseInsensitiveHeaders().get(null);
}
@Test
public void testGetAllTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
CharSequence name = String.valueOf(new Object());
List<String> result = mmap.getAll(name);
assertNotNull(result);
assertEquals(0, result.size());
}
@Test
public void testGetAllTest2()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "1";
List<String> result = mmap.getAll(name);
assertNotNull(result);
assertEquals(0, result.size());
}
@Test
public void testGetAllTest3()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "name";
List<String> result = mmap.getAll(name);
assertNotNull(result);
assertEquals(0, result.size());
}
@Test
public void testGetAll()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "name";
mmap.add(name, "value1");
mmap.add(name, "value2");
List<String> result = mmap.getAll(name);
assertNotNull(result);
assertEquals(2, result.size());
assertEquals("value1", result.get(0));
}
@Test(expected = NullPointerException.class)
public void testGetAllNPE()
throws Exception {
new CaseInsensitiveHeaders().getAll(null);
}
@Test
public void testIsEmptyTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
assertTrue(mmap.isEmpty());
}
@Test
public void testIsEmptyTest2()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
mmap.add("a", "b");
assertFalse(mmap.isEmpty());
}
@Test
public void testIteratorTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
Iterator<Map.Entry<String, String>> result = mmap.iterator();
assertNotNull(result);
assertFalse(result.hasNext());
}
@Test
public void testIteratorTest2()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
mmap.add("a", "b");
Iterator<Map.Entry<String, String>> result = mmap.iterator();
assertNotNull(result);
assertTrue(result.hasNext());
}
@Test
public void testNamesTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
Set<String> result = mmap.names();
assertNotNull(result);
assertEquals(0, result.size());
}
@Test
public void testRemoveTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
CharSequence name = String.valueOf(new Object());
MultiMap result = mmap.remove(name);
assertNotNull(result);
assertTrue(result.isEmpty());
assertEquals(0, result.size());
}
@Test(expected = NullPointerException.class)
public void testRemoveNPE()
throws Exception {
new CaseInsensitiveHeaders().remove(null);
}
@Test
public void testRemoveTest2()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "1";
MultiMap result = mmap.remove(name);
assertNotNull(result);
assertTrue(result.isEmpty());
assertEquals(0, result.size());
}
@Test
public void testRemoveTest3()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "name";
MultiMap result = mmap.remove(name);
assertNotNull(result);
assertTrue(result.isEmpty());
assertEquals(0, result.size());
}
@Test
public void testRemoveTest4()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "name";
String value = "value";
mmap.add(name, value);
assertTrue(mmap.contains(name));
MultiMap result = mmap.remove(name);
assertFalse(result.contains(name));
}
@Test
public void testSetTest1()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("", "");
MultiMap result = mmap.setAll(headers);
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(1, result.size());
assertEquals(": \n", result.toString());
}
@Test
public void testSetTest2()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("", "");
headers.put("aaa", "bbb");
MultiMap result = mmap.setAll(headers);
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(2, result.size());
assertEquals(": \naaa: bbb\n", result.toString());
}
@Test
public void testSetTest3()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("aaa", "bbb");
MultiMap result = mmap.setAll(headers);
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(1, result.size());
assertEquals("aaa: bbb\n", result.toString());
}
@Test
public void testSetTest4()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
Map<String, String> headers = new HashMap<String, String>();
MultiMap result = mmap.setAll(headers);
assertNotNull(result);
assertTrue(result.isEmpty());
assertEquals(0, result.size());
assertEquals("", result.toString());
}
@Test
public void testSetTest5()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
MultiMap headers = new CaseInsensitiveHeaders();
MultiMap result = mmap.setAll(headers);
assertNotNull(result);
assertTrue(result.isEmpty());
assertEquals(0, result.size());
assertEquals("", result.toString());
}
@Test
public void testSetTest7()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
CharSequence name = "name";
CharSequence value = "value";
MultiMap result = mmap.set(name, value);
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(1, result.size());
assertEquals("name: value\n", result.toString());
}
@Test
public void testSetTest8()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
CharSequence name = "name";
ArrayList<CharSequence> values = new ArrayList<CharSequence>();
values.add("somevalue");
assertEquals("name: somevalue\n", mmap.set(name, values).toString());
}
@Test
public void testSetTest9()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "";
ArrayList<CharSequence> values = new ArrayList<CharSequence>();
values.add("somevalue");
assertEquals(": somevalue\n", mmap.set(name, values).toString());
}
@Test
public void testSetTest10()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "aaa";
ArrayList<CharSequence> values = new ArrayList<CharSequence>();
values.add("somevalue");
assertEquals("aaa: somevalue\n", mmap.set(name, values).toString());
}
@Test
public void testSetTest11()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "";
String strVal = "";
MultiMap result = mmap.set(name, strVal);
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(1, result.size());
assertEquals(": \n", result.toString());
}
@Test
public void testSetTest12()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "aaa";
String strVal = "bbb";
MultiMap result = mmap.set(name, strVal);
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(1, result.size());
assertEquals("aaa: bbb\n", result.toString());
}
@Test
public void testSetTest13()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "aaa";
String strVal = "";
MultiMap result = mmap.set(name, strVal);
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(1, result.size());
assertEquals("aaa: \n", result.toString());
}
@Test
public void testSetTest14()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "";
String strVal = "bbb";
MultiMap result = mmap.set(name, strVal);
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(1, result.size());
assertEquals(": bbb\n", result.toString());
}
@Test(expected = NullPointerException.class)
public void testSetIterableNPE()
throws Exception {
new CaseInsensitiveHeaders().set("name", (Iterable<String>) null);
}
@Test
public void testSetIterableEmpty()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "name";
List<String> values = new ArrayList<String>();
MultiMap result = mmap.set(name, values);
assertNotNull(result);
assertTrue(result.isEmpty());
assertEquals(0, result.size());
assertEquals("", result.toString());
}
@Test
public void testSetIterable()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
String name = "name";
List<String> values = new ArrayList<String>();
values.add("value1");
values.add(null);
MultiMap result = mmap.set(name, values);
assertNotNull(result);
assertFalse(result.isEmpty());
assertEquals(1, result.size());
assertEquals("name: value1\n", result.toString());
}
@Test
public void testSize()
throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
assertEquals(0, mmap.size());
mmap.add("header", "value");
assertEquals(1, mmap.size());
mmap.add("header2", "value2");
assertEquals(2, mmap.size());
mmap.add("header", "value3");
assertEquals(2, mmap.size());
}
@Test
public void testGetHashColl() {
MultiMap mm = new CaseInsensitiveHeaders();
String name1 = "!~AZ";
String name2 = "!~\u0080Y";
mm.add(name1, "value1");
mm.add(name2, "value2");
assertEquals(2, mm.size());
assertEquals("value1", mm.get(name1));
assertEquals("value2", mm.get(name2));
mm = new CaseInsensitiveHeaders();
name1 = "";
name2 = "\0";
mm.add(name1, "value1");
mm.add(name2, "value2");
assertEquals(2, mm.size());
assertEquals("value1", mm.get(name1));
assertEquals("value2", mm.get(name2));
mm = new CaseInsensitiveHeaders();
name1 = "AZa";
name2 = "\u0080YA";
mm.add(name1, "value1");
mm.add(name2, "value2");
assertEquals(2, mm.size());
assertEquals("value1", mm.get(name1));
assertEquals("value2", mm.get(name2));
mm = new CaseInsensitiveHeaders();
name1 = " !";
name2 = "? ";
assertTrue("hash error", hash(name1) == hash(name2));
mm.add(name1, "value1");
mm.add(name2, "value2");
assertEquals(2, mm.size());
assertEquals("value1", mm.get(name1));
assertEquals("value2", mm.get(name2));
mm = new CaseInsensitiveHeaders();
name1 = "\u0080a";
name2 = "Ab";
assertTrue("hash error", hash(name1) == hash(name2));
mm.add(name1, "value1");
mm.add(name2, "value2");
assertEquals(2, mm.size());
assertEquals("value1", mm.get(name1));
assertEquals("value2", mm.get(name2));
// same bucket, different hash
mm = new CaseInsensitiveHeaders();
name1 = "A";
name2 = "R";
assertTrue("hash error", index(hash(name1)) == index(hash(name2)));
mm.add(name1, "value1");
mm.add(name2, "value2");
assertEquals(2, mm.size());
assertEquals("value1", mm.get(name1));
assertEquals("value2", mm.get(name2));
}
@Test
public void testGetAllHashColl() {
MultiMap mm = new CaseInsensitiveHeaders();
String name1 = "AZ";
String name2 = "\u0080Y";
assertTrue("hash error", hash(name1) == hash(name2));
mm.add(name1, "value1");
mm.add(name2, "value2");
assertEquals(2, mm.size());
assertEquals("[value1]", mm.getAll(name1).toString());
assertEquals("[value2]", mm.getAll(name2).toString());
mm = new CaseInsensitiveHeaders();
name1 = "A";
name2 = "R";
assertTrue("hash error", index(hash(name1)) == index(hash(name2)));
mm.add(name1, "value1");
mm.add(name2, "value2");
assertEquals(2, mm.size());
assertEquals("[value1]", mm.getAll(name1).toString());
assertEquals("[value2]", mm.getAll(name2).toString());
}
@Test
public void testRemoveHashColl() {
MultiMap mm = new CaseInsensitiveHeaders();
String name1 = "AZ";
String name2 = "\u0080Y";
String name3 = "RZ";
assertTrue("hash error", hash(name1) == hash(name2));
mm.add(name1, "value1");
mm.add(name2, "value2");
mm.add(name3, "value3");
mm.add(name1, "value4");
mm.add(name2, "value5");
mm.add(name3, "value6");
assertEquals(3, mm.size());
mm.remove(name1);
mm.remove(name2);
assertEquals(1, mm.size());
mm = new CaseInsensitiveHeaders();
name1 = "A";
name2 = "R";
assertTrue("hash error", index(hash(name1)) == index(hash(name2)));
mm.add(name1, "value1");
mm.add(name2, "value2");
assertEquals(2, mm.size());
mm.remove(name1);
mm.remove(name2);
assertTrue("not empty", mm.isEmpty());
}
// hash function copied from method under test
private static int hash(String name) {
int h = 0;
for (int i = name.length() - 1; i >= 0; i--) {
char c = name.charAt(i);
if (c >= 'A' && c <= 'Z') {
c += 32;
}
h = 31 * h + c;
}
if (h > 0) {
return h;
} else if (h == Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
} else {
return -h;
}
}
private static int index(int hash) {
return hash % 17;
}
// construct a string with hash==MIN_VALUE
// to get coverage of the if in hash()
// we will calculate the representation of
// MAX_VALUE+1 in base31, which wraps around to
// MIN_VALUE in int representation
@Test
public void testHashMININT() {
CaseInsensitiveHeaders mm = new CaseInsensitiveHeaders();
String name1 = "";
long value = Integer.MAX_VALUE;
value++;
int base = 31;
long pow = 1;
while (value > pow * base) {
pow *= base;
}
while (pow != 0) {
long mul = value / pow;
name1 = ((char) mul) + name1;
value -= pow * mul;
pow /= base;
}
name1 = ((char) value) + name1;
mm.add(name1, "value");
assertEquals("value", mm.get(name1));
}
// we have to sort the string since a map doesn't do sorting
private String sortByLine(String str) {
String[] lines = str.split("\n");
Arrays.sort(lines);
StringBuilder sb = new StringBuilder();
for (String s:lines) {
sb.append(s);
sb.append("\n");
}
return sb.toString();
}
@Test
public void testToString() {
MultiMap mm = new CaseInsensitiveHeaders();
assertEquals("", mm.toString());
mm.add("Header1", "Value1");
assertEquals("Header1: Value1\n",
sortByLine(mm.toString()));
mm.add("Header2", "Value2");
assertEquals("Header1: Value1\n"
+ "Header2: Value2\n",
sortByLine(mm.toString()));
mm.add("Header1", "Value3");
assertEquals("Header1: Value1\n"
+ "Header1: Value3\n"
+ "Header2: Value2\n",
sortByLine(mm.toString()));
mm.remove("Header1");
assertEquals("Header2: Value2\n",
sortByLine(mm.toString()));
mm.set("Header2", "Value4");
assertEquals("Header2: Value4\n",
sortByLine(mm.toString()));
}
/*
* unit tests for public method in MapEntry
* (isn't actually used in the implementation)
*/
@Test
public void testMapEntrySetValue() throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
mmap.add("Header", "oldvalue");
for (Map.Entry<String, String> me:mmap) {
me.setValue("newvalue");
}
assertEquals("newvalue", mmap.get("Header"));
}
@Test
public void testMapEntryToString() throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
mmap.add("Header", "value");
assertEquals("Header: value", mmap.iterator().next().toString());
}
@Test(expected = NullPointerException.class)
public void testMapEntrySetValueNull() throws Exception {
MultiMap mmap = new CaseInsensitiveHeaders();
mmap.add("Header", "oldvalue");
for (Map.Entry<String, String> me:mmap) {
me.setValue(null);
}
}
}