From 2f81364522f004afbce6895a22908512d1e9d169 Mon Sep 17 00:00:00 2001 From: Scott Mitchell Date: Sat, 7 Nov 2015 09:31:12 -0800 Subject: [PATCH] DefaultHttp2HeadersTest updates Motivation: Recently a bug was found in DefaultHttp2Headers where the state of the headers could be corrupted due to the extra tracking to make pseudo headers first during iteration. Unit tests did not catch this bug. Modifications: - Update unit tests to cover more methods Result: Unit tests for DefaultHttp2Headers have better code coverage. --- .../codec/http2/DefaultHttp2HeadersTest.java | 59 +++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java b/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java index eb187c9d4a..326cde1fe5 100644 --- a/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java +++ b/codec-http2/src/test/java/io/netty/handler/codec/http2/DefaultHttp2HeadersTest.java @@ -17,22 +17,21 @@ package io.netty.handler.codec.http2; import io.netty.handler.codec.http2.Http2Headers.PseudoHeaderName; -import io.netty.util.AsciiString; import org.junit.Test; import java.util.Map.Entry; +import static io.netty.util.AsciiString.of; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import static io.netty.util.AsciiString.of; public class DefaultHttp2HeadersTest { @Test - public void pseudoHeadersMustComeFirstWhenIterating() { + public void testPseudoHeadersMustComeFirstWhenIterating() { Http2Headers headers = newHeaders(); verifyPseudoHeadersFirst(headers); @@ -40,7 +39,7 @@ public class DefaultHttp2HeadersTest { } @Test - public void pseudoHeadersWithRemovePreservesPseudoIterationOrder() { + public void testPseudoHeadersWithRemovePreservesPseudoIterationOrder() { Http2Headers headers = newHeaders(); Http2Headers nonPseudoHeaders = new DefaultHttp2Headers(); @@ -68,6 +67,58 @@ public class DefaultHttp2HeadersTest { } } + @Test + public void testPseudoHeadersWithClearDoesNotLeak() { + Http2Headers headers = newHeaders(); + + assertFalse(headers.isEmpty()); + headers.clear(); + assertTrue(headers.isEmpty()); + + // Combine 2 headers together, make sure pseudo headers stay up front. + headers.add("name1", "value1").scheme("nothing"); + verifyPseudoHeadersFirst(headers); + + Http2Headers other = new DefaultHttp2Headers().add("name2", "value2").authority("foo"); + verifyPseudoHeadersFirst(other); + + headers.add(other); + verifyPseudoHeadersFirst(headers); + + // Make sure the headers are what we expect them to be, and no leaking behind the scenes. + assertEquals(4, headers.size()); + assertEquals("value1", headers.get("name1")); + assertEquals("value2", headers.get("name2")); + assertEquals("nothing", headers.scheme()); + assertEquals("foo", headers.authority()); + } + + @Test + public void testSetHeadersOrdersPsuedoHeadersCorrectly() { + Http2Headers headers = newHeaders(); + Http2Headers other = new DefaultHttp2Headers().add("name2", "value2").authority("foo"); + + headers.set(other); + verifyPseudoHeadersFirst(headers); + assertEquals(other.size(), headers.size()); + assertEquals("foo", headers.authority()); + assertEquals("value2", headers.get("name2")); + } + + @Test + public void testSetAllOrdersPsuedoHeadersCorrectly() { + Http2Headers headers = newHeaders(); + Http2Headers other = new DefaultHttp2Headers().add("name2", "value2").authority("foo"); + + int headersSizeBefore = headers.size(); + headers.setAll(other); + verifyPseudoHeadersFirst(headers); + verifyAllPseudoHeadersPresent(headers); + assertEquals(headersSizeBefore + 1, headers.size()); + assertEquals("foo", headers.authority()); + assertEquals("value2", headers.get("name2")); + } + @Test(expected = Http2Exception.class) public void testHeaderNameValidation() { Http2Headers headers = newHeaders();