summaryrefslogtreecommitdiffstats
path: root/simple/simple-common/src/test/java/org/simpleframework/common/KeyTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'simple/simple-common/src/test/java/org/simpleframework/common/KeyTest.java')
-rw-r--r--simple/simple-common/src/test/java/org/simpleframework/common/KeyTest.java195
1 files changed, 195 insertions, 0 deletions
diff --git a/simple/simple-common/src/test/java/org/simpleframework/common/KeyTest.java b/simple/simple-common/src/test/java/org/simpleframework/common/KeyTest.java
new file mode 100644
index 0000000..f9056fe
--- /dev/null
+++ b/simple/simple-common/src/test/java/org/simpleframework/common/KeyTest.java
@@ -0,0 +1,195 @@
+package org.simpleframework.common;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+/**
+ * Test for fast case insensitive mapping for headers that have been taken
+ * from the request HTTP header or added to the response HTTP header.
+ *
+ * @author Niall Gallagher
+ */
+public class KeyTest extends TestCase {
+
+ public class Index implements Name {
+
+ private final String value;
+
+ public Index(String value) {
+ this.value = value.toLowerCase();
+ }
+
+ public int hashCode() {
+ return value.hashCode();
+ }
+
+ public boolean equals(Object key) {
+ if(key instanceof Name) {
+ return key.equals(value);
+ }
+ if(key instanceof String) {
+ return key.equals(value);
+ }
+ return false;
+ }
+ }
+
+ public interface Name {
+
+ public int hashCode();
+ public boolean equals(Object value);
+ }
+
+ public class ArrayName implements Name {
+
+ private String cache;
+ private byte[] array;
+ private int off;
+ private int size;
+ private int hash;
+
+ public ArrayName(byte[] array) {
+ this(array, 0, array.length);
+ }
+
+ public ArrayName(byte[] array, int off, int size) {
+ this.array = array;
+ this.size = size;
+ this.off = off;
+ }
+
+ public boolean equals(Object value) {
+ if(value instanceof String) {
+ String text = value.toString();
+
+ return equals(text);
+ }
+ return false;
+ }
+
+ public boolean equals(String value) {
+ int length = value.length();
+
+ if(length != size) {
+ return false;
+ }
+ for(int i = 0; i < size; i++) {
+ int left = value.charAt(i);
+ int right = array[off + i];
+
+ if(right >= 'A' && right <= 'Z') {
+ right = (right - 'A') + 'a';
+ }
+ if(left != right) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public int hashCode() {
+ int code = hash;
+
+ if(code == 0) {
+ int pos = off;
+
+ for(int i = 0; i < size; i++) {
+ int next = array[pos++];
+
+ if(next >= 'A' && next <= 'Z') {
+ next = (next - 'A') + 'a';
+ }
+ code = 31*code + next;
+ }
+ hash = code;
+ }
+ return code;
+ }
+ }
+
+ public class StringName implements Name {
+
+ private final String value;
+ private final String key;
+
+ public StringName(String value) {
+ this.key = value.toLowerCase();
+ this.value = value;
+ }
+
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+ public boolean equals(Object value) {
+ return value.equals(key);
+ }
+ }
+
+ public class NameTable<T> {
+
+ private final Map<Name, T> map;
+
+ public NameTable() {
+ this.map = new HashMap<Name, T>();
+ }
+
+ public void put(Name key, T value) {
+ map.put(key, value);
+ }
+
+ public void put(String text, T value) {
+ Name key = new StringName(text);
+
+ map.put(key, value);
+ }
+
+ public T get(String key) {
+ Index index = new Index(key);
+
+ return map.get(index);
+ }
+
+ public T remove(String key) {
+ Index index = new Index(key);
+
+ return map.remove(index);
+ }
+ }
+
+ public void testName() {
+ Name contentLength = new ArrayName("Content-Length".getBytes());
+ Name contentType = new ArrayName("Content-Type".getBytes());
+ Name transferEncoding = new ArrayName("Transfer-Encoding".getBytes());
+ Name userAgent = new ArrayName("User-Agent".getBytes());
+ NameTable<String> map = new NameTable<String>();
+
+ assertEquals(contentLength.hashCode(), "Content-Length".toLowerCase().hashCode());
+ assertEquals(contentType.hashCode(), "Content-Type".toLowerCase().hashCode());
+ assertEquals(transferEncoding.hashCode(), "Transfer-Encoding".toLowerCase().hashCode());
+ assertEquals(userAgent.hashCode(), "User-Agent".toLowerCase().hashCode());
+
+ map.put(contentLength, "1024");
+ map.put(contentType, "text/html");
+ map.put(transferEncoding, "chunked");
+ map.put(userAgent, "Mozilla/4.0");
+ map.put("Date", "18/11/1977");
+ map.put("Accept", "text/plain, text/html, image/gif");
+
+ assertEquals(map.get("Content-Length"), "1024");
+ assertEquals(map.get("CONTENT-LENGTH"), "1024");
+ assertEquals(map.get("content-length"), "1024");
+ assertEquals(map.get("Content-length"), "1024");
+ assertEquals(map.get("Content-Type"), "text/html");
+ assertEquals(map.get("Transfer-Encoding"), "chunked");
+ assertEquals(map.get("USER-AGENT"), "Mozilla/4.0");
+ assertEquals(map.get("Accept"), "text/plain, text/html, image/gif");
+ assertEquals(map.get("ACCEPT"), "text/plain, text/html, image/gif");
+ assertEquals(map.get("accept"), "text/plain, text/html, image/gif");
+ assertEquals(map.get("DATE"), "18/11/1977");
+ assertEquals(map.get("Date"), "18/11/1977");
+ assertEquals(map.get("date"), "18/11/1977");
+ }
+}