Index: net/spdy/hpack/hpack_encoder_test.cc |
diff --git a/net/spdy/hpack/hpack_encoder_test.cc b/net/spdy/hpack/hpack_encoder_test.cc |
deleted file mode 100644 |
index 7623f0a4b9be7206b2176c1aba4166b1c26de68e..0000000000000000000000000000000000000000 |
--- a/net/spdy/hpack/hpack_encoder_test.cc |
+++ /dev/null |
@@ -1,587 +0,0 @@ |
-// Copyright 2014 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/spdy/hpack/hpack_encoder.h" |
- |
-#include <map> |
- |
-#include "base/rand_util.h" |
-#include "net/base/arena.h" |
-#include "net/spdy/hpack/hpack_huffman_table.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace net { |
- |
-using testing::ElementsAre; |
- |
-namespace test { |
- |
-class HpackHeaderTablePeer { |
- public: |
- explicit HpackHeaderTablePeer(HpackHeaderTable* table) : table_(table) {} |
- |
- HpackHeaderTable::EntryTable* dynamic_entries() { |
- return &table_->dynamic_entries_; |
- } |
- |
- private: |
- HpackHeaderTable* table_; |
-}; |
- |
-class HpackEncoderPeer { |
- public: |
- typedef HpackEncoder::Representation Representation; |
- typedef HpackEncoder::Representations Representations; |
- |
- explicit HpackEncoderPeer(HpackEncoder* encoder) : encoder_(encoder) {} |
- |
- bool compression_enabled() const { return encoder_->enable_compression_; } |
- HpackHeaderTable* table() { return &encoder_->header_table_; } |
- HpackHeaderTablePeer table_peer() { return HpackHeaderTablePeer(table()); } |
- const HpackHuffmanTable& huffman_table() const { |
- return encoder_->huffman_table_; |
- } |
- void EmitString(SpdyStringPiece str) { encoder_->EmitString(str); } |
- void TakeString(SpdyString* out) { encoder_->output_stream_.TakeString(out); } |
- static void CookieToCrumbs(SpdyStringPiece cookie, |
- std::vector<SpdyStringPiece>* out) { |
- Representations tmp; |
- HpackEncoder::CookieToCrumbs(std::make_pair("", cookie), &tmp); |
- |
- out->clear(); |
- for (size_t i = 0; i != tmp.size(); ++i) { |
- out->push_back(tmp[i].second); |
- } |
- } |
- static void DecomposeRepresentation(SpdyStringPiece value, |
- std::vector<SpdyStringPiece>* out) { |
- Representations tmp; |
- HpackEncoder::DecomposeRepresentation(std::make_pair("foobar", value), |
- &tmp); |
- |
- out->clear(); |
- for (size_t i = 0; i != tmp.size(); ++i) { |
- out->push_back(tmp[i].second); |
- } |
- } |
- |
- // TODO(dahollings): Remove or clean up these methods when deprecating |
- // non-incremental encoding path. |
- static bool EncodeHeaderSet(HpackEncoder* encoder, |
- const SpdyHeaderBlock& header_set, |
- SpdyString* output, |
- bool use_incremental) { |
- if (use_incremental) { |
- return EncodeIncremental(encoder, header_set, output); |
- } else { |
- return encoder->EncodeHeaderSet(header_set, output); |
- } |
- } |
- |
- static bool EncodeIncremental(HpackEncoder* encoder, |
- const SpdyHeaderBlock& header_set, |
- SpdyString* output) { |
- std::unique_ptr<HpackEncoder::ProgressiveEncoder> encoderator = |
- encoder->EncodeHeaderSet(header_set); |
- SpdyString output_buffer; |
- encoderator->Next(base::RandInt(0, 15), &output_buffer); |
- while (encoderator->HasNext()) { |
- SpdyString second_buffer; |
- encoderator->Next(base::RandInt(0, 15), &second_buffer); |
- output_buffer.append(second_buffer); |
- } |
- *output = std::move(output_buffer); |
- return true; |
- } |
- |
- private: |
- HpackEncoder* encoder_; |
-}; |
- |
-} // namespace test |
- |
-namespace { |
- |
-using std::map; |
-using testing::ElementsAre; |
-using testing::Pair; |
- |
-class HpackEncoderTest : public ::testing::TestWithParam<bool> { |
- protected: |
- typedef test::HpackEncoderPeer::Representations Representations; |
- |
- HpackEncoderTest() |
- : encoder_(ObtainHpackHuffmanTable()), |
- peer_(&encoder_), |
- static_(peer_.table()->GetByIndex(1)), |
- headers_storage_(1024 /* block size */) {} |
- |
- void SetUp() override { |
- use_incremental_ = GetParam(); |
- |
- // Populate dynamic entries into the table fixture. For simplicity each |
- // entry has name.size() + value.size() == 10. |
- key_1_ = peer_.table()->TryAddEntry("key1", "value1"); |
- key_2_ = peer_.table()->TryAddEntry("key2", "value2"); |
- cookie_a_ = peer_.table()->TryAddEntry("cookie", "a=bb"); |
- cookie_c_ = peer_.table()->TryAddEntry("cookie", "c=dd"); |
- |
- // No further insertions may occur without evictions. |
- peer_.table()->SetMaxSize(peer_.table()->size()); |
- } |
- |
- void SaveHeaders(SpdyStringPiece name, SpdyStringPiece value) { |
- SpdyStringPiece n(headers_storage_.Memdup(name.data(), name.size()), |
- name.size()); |
- SpdyStringPiece v(headers_storage_.Memdup(value.data(), value.size()), |
- value.size()); |
- headers_observed_.push_back(std::make_pair(n, v)); |
- } |
- |
- void ExpectIndex(size_t index) { |
- expected_.AppendPrefix(kIndexedOpcode); |
- expected_.AppendUint32(index); |
- } |
- void ExpectIndexedLiteral(const HpackEntry* key_entry, |
- SpdyStringPiece value) { |
- expected_.AppendPrefix(kLiteralIncrementalIndexOpcode); |
- expected_.AppendUint32(IndexOf(key_entry)); |
- ExpectString(&expected_, value); |
- } |
- void ExpectIndexedLiteral(SpdyStringPiece name, SpdyStringPiece value) { |
- expected_.AppendPrefix(kLiteralIncrementalIndexOpcode); |
- expected_.AppendUint32(0); |
- ExpectString(&expected_, name); |
- ExpectString(&expected_, value); |
- } |
- void ExpectNonIndexedLiteral(SpdyStringPiece name, SpdyStringPiece value) { |
- expected_.AppendPrefix(kLiteralNoIndexOpcode); |
- expected_.AppendUint32(0); |
- ExpectString(&expected_, name); |
- ExpectString(&expected_, value); |
- } |
- void ExpectString(HpackOutputStream* stream, SpdyStringPiece str) { |
- const HpackHuffmanTable& huffman_table = peer_.huffman_table(); |
- size_t encoded_size = peer_.compression_enabled() |
- ? huffman_table.EncodedSize(str) |
- : str.size(); |
- if (encoded_size < str.size()) { |
- expected_.AppendPrefix(kStringLiteralHuffmanEncoded); |
- expected_.AppendUint32(encoded_size); |
- huffman_table.EncodeString(str, stream); |
- } else { |
- expected_.AppendPrefix(kStringLiteralIdentityEncoded); |
- expected_.AppendUint32(str.size()); |
- expected_.AppendBytes(str); |
- } |
- } |
- void ExpectHeaderTableSizeUpdate(uint32_t size) { |
- expected_.AppendPrefix(kHeaderTableSizeUpdateOpcode); |
- expected_.AppendUint32(size); |
- } |
- void CompareWithExpectedEncoding(const SpdyHeaderBlock& header_set) { |
- SpdyString expected_out, actual_out; |
- expected_.TakeString(&expected_out); |
- EXPECT_TRUE(test::HpackEncoderPeer::EncodeHeaderSet( |
- &encoder_, header_set, &actual_out, use_incremental_)); |
- EXPECT_EQ(expected_out, actual_out); |
- } |
- size_t IndexOf(const HpackEntry* entry) { |
- return peer_.table()->IndexOf(entry); |
- } |
- |
- HpackEncoder encoder_; |
- test::HpackEncoderPeer peer_; |
- |
- const HpackEntry* static_; |
- const HpackEntry* key_1_; |
- const HpackEntry* key_2_; |
- const HpackEntry* cookie_a_; |
- const HpackEntry* cookie_c_; |
- |
- UnsafeArena headers_storage_; |
- std::vector<std::pair<SpdyStringPiece, SpdyStringPiece>> headers_observed_; |
- |
- HpackOutputStream expected_; |
- bool use_incremental_; |
-}; |
- |
-INSTANTIATE_TEST_CASE_P(HpackEncoderTests, HpackEncoderTest, ::testing::Bool()); |
- |
-TEST_P(HpackEncoderTest, SingleDynamicIndex) { |
- encoder_.SetHeaderListener( |
- [this](SpdyStringPiece name, SpdyStringPiece value) { |
- this->SaveHeaders(name, value); |
- }); |
- |
- ExpectIndex(IndexOf(key_2_)); |
- |
- SpdyHeaderBlock headers; |
- headers[key_2_->name().as_string()] = key_2_->value().as_string(); |
- CompareWithExpectedEncoding(headers); |
- EXPECT_THAT(headers_observed_, |
- ElementsAre(Pair(key_2_->name(), key_2_->value()))); |
-} |
- |
-TEST_P(HpackEncoderTest, SingleStaticIndex) { |
- ExpectIndex(IndexOf(static_)); |
- |
- SpdyHeaderBlock headers; |
- headers[static_->name().as_string()] = static_->value().as_string(); |
- CompareWithExpectedEncoding(headers); |
-} |
- |
-TEST_P(HpackEncoderTest, SingleStaticIndexTooLarge) { |
- peer_.table()->SetMaxSize(1); // Also evicts all fixtures. |
- ExpectIndex(IndexOf(static_)); |
- |
- SpdyHeaderBlock headers; |
- headers[static_->name().as_string()] = static_->value().as_string(); |
- CompareWithExpectedEncoding(headers); |
- |
- EXPECT_EQ(0u, peer_.table_peer().dynamic_entries()->size()); |
-} |
- |
-TEST_P(HpackEncoderTest, SingleLiteralWithIndexName) { |
- ExpectIndexedLiteral(key_2_, "value3"); |
- |
- SpdyHeaderBlock headers; |
- headers[key_2_->name().as_string()] = "value3"; |
- CompareWithExpectedEncoding(headers); |
- |
- // A new entry was inserted and added to the reference set. |
- HpackEntry* new_entry = &peer_.table_peer().dynamic_entries()->front(); |
- EXPECT_EQ(new_entry->name(), key_2_->name()); |
- EXPECT_EQ(new_entry->value(), "value3"); |
-} |
- |
-TEST_P(HpackEncoderTest, SingleLiteralWithLiteralName) { |
- ExpectIndexedLiteral("key3", "value3"); |
- |
- SpdyHeaderBlock headers; |
- headers["key3"] = "value3"; |
- CompareWithExpectedEncoding(headers); |
- |
- HpackEntry* new_entry = &peer_.table_peer().dynamic_entries()->front(); |
- EXPECT_EQ(new_entry->name(), "key3"); |
- EXPECT_EQ(new_entry->value(), "value3"); |
-} |
- |
-TEST_P(HpackEncoderTest, SingleLiteralTooLarge) { |
- peer_.table()->SetMaxSize(1); // Also evicts all fixtures. |
- |
- ExpectIndexedLiteral("key3", "value3"); |
- |
- // A header overflowing the header table is still emitted. |
- // The header table is empty. |
- SpdyHeaderBlock headers; |
- headers["key3"] = "value3"; |
- CompareWithExpectedEncoding(headers); |
- |
- EXPECT_EQ(0u, peer_.table_peer().dynamic_entries()->size()); |
-} |
- |
-TEST_P(HpackEncoderTest, EmitThanEvict) { |
- // |key_1_| is toggled and placed into the reference set, |
- // and then immediately evicted by "key3". |
- ExpectIndex(IndexOf(key_1_)); |
- ExpectIndexedLiteral("key3", "value3"); |
- |
- SpdyHeaderBlock headers; |
- headers[key_1_->name().as_string()] = key_1_->value().as_string(); |
- headers["key3"] = "value3"; |
- CompareWithExpectedEncoding(headers); |
-} |
- |
-TEST_P(HpackEncoderTest, CookieHeaderIsCrumbled) { |
- ExpectIndex(IndexOf(cookie_a_)); |
- ExpectIndex(IndexOf(cookie_c_)); |
- ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "e=ff"); |
- |
- SpdyHeaderBlock headers; |
- headers["cookie"] = "a=bb; c=dd; e=ff"; |
- CompareWithExpectedEncoding(headers); |
-} |
- |
-TEST_P(HpackEncoderTest, StringsDynamicallySelectHuffmanCoding) { |
- // Compactable string. Uses Huffman coding. |
- peer_.EmitString("feedbeef"); |
- expected_.AppendPrefix(kStringLiteralHuffmanEncoded); |
- expected_.AppendUint32(6); |
- expected_.AppendBytes("\x94\xA5\x92\x32\x96_"); |
- |
- // Non-compactable. Uses identity coding. |
- peer_.EmitString("@@@@@@"); |
- expected_.AppendPrefix(kStringLiteralIdentityEncoded); |
- expected_.AppendUint32(6); |
- expected_.AppendBytes("@@@@@@"); |
- |
- SpdyString expected_out, actual_out; |
- expected_.TakeString(&expected_out); |
- peer_.TakeString(&actual_out); |
- EXPECT_EQ(expected_out, actual_out); |
-} |
- |
-TEST_P(HpackEncoderTest, EncodingWithoutCompression) { |
- encoder_.SetHeaderListener( |
- [this](SpdyStringPiece name, SpdyStringPiece value) { |
- this->SaveHeaders(name, value); |
- }); |
- encoder_.DisableCompression(); |
- |
- ExpectNonIndexedLiteral(":path", "/index.html"); |
- ExpectNonIndexedLiteral("cookie", "foo=bar"); |
- ExpectNonIndexedLiteral("cookie", "baz=bing"); |
- ExpectNonIndexedLiteral("hello", "goodbye"); |
- |
- SpdyHeaderBlock headers; |
- headers[":path"] = "/index.html"; |
- headers["cookie"] = "foo=bar; baz=bing"; |
- headers["hello"] = "goodbye"; |
- |
- CompareWithExpectedEncoding(headers); |
- |
- EXPECT_THAT( |
- headers_observed_, |
- ElementsAre(Pair(":path", "/index.html"), Pair("cookie", "foo=bar"), |
- Pair("cookie", "baz=bing"), Pair("hello", "goodbye"))); |
-} |
- |
-TEST_P(HpackEncoderTest, MultipleEncodingPasses) { |
- encoder_.SetHeaderListener( |
- [this](SpdyStringPiece name, SpdyStringPiece value) { |
- this->SaveHeaders(name, value); |
- }); |
- |
- // Pass 1. |
- { |
- SpdyHeaderBlock headers; |
- headers["key1"] = "value1"; |
- headers["cookie"] = "a=bb"; |
- |
- ExpectIndex(IndexOf(key_1_)); |
- ExpectIndex(IndexOf(cookie_a_)); |
- CompareWithExpectedEncoding(headers); |
- } |
- // Header table is: |
- // 65: key1: value1 |
- // 64: key2: value2 |
- // 63: cookie: a=bb |
- // 62: cookie: c=dd |
- // Pass 2. |
- { |
- SpdyHeaderBlock headers; |
- headers["key2"] = "value2"; |
- headers["cookie"] = "c=dd; e=ff"; |
- |
- // "key2: value2" |
- ExpectIndex(64); |
- // "cookie: c=dd" |
- ExpectIndex(62); |
- // This cookie evicts |key1| from the dynamic table. |
- ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "e=ff"); |
- |
- CompareWithExpectedEncoding(headers); |
- } |
- // Header table is: |
- // 65: key2: value2 |
- // 64: cookie: a=bb |
- // 63: cookie: c=dd |
- // 62: cookie: e=ff |
- // Pass 3. |
- { |
- SpdyHeaderBlock headers; |
- headers["key2"] = "value2"; |
- headers["cookie"] = "a=bb; b=cc; c=dd"; |
- |
- // "key2: value2" |
- ExpectIndex(65); |
- // "cookie: a=bb" |
- ExpectIndex(64); |
- // This cookie evicts |key2| from the dynamic table. |
- ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "b=cc"); |
- // "cookie: c=dd" |
- ExpectIndex(64); |
- |
- CompareWithExpectedEncoding(headers); |
- } |
- |
- // clang-format off |
- EXPECT_THAT(headers_observed_, |
- ElementsAre(Pair("key1", "value1"), |
- Pair("cookie", "a=bb"), |
- Pair("key2", "value2"), |
- Pair("cookie", "c=dd"), |
- Pair("cookie", "e=ff"), |
- Pair("key2", "value2"), |
- Pair("cookie", "a=bb"), |
- Pair("cookie", "b=cc"), |
- Pair("cookie", "c=dd"))); |
- // clang-format on |
-} |
- |
-TEST_P(HpackEncoderTest, PseudoHeadersFirst) { |
- SpdyHeaderBlock headers; |
- // A pseudo-header that should not be indexed. |
- headers[":path"] = "/spam/eggs.html"; |
- // A pseudo-header to be indexed. |
- headers[":authority"] = "www.example.com"; |
- // A regular header which precedes ":" alphabetically, should still be encoded |
- // after pseudo-headers. |
- headers["-foo"] = "bar"; |
- headers["foo"] = "bar"; |
- headers["cookie"] = "c=dd"; |
- |
- // Headers are indexed in the order in which they were added. |
- // This entry pushes "cookie: a=bb" back to 63. |
- ExpectNonIndexedLiteral(":path", "/spam/eggs.html"); |
- ExpectIndexedLiteral(peer_.table()->GetByName(":authority"), |
- "www.example.com"); |
- ExpectIndexedLiteral("-foo", "bar"); |
- ExpectIndexedLiteral("foo", "bar"); |
- ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "c=dd"); |
- CompareWithExpectedEncoding(headers); |
-} |
- |
-TEST_P(HpackEncoderTest, CookieToCrumbs) { |
- test::HpackEncoderPeer peer(NULL); |
- std::vector<SpdyStringPiece> out; |
- |
- // Leading and trailing whitespace is consumed. A space after ';' is consumed. |
- // All other spaces remain. ';' at beginning and end of string produce empty |
- // crumbs. |
- // See section 8.1.3.4 "Compressing the Cookie Header Field" in the HTTP/2 |
- // specification at http://tools.ietf.org/html/draft-ietf-httpbis-http2-11 |
- peer.CookieToCrumbs(" foo=1;bar=2 ; bar=3; bing=4; ", &out); |
- EXPECT_THAT(out, ElementsAre("foo=1", "bar=2 ", "bar=3", " bing=4", "")); |
- |
- peer.CookieToCrumbs(";;foo = bar ;; ;baz =bing", &out); |
- EXPECT_THAT(out, ElementsAre("", "", "foo = bar ", "", "", "baz =bing")); |
- |
- peer.CookieToCrumbs("baz=bing; foo=bar; baz=bing", &out); |
- EXPECT_THAT(out, ElementsAre("baz=bing", "foo=bar", "baz=bing")); |
- |
- peer.CookieToCrumbs("baz=bing", &out); |
- EXPECT_THAT(out, ElementsAre("baz=bing")); |
- |
- peer.CookieToCrumbs("", &out); |
- EXPECT_THAT(out, ElementsAre("")); |
- |
- peer.CookieToCrumbs("foo;bar; baz;baz;bing;", &out); |
- EXPECT_THAT(out, ElementsAre("foo", "bar", "baz", "baz", "bing", "")); |
- |
- peer.CookieToCrumbs(" \t foo=1;bar=2 ; bar=3;\t ", &out); |
- EXPECT_THAT(out, ElementsAre("foo=1", "bar=2 ", "bar=3", "")); |
- |
- peer.CookieToCrumbs(" \t foo=1;bar=2 ; bar=3 \t ", &out); |
- EXPECT_THAT(out, ElementsAre("foo=1", "bar=2 ", "bar=3")); |
-} |
- |
-TEST_P(HpackEncoderTest, DecomposeRepresentation) { |
- test::HpackEncoderPeer peer(NULL); |
- std::vector<SpdyStringPiece> out; |
- |
- peer.DecomposeRepresentation("", &out); |
- EXPECT_THAT(out, ElementsAre("")); |
- |
- peer.DecomposeRepresentation("foobar", &out); |
- EXPECT_THAT(out, ElementsAre("foobar")); |
- |
- peer.DecomposeRepresentation(SpdyStringPiece("foo\0bar", 7), &out); |
- EXPECT_THAT(out, ElementsAre("foo", "bar")); |
- |
- peer.DecomposeRepresentation(SpdyStringPiece("\0foo\0bar", 8), &out); |
- EXPECT_THAT(out, ElementsAre("", "foo", "bar")); |
- |
- peer.DecomposeRepresentation(SpdyStringPiece("foo\0bar\0", 8), &out); |
- EXPECT_THAT(out, ElementsAre("foo", "bar", "")); |
- |
- peer.DecomposeRepresentation(SpdyStringPiece("\0foo\0bar\0", 9), &out); |
- EXPECT_THAT(out, ElementsAre("", "foo", "bar", "")); |
-} |
- |
-// Test that encoded headers do not have \0-delimited multiple values, as this |
-// became disallowed in HTTP/2 draft-14. |
-TEST_P(HpackEncoderTest, CrumbleNullByteDelimitedValue) { |
- SpdyHeaderBlock headers; |
- // A header field to be crumbled: "spam: foo\0bar". |
- headers["spam"] = SpdyString("foo\0bar", 7); |
- |
- ExpectIndexedLiteral("spam", "foo"); |
- expected_.AppendPrefix(kLiteralIncrementalIndexOpcode); |
- expected_.AppendUint32(62); |
- expected_.AppendPrefix(kStringLiteralIdentityEncoded); |
- expected_.AppendUint32(3); |
- expected_.AppendBytes("bar"); |
- CompareWithExpectedEncoding(headers); |
-} |
- |
-TEST_P(HpackEncoderTest, HeaderTableSizeUpdate) { |
- encoder_.ApplyHeaderTableSizeSetting(1024); |
- ExpectHeaderTableSizeUpdate(1024); |
- ExpectIndexedLiteral("key3", "value3"); |
- |
- SpdyHeaderBlock headers; |
- headers["key3"] = "value3"; |
- CompareWithExpectedEncoding(headers); |
- |
- HpackEntry* new_entry = &peer_.table_peer().dynamic_entries()->front(); |
- EXPECT_EQ(new_entry->name(), "key3"); |
- EXPECT_EQ(new_entry->value(), "value3"); |
-} |
- |
-TEST_P(HpackEncoderTest, HeaderTableSizeUpdateWithMin) { |
- const size_t starting_size = peer_.table()->settings_size_bound(); |
- encoder_.ApplyHeaderTableSizeSetting(starting_size - 2); |
- encoder_.ApplyHeaderTableSizeSetting(starting_size - 1); |
- // We must encode the low watermark, so the peer knows to evict entries |
- // if necessary. |
- ExpectHeaderTableSizeUpdate(starting_size - 2); |
- ExpectHeaderTableSizeUpdate(starting_size - 1); |
- ExpectIndexedLiteral("key3", "value3"); |
- |
- SpdyHeaderBlock headers; |
- headers["key3"] = "value3"; |
- CompareWithExpectedEncoding(headers); |
- |
- HpackEntry* new_entry = &peer_.table_peer().dynamic_entries()->front(); |
- EXPECT_EQ(new_entry->name(), "key3"); |
- EXPECT_EQ(new_entry->value(), "value3"); |
-} |
- |
-TEST_P(HpackEncoderTest, HeaderTableSizeUpdateWithExistingSize) { |
- encoder_.ApplyHeaderTableSizeSetting(peer_.table()->settings_size_bound()); |
- // No encoded size update. |
- ExpectIndexedLiteral("key3", "value3"); |
- |
- SpdyHeaderBlock headers; |
- headers["key3"] = "value3"; |
- CompareWithExpectedEncoding(headers); |
- |
- HpackEntry* new_entry = &peer_.table_peer().dynamic_entries()->front(); |
- EXPECT_EQ(new_entry->name(), "key3"); |
- EXPECT_EQ(new_entry->value(), "value3"); |
-} |
- |
-TEST_P(HpackEncoderTest, HeaderTableSizeUpdatesWithGreaterSize) { |
- const size_t starting_size = peer_.table()->settings_size_bound(); |
- encoder_.ApplyHeaderTableSizeSetting(starting_size + 1); |
- encoder_.ApplyHeaderTableSizeSetting(starting_size + 2); |
- // Only a single size update to the final size. |
- ExpectHeaderTableSizeUpdate(starting_size + 2); |
- ExpectIndexedLiteral("key3", "value3"); |
- |
- SpdyHeaderBlock headers; |
- headers["key3"] = "value3"; |
- CompareWithExpectedEncoding(headers); |
- |
- HpackEntry* new_entry = &peer_.table_peer().dynamic_entries()->front(); |
- EXPECT_EQ(new_entry->name(), "key3"); |
- EXPECT_EQ(new_entry->value(), "value3"); |
-} |
- |
-} // namespace |
- |
-} // namespace net |