// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "quiche/http2/hpack/decoder/hpack_decoder.h" // Tests of HpackDecoder. #include <string> #include <tuple> #include <utility> #include <vector> #include "quiche/http2/decoder/decode_buffer.h" #include "quiche/http2/hpack/decoder/hpack_decoder_listener.h" #include "quiche/http2/hpack/decoder/hpack_decoder_state.h" #include "quiche/http2/hpack/decoder/hpack_decoder_tables.h" #include "quiche/http2/hpack/http2_hpack_constants.h" #include "quiche/http2/http2_constants.h" #include "quiche/http2/test_tools/hpack_block_builder.h" #include "quiche/http2/test_tools/hpack_example.h" #include "quiche/http2/test_tools/http2_random.h" #include "quiche/http2/test_tools/random_util.h" #include "quiche/http2/test_tools/verify_macros.h" #include "quiche/common/platform/api/quiche_logging.h" #include "quiche/common/platform/api/quiche_test.h" AssertionResult; AssertionSuccess; ElementsAreArray; Eq; namespace http2 { namespace test { class HpackDecoderStatePeer { … }; class HpackDecoderPeer { … }; namespace { HpackHeaderEntry; HpackHeaderEntries; // TODO(jamessynge): Create a ...test_utils.h file with the mock listener // and with VerifyDynamicTableContents. class MockHpackDecoderListener : public HpackDecoderListener { … }; class HpackDecoderTest : public quiche::test::QuicheTestWithParam<bool>, public HpackDecoderListener { … }; INSTANTIATE_TEST_SUITE_P(…); // Test based on RFC 7541, section C.3: Request Examples without Huffman Coding. // This section shows several consecutive header lists, corresponding to HTTP // requests, on the same connection. // http://httpwg.org/specs/rfc7541.html#rfc.section.C.3 TEST_P(HpackDecoderTest, C3_RequestExamples) { … } // Test based on RFC 7541, section C.4 Request Examples with Huffman Coding. // This section shows the same examples as the previous section but uses // Huffman encoding for the literal values. // http://httpwg.org/specs/rfc7541.html#rfc.section.C.4 TEST_P(HpackDecoderTest, C4_RequestExamplesWithHuffmanEncoding) { … } // Test based on RFC 7541, section C.5: Response Examples without Huffman // Coding. This section shows several consecutive header lists, corresponding // to HTTP responses, on the same connection. The HTTP/2 setting parameter // SETTINGS_HEADER_TABLE_SIZE is set to the value of 256 octets, causing // some evictions to occur. // http://httpwg.org/specs/rfc7541.html#rfc.section.C.5 TEST_P(HpackDecoderTest, C5_ResponseExamples) { … } // Test based on RFC 7541, section C.6: Response Examples with Huffman Coding. // This section shows the same examples as the previous section but uses Huffman // encoding for the literal values. The HTTP/2 setting parameter // SETTINGS_HEADER_TABLE_SIZE is set to the value of 256 octets, causing some // evictions to occur. The eviction mechanism uses the length of the decoded // literal values, so the same evictions occur as in the previous section. // http://httpwg.org/specs/rfc7541.html#rfc.section.C.6 TEST_P(HpackDecoderTest, C6_ResponseExamplesWithHuffmanEncoding) { … } // Confirm that the table size can be changed, but at most twice. TEST_P(HpackDecoderTest, ProcessesOptionalTableSizeUpdates) { … } // Confirm that the table size can be changed when required, but at most twice. TEST_P(HpackDecoderTest, ProcessesRequiredTableSizeUpdate) { … } // Confirm that required size updates are validated. TEST_P(HpackDecoderTest, InvalidRequiredSizeUpdate) { … } // Confirm that required size updates are indeed required before the end. TEST_P(HpackDecoderTest, RequiredTableSizeChangeBeforeEnd) { … } // Confirm that required size updates are indeed required before an // indexed header. TEST_P(HpackDecoderTest, RequiredTableSizeChangeBeforeIndexedHeader) { … } // Confirm that required size updates are indeed required before an indexed // header name. // TODO(jamessynge): Move some of these to hpack_decoder_state_test.cc. TEST_P(HpackDecoderTest, RequiredTableSizeChangeBeforeIndexedHeaderName) { … } // Confirm that required size updates are indeed required before a literal // header name. TEST_P(HpackDecoderTest, RequiredTableSizeChangeBeforeLiteralName) { … } // Confirm that an excessively long varint is detected, in this case an // index of 127, but with lots of additional high-order 0 bits provided, // too many to be allowed. TEST_P(HpackDecoderTest, InvalidIndexedHeaderVarint) { … } // Confirm that an invalid index into the tables is detected, in this case an // index of 0. TEST_P(HpackDecoderTest, InvalidIndex) { … } // Confirm that EndDecodingBlock detects a truncated HPACK block. TEST_P(HpackDecoderTest, TruncatedBlock) { … } // Confirm that an oversized string is detected, ending decoding. TEST_P(HpackDecoderTest, OversizeStringDetected) { … } } // namespace } // namespace test } // namespace http2