/* * JBoss, Home of Professional Open Source. * Copyright 2014 Red Hat, Inc., and individual contributors * as indicated by the @author tags. * * 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 io.undertow.util; import io.undertow.testutils.category.UnitTest; import org.junit.Test; import org.junit.experimental.categories.Category; import java.util.Arrays; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; /** * @author <a href="mailto:david.lloyd@redhat.com">David M. Lloyd</a> */ @Category(UnitTest.class) public final class HeaderMapTestCase { private static final List<HttpString> HTTP_STRING_LIST = Arrays.asList(Headers.CONNECTION, Headers.HOST, Headers.UPGRADE, Headers.CONTENT_MD5, Headers.KEEP_ALIVE, Headers.RESPONSE_AUTH, Headers.CONTENT_DISPOSITION, Headers.DEFLATE, Headers.NEGOTIATE, Headers.USER_AGENT, Headers.REFERER, Headers.TRANSFER_ENCODING, Headers.FROM); @Test public void testInitial() { final HeaderMap headerMap = new HeaderMap(); assertEquals(0, headerMap.size()); assertEquals(-1L, headerMap.fastIterate()); assertFalse(headerMap.iterator().hasNext()); } @Test public void testSimple() { final HeaderMap headerMap = new HeaderMap(); headerMap.add(Headers.HOST, "yay.undertow.io"); assertTrue(headerMap.contains(Headers.HOST)); assertTrue(headerMap.contains("host")); assertEquals(1, headerMap.size()); assertNotEquals(-1L, headerMap.fastIterate()); assertEquals(-1L, headerMap.fiNext(headerMap.fastIterate())); assertEquals(Headers.HOST, headerMap.fiCurrent(headerMap.fastIterate()).getHeaderName()); assertEquals("yay.undertow.io", headerMap.getFirst(Headers.HOST)); assertEquals("yay.undertow.io", headerMap.getLast(Headers.HOST)); assertEquals("yay.undertow.io", headerMap.get(Headers.HOST, 0)); headerMap.remove("host"); assertEquals(0, headerMap.size()); } @Test public void testGrowing() { final HeaderMap headerMap = new HeaderMap(); for (HttpString item : HTTP_STRING_LIST) { for (int i = 0; i < (item.hashCode() & 7) + 1; i ++) headerMap.add(item, "Test value"); } for (HttpString item : HTTP_STRING_LIST) { assertTrue(String.format("Missing %s (hash %08x)", item, Integer.valueOf(item.hashCode())), headerMap.contains(item)); assertNotNull(headerMap.get(item)); assertEquals((item.hashCode() & 7) + 1, headerMap.get(item).size()); assertEquals("Test value", headerMap.getFirst(item)); assertEquals("Test value", headerMap.getLast(item)); } assertEquals(HTTP_STRING_LIST.size(), headerMap.size()); for (HttpString item : HTTP_STRING_LIST) { assertTrue(headerMap.contains(item)); assertNotNull(headerMap.remove(item)); assertFalse(headerMap.contains(item)); } assertEquals(0, headerMap.size()); } @Test public void testCollision() { HeaderMap headerMap = new HeaderMap(); headerMap.put(new HttpString("Link"), "a"); headerMap.put(new HttpString("Rest"), "b"); assertEquals("a", headerMap.getFirst(new HttpString("Link"))); assertEquals("b", headerMap.getFirst(new HttpString("Rest"))); assertEquals("a", headerMap.getFirst("Link")); assertEquals("b", headerMap.getFirst("Rest")); } }