@Test public void testGetVariantURIWithMissingRequestHeader() { final String theURI = "theURI"; final Header[] noHeaders = new Header[0]; final Header[] varyHeaders = { new BasicHeader("Vary", "Accept-Encoding") }; extractor = new CacheKeyGenerator() { @Override public String generateKey(final HttpHost h, final HttpRequest request) { Assert.assertSame(defaultHost, h); Assert.assertSame(mockRequest, request); return theURI; } }; when(mockEntry.hasVariants()).thenReturn(true); when(mockEntry.headerIterator("Vary")).thenReturn(new BasicHeaderIterator(varyHeaders, "Vary")); when(mockRequest.getHeaders("Accept-Encoding")) .thenReturn(noHeaders); final String result = extractor.generateKey(defaultHost, mockRequest, mockEntry); verify(mockEntry).hasVariants(); verify(mockEntry).headerIterator("Vary"); verify(mockRequest).getHeaders("Accept-Encoding"); Assert.assertEquals("{Accept-Encoding=}" + theURI, result); }
@Test public void testGetVariantURIWithSingleValueVaryHeaderPrepends() { final String theURI = "theURI"; final Header[] varyHeaders = { new BasicHeader("Vary", "Accept-Encoding") }; final Header[] encHeaders = { new BasicHeader("Accept-Encoding", "gzip") }; extractor = new CacheKeyGenerator() { @Override public String generateKey(final HttpHost h, final HttpRequest request) { Assert.assertSame(defaultHost, h); Assert.assertSame(mockRequest, request); return theURI; } }; when(mockEntry.hasVariants()).thenReturn(true); when(mockEntry.headerIterator("Vary")).thenReturn(new BasicHeaderIterator(varyHeaders, "Vary")); when(mockRequest.getHeaders("Accept-Encoding")).thenReturn(encHeaders); final String result = extractor.generateKey(defaultHost, mockRequest, mockEntry); verify(mockEntry).hasVariants(); verify(mockEntry).headerIterator("Vary"); verify(mockRequest).getHeaders("Accept-Encoding"); Assert.assertEquals("{Accept-Encoding=gzip}" + theURI, result); }
@Test public void testGetVariantURIAlphabetizesWithMultipleVaryingHeaders() { final String theURI = "theURI"; final Header[] varyHeaders = { new BasicHeader("Vary", "User-Agent, Accept-Encoding") }; final Header[] encHeaders = { new BasicHeader("Accept-Encoding", "gzip") }; final Header[] uaHeaders = { new BasicHeader("User-Agent", "browser") }; extractor = new CacheKeyGenerator() { @Override public String generateKey(final HttpHost h, final HttpRequest request) { Assert.assertSame(defaultHost, h); Assert.assertSame(mockRequest, request); return theURI; } }; when(mockEntry.hasVariants()).thenReturn(true); when(mockEntry.headerIterator("Vary")).thenReturn(new BasicHeaderIterator(varyHeaders, "Vary")); when(mockRequest.getHeaders("Accept-Encoding")).thenReturn(encHeaders); when(mockRequest.getHeaders("User-Agent")).thenReturn(uaHeaders); final String result = extractor.generateKey(defaultHost, mockRequest, mockEntry); verify(mockEntry).hasVariants(); verify(mockEntry).headerIterator("Vary"); verify(mockRequest).getHeaders("Accept-Encoding"); verify(mockRequest).getHeaders("User-Agent"); Assert.assertEquals("{Accept-Encoding=gzip&User-Agent=browser}" + theURI, result); }
@Test public void testGetVariantURIHandlesMultipleLineRequestHeaders() { final String theURI = "theURI"; final Header[] varyHeaders = { new BasicHeader("Vary", "User-Agent, Accept-Encoding") }; final Header[] encHeaders = { new BasicHeader("Accept-Encoding", "gzip"), new BasicHeader("Accept-Encoding", "deflate") }; final Header[] uaHeaders = { new BasicHeader("User-Agent", "browser") }; extractor = new CacheKeyGenerator() { @Override public String generateKey(final HttpHost h, final HttpRequest request) { Assert.assertSame(defaultHost, h); Assert.assertSame(mockRequest, request); return theURI; } }; when(mockEntry.hasVariants()).thenReturn(true); when(mockEntry.headerIterator("Vary")).thenReturn(new BasicHeaderIterator(varyHeaders, "Vary")); when(mockRequest.getHeaders("Accept-Encoding")).thenReturn(encHeaders); when(mockRequest.getHeaders("User-Agent")).thenReturn(uaHeaders); final String result = extractor.generateKey(defaultHost, mockRequest, mockEntry); verify(mockEntry).hasVariants(); verify(mockEntry).headerIterator("Vary"); verify(mockRequest).getHeaders("Accept-Encoding"); verify(mockRequest).getHeaders("User-Agent"); Assert.assertEquals("{Accept-Encoding=gzip%2C+deflate&User-Agent=browser}" + theURI, result); }
@Test public void testGetVariantURIHandlesMultipleVaryHeaders() { final String theURI = "theURI"; final Header[] varyHeaders = { new BasicHeader("Vary", "User-Agent"), new BasicHeader("Vary", "Accept-Encoding") }; final Header[] encHeaders = { new BasicHeader("Accept-Encoding", "gzip") }; final Header[] uaHeaders = { new BasicHeader("User-Agent", "browser") }; extractor = new CacheKeyGenerator() { @Override public String generateKey(final HttpHost h, final HttpRequest request) { Assert.assertSame(defaultHost, h); Assert.assertSame(mockRequest, request); return theURI; } }; when(mockEntry.hasVariants()).thenReturn(true); when(mockEntry.headerIterator("Vary")).thenReturn(new BasicHeaderIterator(varyHeaders, "Vary")); when(mockRequest.getHeaders("Accept-Encoding")).thenReturn(encHeaders); when(mockRequest.getHeaders("User-Agent")).thenReturn(uaHeaders); final String result = extractor.generateKey(defaultHost, mockRequest, mockEntry); verify(mockEntry).hasVariants(); verify(mockEntry).headerIterator("Vary"); verify(mockRequest).getHeaders("Accept-Encoding"); verify(mockRequest).getHeaders("User-Agent"); Assert.assertEquals("{Accept-Encoding=gzip&User-Agent=browser}" + theURI, result); }
@Test public void testInvalid() { Iterator<Header> hit = null; try { hit = new BasicHeaderIterator(null, "whatever"); Assert.fail("null headers not detected"); } catch (final IllegalArgumentException iax) { // expected } // this is not invalid hit = new BasicHeaderIterator(new Header[0], "whatever"); Assert.assertFalse(hit.hasNext()); // but this is try { hit.next(); Assert.fail("next beyond end not detected"); } catch (final NoSuchElementException nsx) { // expected } }
@Test public void testFringeCases() { final Header[] headers = new Header[]{ new BasicHeader("Name", null), new BasicHeader("Name", " "), new BasicHeader("Name", ",,,") }; final Iterator<HeaderElement> hei = new BasicHeaderElementIterator( new BasicHeaderIterator(headers, "Name")); Assert.assertFalse(hei.hasNext()); try { hei.next(); Assert.fail("NoSuchElementException should have been thrown"); } catch (final NoSuchElementException ex) { // expected } Assert.assertFalse(hei.hasNext()); try { hei.next(); Assert.fail("NoSuchElementException should have been thrown"); } catch (final NoSuchElementException ex) { // expected } }
@Test public void testEmpty() { final Header[] headers = new Header[]{ new BasicHeader("Name", " "), new BasicHeader("Name", ""), new BasicHeader("Name", ","), new BasicHeader("Name", " ,, "), }; Iterator<Header> hit = new BasicHeaderIterator(headers, null); Iterator<String> ti = new BasicTokenIterator(hit); Assert.assertFalse(ti.hasNext()); hit = new BasicHeaderIterator(headers, "empty"); ti = new BasicTokenIterator(hit); Assert.assertFalse(ti.hasNext()); }
@Test public void testSingleHeader() { Header[] headers = new Header[]{ new BasicHeader("Name", "token0,token1, token2 , token3") }; Iterator<Header> hit = new BasicHeaderIterator(headers, null); Iterator<String> ti = new BasicTokenIterator(hit); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token0", "token0", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token1", "token1", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token2", "token2", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token3", "token3", ti.next()); Assert.assertFalse(ti.hasNext()); headers = new Header[]{ new BasicHeader("Name", "token0") }; hit = new BasicHeaderIterator(headers, null); ti = new BasicTokenIterator(hit); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token0", "token0", ti.next()); Assert.assertFalse(ti.hasNext()); }
Iterator<Header> hit = new BasicHeaderIterator(headers, null); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next()); hit = new BasicHeaderIterator(headers, "match"); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next()); hit = new BasicHeaderIterator(headers, "single"); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("2", headers[2], hit.next()); hit = new BasicHeaderIterator(headers, "way-off"); Assert.assertFalse(hit.hasNext());
Iterator<Header> hit = new BasicHeaderIterator(headers, null); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next()); Assert.assertFalse(hit.hasNext()); hit = new BasicHeaderIterator(headers, null); Assert.assertTrue(hit.hasNext()); try {
Iterator<Header> hit = new BasicHeaderIterator(headers, null); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next()); hit = new BasicHeaderIterator(headers, "name"); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next());
new BasicHeaderIterator(headers, "Name"));
@Test public void testValueStart() { final Header[] headers = new Header[]{ new BasicHeader("Name", "token0"), new BasicHeader("Name", " token1"), new BasicHeader("Name", ",token2"), new BasicHeader("Name", " ,token3"), new BasicHeader("Name", ", token4"), new BasicHeader("Name", " , token5"), }; final Iterator<Header> hit = new BasicHeaderIterator(headers, null); final Iterator<String> ti = new BasicTokenIterator(hit); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token0", "token0", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token1", "token1", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token2", "token2", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token3", "token3", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token4", "token4", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token5", "token5", ti.next()); Assert.assertFalse(ti.hasNext()); }
@Test public void testValueEnd() { final Header[] headers = new Header[]{ new BasicHeader("Name", "token0"), new BasicHeader("Name", "token1 "), new BasicHeader("Name", "token2,"), new BasicHeader("Name", "token3 ,"), new BasicHeader("Name", "token4, "), new BasicHeader("Name", "token5 , "), }; final Iterator<Header> hit = new BasicHeaderIterator(headers, null); final Iterator<String> ti = new BasicTokenIterator(hit); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token0", "token0", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token1", "token1", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token2", "token2", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token3", "token3", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token4", "token4", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token5", "token5", ti.next()); Assert.assertFalse(ti.hasNext()); }
@Test public void testMultiHeader() { final Header[] headers = new Header[]{ new BasicHeader("Name", "token0,token1"), new BasicHeader("Name", ""), new BasicHeader("Name", "token2"), new BasicHeader("Name", " "), new BasicHeader("Name", "token3 "), new BasicHeader("Name", ","), new BasicHeader("Name", "token4"), }; final Iterator<Header> hit = new BasicHeaderIterator(headers, null); final Iterator<String> ti = new BasicTokenIterator(hit); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token0", "token0", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token1", "token1", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token2", "token2", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token3", "token3", ti.next()); Assert.assertTrue(ti.hasNext()); Assert.assertEquals("token4", "token4", ti.next()); Assert.assertFalse(ti.hasNext()); }
@Test public void testMultiHeaderSameLine() { final Header[] headers = new Header[]{ new BasicHeader("name", "value0,value1"), new BasicHeader("nAme", "cookie1=1,cookie2=2") }; final Iterator<HeaderElement> hei = new BasicHeaderElementIterator( new BasicHeaderIterator(headers, "Name")); HeaderElement elem = hei.next(); Assert.assertEquals("The two header values must be equal", "value0", elem.getName()); elem = hei.next(); Assert.assertEquals("The two header values must be equal", "value1", elem.getName()); elem = hei.next(); Assert.assertEquals("The two header values must be equal", "cookie1", elem.getName()); Assert.assertEquals("The two header values must be equal", "1", elem.getValue()); elem = hei.next(); Assert.assertEquals("The two header values must be equal", "cookie2", elem.getName()); Assert.assertEquals("The two header values must be equal", "2", elem.getValue()); }
Iterator<Header> hit = new BasicHeaderIterator(headers, null); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next()); hit = new BasicHeaderIterator(headers, "Yellow"); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("0", headers[0], hit.next()); hit = new BasicHeaderIterator(headers, "marOOn"); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("1", headers[1], hit.next()); hit = new BasicHeaderIterator(headers, "OranGe"); Assert.assertTrue(hit.hasNext()); Assert.assertEquals("2", headers[2], hit.next());
@Test public void testWrongPublic() { try { new BasicTokenIterator(null); Assert.fail("null argument not detected"); } catch (final IllegalArgumentException iax) { // expected } final Header[] headers = new Header[]{ new BasicHeader("Name", " "), new BasicHeader("Name", ""), new BasicHeader("Name", ","), new BasicHeader("Name", " ,, "), }; final Iterator<Header> hit = new BasicHeaderIterator(headers, null); final Iterator<String> ti = new BasicTokenIterator(hit); try { // call next() instead of next() to get that covered, too ti.next(); Assert.fail("next after end not detected"); } catch (final NoSuchElementException nsx) { // expected } try { ti.remove(); Assert.fail("unsupported remove not detected"); } catch (final UnsupportedOperationException uox) { // expected } }