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 |