package test.codec.http2.model; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.nio.ByteBuffer; import org.junit.Test; import com.firefly.codec.http2.model.HttpField; import com.firefly.codec.http2.model.HttpHeader; import com.firefly.codec.http2.model.HttpVersion; import com.firefly.codec.http2.model.PreEncodedHttpField; import com.firefly.utils.io.BufferUtils; public class TestHttpField { @Test public void testContainsSimple() throws Exception { HttpField field = new HttpField("name", "SomeValue"); assertTrue(field.contains("somevalue")); assertTrue(field.contains("sOmEvAlUe")); assertTrue(field.contains("SomeValue")); assertFalse(field.contains("other")); assertFalse(field.contains("some")); assertFalse(field.contains("Some")); assertFalse(field.contains("value")); assertFalse(field.contains("v")); assertFalse(field.contains("")); assertFalse(field.contains(null)); field = new HttpField(HttpHeader.CONNECTION, "Upgrade, HTTP2-Settings"); assertTrue(field.contains("Upgrade")); assertTrue(field.contains("HTTP2-Settings")); } @Test public void testCaseInsensitiveHashcode_KnownField() throws Exception { HttpField fieldFoo1 = new HttpField("Cookie", "foo"); HttpField fieldFoo2 = new HttpField("cookie", "foo"); assertThat("Field hashcodes are case insensitive", fieldFoo1.hashCode(), is(fieldFoo2.hashCode())); } @Test public void testCaseInsensitiveHashcode_UnknownField() throws Exception { HttpField fieldFoo1 = new HttpField("X-Foo", "bar"); HttpField fieldFoo2 = new HttpField("x-foo", "bar"); assertThat("Field hashcodes are case insensitive", fieldFoo1.hashCode(), is(fieldFoo2.hashCode())); } @Test public void testContainsList() throws Exception { HttpField field = new HttpField("name", ",aaa,Bbb,CCC, ddd , e e, \"\\\"f,f\\\"\", "); assertTrue(field.contains("aaa")); assertTrue(field.contains("bbb")); assertTrue(field.contains("ccc")); assertTrue(field.contains("Aaa")); assertTrue(field.contains("Bbb")); assertTrue(field.contains("Ccc")); assertTrue(field.contains("AAA")); assertTrue(field.contains("BBB")); assertTrue(field.contains("CCC")); assertTrue(field.contains("ddd")); assertTrue(field.contains("e e")); assertTrue(field.contains("\"f,f\"")); assertFalse(field.contains("")); assertFalse(field.contains("aa")); assertFalse(field.contains("bb")); assertFalse(field.contains("cc")); assertFalse(field.contains(null)); } @Test public void testQualityContainsList() throws Exception { HttpField field; field = new HttpField("name", "yes"); assertTrue(field.contains("yes")); assertFalse(field.contains("no")); field = new HttpField("name", ",yes,"); assertTrue(field.contains("yes")); assertFalse(field.contains("no")); field = new HttpField("name", "other,yes,other"); assertTrue(field.contains("yes")); assertFalse(field.contains("no")); field = new HttpField("name", "other, yes ,other"); assertTrue(field.contains("yes")); assertFalse(field.contains("no")); field = new HttpField("name", "other, y s ,other"); assertTrue(field.contains("y s")); assertFalse(field.contains("no")); field = new HttpField("name", "other, \"yes\" ,other"); assertTrue(field.contains("yes")); assertFalse(field.contains("no")); field = new HttpField("name", "other, \"\\\"yes\\\"\" ,other"); assertTrue(field.contains("\"yes\"")); assertFalse(field.contains("no")); field = new HttpField("name", ";no,yes,;no"); assertTrue(field.contains("yes")); assertFalse(field.contains("no")); field = new HttpField("name", "no;q=0,yes;q=1,no; q = 0"); assertTrue(field.contains("yes")); assertFalse(field.contains("no")); field = new HttpField("name", "no;q=0.0000,yes;q=0.0001,no; q = 0.00000"); assertTrue(field.contains("yes")); assertFalse(field.contains("no")); field = new HttpField("name", "no;q=0.0000,Yes;Q=0.0001,no; Q = 0.00000"); assertTrue(field.contains("yes")); assertFalse(field.contains("no")); } @Test public void testValues() { String[] values = new HttpField("name", "value").getValues(); assertEquals(1, values.length); assertEquals("value", values[0]); values = new HttpField("name", "a,b,c").getValues(); assertEquals(3, values.length); assertEquals("a", values[0]); assertEquals("b", values[1]); assertEquals("c", values[2]); values = new HttpField("name", "a,\"x,y,z\",c").getValues(); assertEquals(3, values.length); assertEquals("a", values[0]); assertEquals("x,y,z", values[1]); assertEquals("c", values[2]); values = new HttpField("name", "a,\"x,\\\"p,q\\\",z\",c").getValues(); assertEquals(3, values.length); assertEquals("a", values[0]); assertEquals("x,\"p,q\",z", values[1]); assertEquals("c", values[2]); } @Test public void testCachedField() { PreEncodedHttpField field = new PreEncodedHttpField(HttpHeader.ACCEPT, "something"); ByteBuffer buf = BufferUtils.allocate(256); BufferUtils.clearToFill(buf); field.putTo(buf, HttpVersion.HTTP_1_0); BufferUtils.flipToFlush(buf, 0); String s = BufferUtils.toString(buf); assertEquals("Accept: something\r\n", s); } }