| Index: net/http2/hpack/decoder/hpack_entry_type_decoder_test.cc
|
| diff --git a/net/http2/hpack/decoder/hpack_entry_type_decoder_test.cc b/net/http2/hpack/decoder/hpack_entry_type_decoder_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0abf0c980a64114618d9d6215f49dda363937323
|
| --- /dev/null
|
| +++ b/net/http2/hpack/decoder/hpack_entry_type_decoder_test.cc
|
| @@ -0,0 +1,98 @@
|
| +// Copyright 2016 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 "net/http2/hpack/decoder/hpack_entry_type_decoder.h"
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| +#include "base/logging.h"
|
| +#include "net/http2/hpack/tools/hpack_block_builder.h"
|
| +#include "net/http2/tools/failure.h"
|
| +#include "net/http2/tools/random_decoder_test.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using ::testing::AssertionFailure;
|
| +using ::testing::AssertionResult;
|
| +using ::testing::AssertionSuccess;
|
| +
|
| +namespace net {
|
| +namespace test {
|
| +namespace {
|
| +const bool kReturnNonZeroOnFirst = true;
|
| +
|
| +class HpackEntryTypeDecoderTest : public RandomDecoderTest {
|
| + public:
|
| + AssertionResult ValidatorForDynamicTableSizeUpdate(uint32_t size) {
|
| + VERIFY_EQ(HpackEntryType::kDynamicTableSizeUpdate, decoder_.entry_type());
|
| + VERIFY_EQ(size, decoder_.varint());
|
| + return AssertionSuccess();
|
| + }
|
| +
|
| + AssertionResult ValidatorForHeaderWithIndex(const HpackEntryType entry_type,
|
| + uint32_t index) {
|
| + VERIFY_EQ(entry_type, decoder_.entry_type());
|
| + VERIFY_EQ(index, decoder_.varint());
|
| + return AssertionSuccess();
|
| + }
|
| +
|
| + protected:
|
| + DecodeStatus StartDecoding(DecodeBuffer* b) override {
|
| + CHECK_LT(0u, b->Remaining());
|
| + return decoder_.Start(b);
|
| + }
|
| +
|
| + DecodeStatus ResumeDecoding(DecodeBuffer* b) override {
|
| + return decoder_.Resume(b);
|
| + }
|
| +
|
| + HpackEntryTypeDecoder decoder_;
|
| +};
|
| +
|
| +TEST_F(HpackEntryTypeDecoderTest, DynamicTableSizeUpdate) {
|
| + for (uint32_t size = 0; size < 1000 * 1000; size += 256) {
|
| + HpackBlockBuilder bb;
|
| + bb.AppendDynamicTableSizeUpdate(size);
|
| + DecodeBuffer db(bb.buffer());
|
| + NoArgValidator validator = base::Bind(
|
| + &HpackEntryTypeDecoderTest::ValidatorForDynamicTableSizeUpdate,
|
| + base::Unretained(this), size);
|
| + EXPECT_TRUE(DecodeAndValidateSeveralWays(&db, kReturnNonZeroOnFirst,
|
| + ValidateDoneAndEmpty(validator)))
|
| + << "\nentry_type=kDynamicTableSizeUpdate, size=" << size;
|
| + // Run the validator again to make sure that DecodeAndValidateSeveralWays
|
| + // did the right thing.
|
| + EXPECT_TRUE(validator.Run());
|
| + }
|
| +}
|
| +
|
| +TEST_F(HpackEntryTypeDecoderTest, HeaderWithIndex) {
|
| + std::vector<HpackEntryType> entry_types = {
|
| + HpackEntryType::kIndexedHeader, HpackEntryType::kIndexedLiteralHeader,
|
| + HpackEntryType::kUnindexedLiteralHeader,
|
| + HpackEntryType::kNeverIndexedLiteralHeader,
|
| + };
|
| + for (const HpackEntryType entry_type : entry_types) {
|
| + const uint32_t first = entry_type == HpackEntryType::kIndexedHeader ? 1 : 0;
|
| + for (uint32_t index = first; index < 1000; ++index) {
|
| + HpackBlockBuilder bb;
|
| + bb.AppendEntryTypeAndVarint(entry_type, index);
|
| + DecodeBuffer db(bb.buffer());
|
| + NoArgValidator validator =
|
| + base::Bind(&HpackEntryTypeDecoderTest::ValidatorForHeaderWithIndex,
|
| + base::Unretained(this), entry_type, index);
|
| + EXPECT_TRUE(DecodeAndValidateSeveralWays(&db, kReturnNonZeroOnFirst,
|
| + ValidateDoneAndEmpty(validator)))
|
| + << "\nentry_type=" << entry_type << ", index=" << index;
|
| + // Run the validator again to make sure that DecodeAndValidateSeveralWays
|
| + // did the right thing.
|
| + EXPECT_TRUE(validator.Run());
|
| + }
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace test
|
| +} // namespace net
|
|
|