| Index: net/http2/hpack/decoder/hpack_block_collector.cc
|
| diff --git a/net/http2/hpack/decoder/hpack_block_collector.cc b/net/http2/hpack/decoder/hpack_block_collector.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..94f58ee408a383183bb5475fbbb95209fdbd1ddb
|
| --- /dev/null
|
| +++ b/net/http2/hpack/decoder/hpack_block_collector.cc
|
| @@ -0,0 +1,154 @@
|
| +// 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_block_collector.h"
|
| +
|
| +#include <algorithm>
|
| +#include <memory>
|
| +
|
| +#include "base/logging.h"
|
| +#include "net/http2/tools/failure.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using ::testing::AssertionResult;
|
| +using ::testing::AssertionSuccess;
|
| +using std::string;
|
| +
|
| +using base::StringPiece;
|
| +
|
| +namespace net {
|
| +namespace test {
|
| +
|
| +HpackBlockCollector::HpackBlockCollector() {}
|
| +HpackBlockCollector::HpackBlockCollector(const HpackBlockCollector& other)
|
| + : pending_entry_(other.pending_entry_), entries_(other.entries_) {}
|
| +HpackBlockCollector::~HpackBlockCollector() {}
|
| +
|
| +void HpackBlockCollector::OnIndexedHeader(size_t index) {
|
| + pending_entry_.OnIndexedHeader(index);
|
| + PushPendingEntry();
|
| +}
|
| +void HpackBlockCollector::OnDynamicTableSizeUpdate(size_t size) {
|
| + pending_entry_.OnDynamicTableSizeUpdate(size);
|
| + PushPendingEntry();
|
| +}
|
| +void HpackBlockCollector::OnStartLiteralHeader(HpackEntryType header_type,
|
| + size_t maybe_name_index) {
|
| + pending_entry_.OnStartLiteralHeader(header_type, maybe_name_index);
|
| +}
|
| +void HpackBlockCollector::OnNameStart(bool huffman_encoded, size_t len) {
|
| + pending_entry_.OnNameStart(huffman_encoded, len);
|
| +}
|
| +void HpackBlockCollector::OnNameData(const char* data, size_t len) {
|
| + pending_entry_.OnNameData(data, len);
|
| +}
|
| +void HpackBlockCollector::OnNameEnd() {
|
| + pending_entry_.OnNameEnd();
|
| +}
|
| +void HpackBlockCollector::OnValueStart(bool huffman_encoded, size_t len) {
|
| + pending_entry_.OnValueStart(huffman_encoded, len);
|
| +}
|
| +void HpackBlockCollector::OnValueData(const char* data, size_t len) {
|
| + pending_entry_.OnValueData(data, len);
|
| +}
|
| +void HpackBlockCollector::OnValueEnd() {
|
| + pending_entry_.OnValueEnd();
|
| + PushPendingEntry();
|
| +}
|
| +
|
| +void HpackBlockCollector::PushPendingEntry() {
|
| + EXPECT_TRUE(pending_entry_.IsComplete());
|
| + DVLOG(2) << "PushPendingEntry: " << pending_entry_;
|
| + entries_.push_back(pending_entry_);
|
| + EXPECT_TRUE(entries_.back().IsComplete());
|
| + pending_entry_.Clear();
|
| +}
|
| +void HpackBlockCollector::Clear() {
|
| + pending_entry_.Clear();
|
| + entries_.clear();
|
| +}
|
| +
|
| +void HpackBlockCollector::ExpectIndexedHeader(size_t index) {
|
| + entries_.push_back(
|
| + HpackEntryCollector(HpackEntryType::kIndexedHeader, index));
|
| +}
|
| +void HpackBlockCollector::ExpectDynamicTableSizeUpdate(size_t size) {
|
| + entries_.push_back(
|
| + HpackEntryCollector(HpackEntryType::kDynamicTableSizeUpdate, size));
|
| +}
|
| +void HpackBlockCollector::ExpectNameIndexAndLiteralValue(HpackEntryType type,
|
| + size_t index,
|
| + bool value_huffman,
|
| + const string& value) {
|
| + entries_.push_back(HpackEntryCollector(type, index, value_huffman, value));
|
| +}
|
| +void HpackBlockCollector::ExpectLiteralNameAndValue(HpackEntryType type,
|
| + bool name_huffman,
|
| + const string& name,
|
| + bool value_huffman,
|
| + const string& value) {
|
| + entries_.push_back(
|
| + HpackEntryCollector(type, name_huffman, name, value_huffman, value));
|
| +}
|
| +
|
| +void HpackBlockCollector::ShuffleEntries(RandomBase* rng) {
|
| + std::random_shuffle(entries_.begin(), entries_.end());
|
| +}
|
| +
|
| +void HpackBlockCollector::AppendToHpackBlockBuilder(
|
| + HpackBlockBuilder* hbb) const {
|
| + CHECK(IsNotPending());
|
| + for (const auto& entry : entries_) {
|
| + entry.AppendToHpackBlockBuilder(hbb);
|
| + }
|
| +}
|
| +
|
| +AssertionResult HpackBlockCollector::ValidateSoleIndexedHeader(
|
| + size_t ndx) const {
|
| + VERIFY_TRUE(pending_entry_.IsClear());
|
| + VERIFY_EQ(1u, entries_.size());
|
| + VERIFY_TRUE(entries_.front().ValidateIndexedHeader(ndx));
|
| + return AssertionSuccess();
|
| +}
|
| +AssertionResult HpackBlockCollector::ValidateSoleLiteralValueHeader(
|
| + HpackEntryType expected_type,
|
| + size_t expected_index,
|
| + bool expected_value_huffman,
|
| + StringPiece expected_value) const {
|
| + VERIFY_TRUE(pending_entry_.IsClear());
|
| + VERIFY_EQ(1u, entries_.size());
|
| + VERIFY_TRUE(entries_.front().ValidateLiteralValueHeader(
|
| + expected_type, expected_index, expected_value_huffman, expected_value));
|
| + return AssertionSuccess();
|
| +}
|
| +AssertionResult HpackBlockCollector::ValidateSoleLiteralNameValueHeader(
|
| + HpackEntryType expected_type,
|
| + bool expected_name_huffman,
|
| + StringPiece expected_name,
|
| + bool expected_value_huffman,
|
| + StringPiece expected_value) const {
|
| + VERIFY_TRUE(pending_entry_.IsClear());
|
| + VERIFY_EQ(1u, entries_.size());
|
| + VERIFY_TRUE(entries_.front().ValidateLiteralNameValueHeader(
|
| + expected_type, expected_name_huffman, expected_name,
|
| + expected_value_huffman, expected_value));
|
| + return AssertionSuccess();
|
| +}
|
| +AssertionResult HpackBlockCollector::ValidateSoleDynamicTableSizeUpdate(
|
| + size_t size) const {
|
| + VERIFY_TRUE(pending_entry_.IsClear());
|
| + VERIFY_EQ(1u, entries_.size());
|
| + VERIFY_TRUE(entries_.front().ValidateDynamicTableSizeUpdate(size));
|
| + return AssertionSuccess();
|
| +}
|
| +
|
| +AssertionResult HpackBlockCollector::VerifyEq(
|
| + const HpackBlockCollector& that) const {
|
| + VERIFY_EQ(pending_entry_, that.pending_entry_);
|
| + VERIFY_EQ(entries_, that.entries_);
|
| + return AssertionSuccess();
|
| +}
|
| +
|
| +} // namespace test
|
| +} // namespace net
|
|
|