Index: net/http2/hpack/decoder/hpack_block_collector.h |
diff --git a/net/http2/hpack/decoder/hpack_block_collector.h b/net/http2/hpack/decoder/hpack_block_collector.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2b283b9d53e499daf3c47f3878f89629bc1084f5 |
--- /dev/null |
+++ b/net/http2/hpack/decoder/hpack_block_collector.h |
@@ -0,0 +1,128 @@ |
+// 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. |
+ |
+#ifndef NET_HTTP2_HPACK_DECODER_HPACK_BLOCK_COLLECTOR_H_ |
+#define NET_HTTP2_HPACK_DECODER_HPACK_BLOCK_COLLECTOR_H_ |
+ |
+// HpackBlockCollector implements HpackEntryDecoderListener in order to record |
+// the calls using HpackEntryCollector instances (one per HPACK entry). This |
+// supports testing of HpackBlockDecoder, which decodes entire HPACK blocks. |
+// |
+// In addition to implementing the callback methods, HpackBlockCollector also |
+// supports comparing two HpackBlockCollector instances (i.e. an expected and |
+// an actual), or a sole HPACK entry against an expected value. |
+ |
+#include <stddef.h> |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "base/strings/string_piece.h" |
+#include "net/http2/hpack/decoder/hpack_entry_collector.h" |
+#include "net/http2/hpack/decoder/hpack_entry_decoder_listener.h" |
+#include "net/http2/hpack/http2_hpack_constants.h" |
+#include "net/http2/hpack/tools/hpack_block_builder.h" |
+ |
+namespace net { |
+namespace test { |
+ |
+class RandomBase; |
+ |
+class HpackBlockCollector : public HpackEntryDecoderListener { |
+ public: |
+ // Implementations of HpackEntryDecoderListener, forwarding to pending_entry_, |
+ // an HpackEntryCollector for the "in-progress" HPACK entry. OnIndexedHeader |
+ // and OnDynamicTableSizeUpdate are pending only for that one call, while |
+ // OnStartLiteralHeader is followed by many calls, ending with OnValueEnd. |
+ // Once all the calls for one HPACK entry have been received, PushPendingEntry |
+ // is used to append the pending_entry_ entry to the collected entries_. |
+ HpackBlockCollector(); |
+ HpackBlockCollector(const HpackBlockCollector& other); |
+ ~HpackBlockCollector() override; |
+ void OnIndexedHeader(size_t index) override; |
+ void OnDynamicTableSizeUpdate(size_t size) override; |
+ void OnStartLiteralHeader(HpackEntryType header_type, |
+ size_t maybe_name_index) override; |
+ void OnNameStart(bool huffman_encoded, size_t len) override; |
+ void OnNameData(const char* data, size_t len) override; |
+ void OnNameEnd() override; |
+ void OnValueStart(bool huffman_encoded, size_t len) override; |
+ void OnValueData(const char* data, size_t len) override; |
+ void OnValueEnd() override; |
+ |
+ // Methods for creating a set of expectations (i.e. HPACK entries to compare |
+ // against those collected by another instance of HpackBlockCollector). |
+ |
+ // Add an HPACK entry for an indexed header. |
+ void ExpectIndexedHeader(size_t index); |
+ |
+ // Add an HPACK entry for a dynamic table size update. |
+ void ExpectDynamicTableSizeUpdate(size_t size); |
+ |
+ // Add an HPACK entry for a header entry with an index for the name, and a |
+ // literal value. |
+ void ExpectNameIndexAndLiteralValue(HpackEntryType type, |
+ size_t index, |
+ bool value_huffman, |
+ const std::string& value); |
+ |
+ // Add an HPACK entry for a header entry with a literal name and value. |
+ void ExpectLiteralNameAndValue(HpackEntryType type, |
+ bool name_huffman, |
+ const std::string& name, |
+ bool value_huffman, |
+ const std::string& value); |
+ |
+ // Shuffle the entries, in support of generating an HPACK block of entries |
+ // in some random order. |
+ void ShuffleEntries(RandomBase* rng); |
+ |
+ // Serialize entries_ to the HpackBlockBuilder. |
+ void AppendToHpackBlockBuilder(HpackBlockBuilder* hbb) const; |
+ |
+ // Return AssertionSuccess if there is just one entry, and it is an |
+ // Indexed Header with the specified index. |
+ ::testing::AssertionResult ValidateSoleIndexedHeader(size_t ndx) const; |
+ |
+ // Return AssertionSuccess if there is just one entry, and it is a |
+ // Dynamic Table Size Update with the specified size. |
+ ::testing::AssertionResult ValidateSoleDynamicTableSizeUpdate( |
+ size_t size) const; |
+ |
+ // Return AssertionSuccess if there is just one entry, and it is a Header |
+ // entry with an index for the name and a literal value. |
+ ::testing::AssertionResult ValidateSoleLiteralValueHeader( |
+ HpackEntryType expected_type, |
+ size_t expected_index, |
+ bool expected_value_huffman, |
+ base::StringPiece expected_value) const; |
+ |
+ // Return AssertionSuccess if there is just one entry, and it is a Header |
+ // with a literal name and literal value. |
+ ::testing::AssertionResult ValidateSoleLiteralNameValueHeader( |
+ HpackEntryType expected_type, |
+ bool expected_name_huffman, |
+ base::StringPiece expected_name, |
+ bool expected_value_huffman, |
+ base::StringPiece expected_value) const; |
+ |
+ bool IsNotPending() const { return pending_entry_.IsClear(); } |
+ bool IsClear() const { return IsNotPending() && entries_.empty(); } |
+ void Clear(); |
+ |
+ ::testing::AssertionResult VerifyEq(const HpackBlockCollector& that) const; |
+ |
+ private: |
+ // Push the value of pending_entry_ onto entries_, and clear pending_entry_. |
+ // The pending_entry_ must be complete. |
+ void PushPendingEntry(); |
+ |
+ HpackEntryCollector pending_entry_; |
+ std::vector<HpackEntryCollector> entries_; |
+}; |
+ |
+} // namespace test |
+} // namespace net |
+ |
+#endif // NET_HTTP2_HPACK_DECODER_HPACK_BLOCK_COLLECTOR_H_ |