Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: net/spdy/hpack_header_table_test.cc

Issue 290003006: Land recent SPDY changes (through 67282679) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase on nullptr => NULL Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/hpack_header_table.cc ('k') | net/spdy/mock_spdy_framer_visitor.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/spdy/hpack_header_table.h" 5 #include "net/spdy/hpack_header_table.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 16 matching lines...) Expand all
27 public: 27 public:
28 explicit HpackHeaderTablePeer(HpackHeaderTable* table) 28 explicit HpackHeaderTablePeer(HpackHeaderTable* table)
29 : table_(table) {} 29 : table_(table) {}
30 30
31 const HpackHeaderTable::EntryTable& dynamic_entries() { 31 const HpackHeaderTable::EntryTable& dynamic_entries() {
32 return table_->dynamic_entries_; 32 return table_->dynamic_entries_;
33 } 33 }
34 const HpackHeaderTable::EntryTable& static_entries() { 34 const HpackHeaderTable::EntryTable& static_entries() {
35 return table_->static_entries_; 35 return table_->static_entries_;
36 } 36 }
37 const HpackEntry::OrderedSet& index() { 37 const HpackHeaderTable::OrderedEntrySet& index() {
38 return table_->index_; 38 return table_->index_;
39 } 39 }
40 std::vector<HpackEntry*> EvictionSet(StringPiece name, StringPiece value) { 40 std::vector<HpackEntry*> EvictionSet(StringPiece name, StringPiece value) {
41 HpackHeaderTable::EntryTable::iterator begin, end; 41 HpackHeaderTable::EntryTable::iterator begin, end;
42 table_->EvictionSet(name, value, &begin, &end); 42 table_->EvictionSet(name, value, &begin, &end);
43 std::vector<HpackEntry*> result; 43 std::vector<HpackEntry*> result;
44 for (; begin != end; ++begin) { 44 for (; begin != end; ++begin) {
45 result.push_back(&(*begin)); 45 result.push_back(&(*begin));
46 } 46 }
47 return result; 47 return result;
48 } 48 }
49 size_t total_insertions() { 49 size_t total_insertions() {
50 return table_->total_insertions_; 50 return table_->total_insertions_;
51 } 51 }
52 size_t dynamic_entries_count() { 52 size_t dynamic_entries_count() {
53 return table_->dynamic_entries_count_; 53 return table_->dynamic_entries_.size();
54 } 54 }
55 size_t EvictionCountForEntry(StringPiece name, StringPiece value) { 55 size_t EvictionCountForEntry(StringPiece name, StringPiece value) {
56 return table_->EvictionCountForEntry(name, value); 56 return table_->EvictionCountForEntry(name, value);
57 } 57 }
58 size_t EvictionCountToReclaim(size_t reclaim_size) { 58 size_t EvictionCountToReclaim(size_t reclaim_size) {
59 return table_->EvictionCountToReclaim(reclaim_size); 59 return table_->EvictionCountToReclaim(reclaim_size);
60 } 60 }
61 void Evict(size_t count) { 61 void Evict(size_t count) {
62 return table_->Evict(count); 62 return table_->Evict(count);
63 } 63 }
64 64
65 void AddStaticEntry(StringPiece name, StringPiece value) {
66 table_->static_entries_.push_back(
67 HpackEntry(name, value, true, table_->total_insertions_++));
68 }
69
70 void AddDynamicEntry(StringPiece name, StringPiece value) {
71 table_->dynamic_entries_.push_back(
72 HpackEntry(name, value, false, table_->total_insertions_++));
73 }
74
65 private: 75 private:
66 HpackHeaderTable* table_; 76 HpackHeaderTable* table_;
67 }; 77 };
68 78
69 } // namespace test 79 } // namespace test
70 80
71 namespace { 81 namespace {
72 82
73 class HpackHeaderTableTest : public ::testing::Test { 83 class HpackHeaderTableTest : public ::testing::Test {
74 protected: 84 protected:
75 typedef std::vector<HpackEntry> HpackEntryVector; 85 typedef std::vector<HpackEntry> HpackEntryVector;
76 86
77 HpackHeaderTableTest() 87 HpackHeaderTableTest()
78 : table_(), 88 : table_(),
79 peer_(&table_) {} 89 peer_(&table_),
90 name_("header-name"),
91 value_("header value") {}
80 92
81 // Returns an entry whose Size() is equal to the given one. 93 // Returns an entry whose Size() is equal to the given one.
82 static HpackEntry MakeEntryOfSize(uint32 size) { 94 static HpackEntry MakeEntryOfSize(uint32 size) {
83 EXPECT_GE(size, HpackEntry::kSizeOverhead); 95 EXPECT_GE(size, HpackEntry::kSizeOverhead);
84 string name((size - HpackEntry::kSizeOverhead) / 2, 'n'); 96 string name((size - HpackEntry::kSizeOverhead) / 2, 'n');
85 string value(size - HpackEntry::kSizeOverhead - name.size(), 'v'); 97 string value(size - HpackEntry::kSizeOverhead - name.size(), 'v');
86 HpackEntry entry(name, value); 98 HpackEntry entry(name, value);
87 EXPECT_EQ(size, entry.Size()); 99 EXPECT_EQ(size, entry.Size());
88 return entry; 100 return entry;
89 } 101 }
(...skipping 26 matching lines...) Expand all
116 128
117 HpackEntry* entry = table_.TryAddEntry(it->name(), it->value()); 129 HpackEntry* entry = table_.TryAddEntry(it->name(), it->value());
118 EXPECT_NE(entry, static_cast<HpackEntry*>(NULL)); 130 EXPECT_NE(entry, static_cast<HpackEntry*>(NULL));
119 } 131 }
120 132
121 for (size_t i = 0; i != entries.size(); ++i) { 133 for (size_t i = 0; i != entries.size(); ++i) {
122 size_t index = entries.size() - i; 134 size_t index = entries.size() - i;
123 HpackEntry* entry = table_.GetByIndex(index); 135 HpackEntry* entry = table_.GetByIndex(index);
124 EXPECT_EQ(entries[i].name(), entry->name()); 136 EXPECT_EQ(entries[i].name(), entry->name());
125 EXPECT_EQ(entries[i].value(), entry->value()); 137 EXPECT_EQ(entries[i].value(), entry->value());
126 EXPECT_EQ(index, entry->Index()); 138 EXPECT_EQ(index, table_.IndexOf(entry));
127 } 139 }
128 } 140 }
129 141
142 HpackEntry StaticEntry() {
143 peer_.AddStaticEntry(name_, value_);
144 return peer_.static_entries().back();
145 }
146 HpackEntry DynamicEntry() {
147 peer_.AddDynamicEntry(name_, value_);
148 return peer_.dynamic_entries().back();
149 }
150
130 HpackHeaderTable table_; 151 HpackHeaderTable table_;
131 test::HpackHeaderTablePeer peer_; 152 test::HpackHeaderTablePeer peer_;
153 string name_, value_;
132 }; 154 };
133 155
134 TEST_F(HpackHeaderTableTest, StaticTableInitialization) { 156 TEST_F(HpackHeaderTableTest, StaticTableInitialization) {
135 EXPECT_EQ(0u, table_.size()); 157 EXPECT_EQ(0u, table_.size());
136 EXPECT_EQ(kDefaultHeaderTableSizeSetting, table_.max_size()); 158 EXPECT_EQ(kDefaultHeaderTableSizeSetting, table_.max_size());
137 EXPECT_EQ(kDefaultHeaderTableSizeSetting, table_.settings_size_bound()); 159 EXPECT_EQ(kDefaultHeaderTableSizeSetting, table_.settings_size_bound());
138 160
139 EXPECT_EQ(0u, peer_.dynamic_entries_count()); 161 EXPECT_EQ(0u, peer_.dynamic_entries_count());
140 EXPECT_EQ(0u, table_.reference_set().size()); 162 EXPECT_EQ(0u, table_.reference_set().size());
141 EXPECT_EQ(peer_.static_entries().size(), peer_.total_insertions()); 163 EXPECT_EQ(peer_.static_entries().size(), peer_.total_insertions());
142 164
143 // Static entries have been populated and inserted into the table & index. 165 // Static entries have been populated and inserted into the table & index.
144 EXPECT_NE(0u, peer_.static_entries().size()); 166 EXPECT_NE(0u, peer_.static_entries().size());
145 EXPECT_EQ(peer_.index().size(), peer_.static_entries().size()); 167 EXPECT_EQ(peer_.index().size(), peer_.static_entries().size());
146 for (size_t i = 0; i != peer_.static_entries().size(); ++i) { 168 for (size_t i = 0; i != peer_.static_entries().size(); ++i) {
147 const HpackEntry* entry = &peer_.static_entries()[i]; 169 const HpackEntry* entry = &peer_.static_entries()[i];
148 170
149 EXPECT_TRUE(entry->IsStatic()); 171 EXPECT_TRUE(entry->IsStatic());
150 EXPECT_EQ(entry, table_.GetByIndex(i + 1)); 172 EXPECT_EQ(entry, table_.GetByIndex(i + 1));
151 EXPECT_EQ(entry, table_.GetByNameAndValue(entry->name(), entry->value())); 173 EXPECT_EQ(entry, table_.GetByNameAndValue(entry->name(), entry->value()));
152 } 174 }
153 } 175 }
154 176
155 TEST_F(HpackHeaderTableTest, BasicDynamicEntryInsertionAndEviction) { 177 TEST_F(HpackHeaderTableTest, BasicDynamicEntryInsertionAndEviction) {
156 size_t static_count = peer_.total_insertions(); 178 size_t static_count = peer_.total_insertions();
157 HpackEntry* first_static_entry = table_.GetByIndex(1); 179 HpackEntry* first_static_entry = table_.GetByIndex(1);
158 180
159 EXPECT_EQ(1u, first_static_entry->Index()); 181 EXPECT_EQ(1u, table_.IndexOf(first_static_entry));
160 182
161 HpackEntry* entry = table_.TryAddEntry("header-key", "Header Value"); 183 HpackEntry* entry = table_.TryAddEntry("header-key", "Header Value");
162 EXPECT_EQ("header-key", entry->name()); 184 EXPECT_EQ("header-key", entry->name());
163 EXPECT_EQ("Header Value", entry->value()); 185 EXPECT_EQ("Header Value", entry->value());
164 EXPECT_FALSE(entry->IsStatic()); 186 EXPECT_FALSE(entry->IsStatic());
165 187
166 // Table counts were updated appropriately. 188 // Table counts were updated appropriately.
167 EXPECT_EQ(entry->Size(), table_.size()); 189 EXPECT_EQ(entry->Size(), table_.size());
168 EXPECT_EQ(1u, peer_.dynamic_entries_count()); 190 EXPECT_EQ(1u, peer_.dynamic_entries_count());
169 EXPECT_EQ(peer_.dynamic_entries().size(), peer_.dynamic_entries_count()); 191 EXPECT_EQ(peer_.dynamic_entries().size(), peer_.dynamic_entries_count());
170 EXPECT_EQ(static_count + 1, peer_.total_insertions()); 192 EXPECT_EQ(static_count + 1, peer_.total_insertions());
171 EXPECT_EQ(static_count + 1, peer_.index().size()); 193 EXPECT_EQ(static_count + 1, peer_.index().size());
172 194
173 // Index() of entries reflects the insertion. 195 // Index() of entries reflects the insertion.
174 EXPECT_EQ(1u, entry->Index()); 196 EXPECT_EQ(1u, table_.IndexOf(entry));
175 EXPECT_EQ(2u, first_static_entry->Index()); 197 EXPECT_EQ(2u, table_.IndexOf(first_static_entry));
176 EXPECT_EQ(entry, table_.GetByIndex(1)); 198 EXPECT_EQ(entry, table_.GetByIndex(1));
177 EXPECT_EQ(first_static_entry, table_.GetByIndex(2)); 199 EXPECT_EQ(first_static_entry, table_.GetByIndex(2));
178 200
179 // Evict |entry|. Table counts are again updated appropriately. 201 // Evict |entry|. Table counts are again updated appropriately.
180 peer_.Evict(1); 202 peer_.Evict(1);
181 EXPECT_EQ(0u, table_.size()); 203 EXPECT_EQ(0u, table_.size());
182 EXPECT_EQ(0u, peer_.dynamic_entries_count()); 204 EXPECT_EQ(0u, peer_.dynamic_entries_count());
183 EXPECT_EQ(peer_.dynamic_entries().size(), peer_.dynamic_entries_count()); 205 EXPECT_EQ(peer_.dynamic_entries().size(), peer_.dynamic_entries_count());
184 EXPECT_EQ(static_count + 1, peer_.total_insertions()); 206 EXPECT_EQ(static_count + 1, peer_.total_insertions());
185 EXPECT_EQ(static_count, peer_.index().size()); 207 EXPECT_EQ(static_count, peer_.index().size());
186 208
187 // Index() of |first_static_entry| reflects the eviction. 209 // Index() of |first_static_entry| reflects the eviction.
188 EXPECT_EQ(1u, first_static_entry->Index()); 210 EXPECT_EQ(1u, table_.IndexOf(first_static_entry));
189 EXPECT_EQ(first_static_entry, table_.GetByIndex(1)); 211 EXPECT_EQ(first_static_entry, table_.GetByIndex(1));
190 } 212 }
191 213
192 TEST_F(HpackHeaderTableTest, EntryIndexing) { 214 TEST_F(HpackHeaderTableTest, EntryIndexing) {
193 HpackEntry* first_static_entry = table_.GetByIndex(1); 215 HpackEntry* first_static_entry = table_.GetByIndex(1);
194 216
195 // Static entries are queryable by name & value. 217 // Static entries are queryable by name & value.
196 EXPECT_EQ(first_static_entry, table_.GetByName(first_static_entry->name())); 218 EXPECT_EQ(first_static_entry, table_.GetByName(first_static_entry->name()));
197 EXPECT_EQ(first_static_entry, table_.GetByNameAndValue( 219 EXPECT_EQ(first_static_entry, table_.GetByNameAndValue(
198 first_static_entry->name(), first_static_entry->value())); 220 first_static_entry->name(), first_static_entry->value()));
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 HpackEntry* survivor_entry = table_.GetByIndex(1); 428 HpackEntry* survivor_entry = table_.GetByIndex(1);
407 HpackEntry long_entry = 429 HpackEntry long_entry =
408 MakeEntryOfSize(table_.max_size() - survivor_entry->Size()); 430 MakeEntryOfSize(table_.max_size() - survivor_entry->Size());
409 431
410 // All entries but the first are to be evicted. 432 // All entries but the first are to be evicted.
411 EXPECT_EQ(peer_.dynamic_entries().size() - 1, peer_.EvictionSet( 433 EXPECT_EQ(peer_.dynamic_entries().size() - 1, peer_.EvictionSet(
412 long_entry.name(), long_entry.value()).size()); 434 long_entry.name(), long_entry.value()).size());
413 435
414 HpackEntry* new_entry = table_.TryAddEntry(long_entry.name(), 436 HpackEntry* new_entry = table_.TryAddEntry(long_entry.name(),
415 long_entry.value()); 437 long_entry.value());
416 EXPECT_EQ(1u, new_entry->Index()); 438 EXPECT_EQ(1u, table_.IndexOf(new_entry));
417 EXPECT_EQ(2u, peer_.dynamic_entries().size()); 439 EXPECT_EQ(2u, peer_.dynamic_entries().size());
418 EXPECT_EQ(table_.GetByIndex(2), survivor_entry); 440 EXPECT_EQ(table_.GetByIndex(2), survivor_entry);
419 EXPECT_EQ(table_.GetByIndex(1), new_entry); 441 EXPECT_EQ(table_.GetByIndex(1), new_entry);
420 } 442 }
421 443
422 // Fill a header table with entries, and then add an entry bigger than 444 // Fill a header table with entries, and then add an entry bigger than
423 // the entire table. Make sure no entry remains in the table. 445 // the entire table. Make sure no entry remains in the table.
424 TEST_F(HpackHeaderTableTest, TryAddTooLargeEntry) { 446 TEST_F(HpackHeaderTableTest, TryAddTooLargeEntry) {
425 HpackEntryVector entries = MakeEntriesOfTotalSize(table_.max_size()); 447 HpackEntryVector entries = MakeEntriesOfTotalSize(table_.max_size());
426 AddEntriesExpectNoEviction(entries); 448 AddEntriesExpectNoEviction(entries);
427 449
428 HpackEntry long_entry = MakeEntryOfSize(table_.max_size() + 1); 450 HpackEntry long_entry = MakeEntryOfSize(table_.max_size() + 1);
429 451
430 // All entries are to be evicted. 452 // All entries are to be evicted.
431 EXPECT_EQ(peer_.dynamic_entries().size(), peer_.EvictionSet( 453 EXPECT_EQ(peer_.dynamic_entries().size(), peer_.EvictionSet(
432 long_entry.name(), long_entry.value()).size()); 454 long_entry.name(), long_entry.value()).size());
433 455
434 HpackEntry* new_entry = table_.TryAddEntry(long_entry.name(), 456 HpackEntry* new_entry = table_.TryAddEntry(long_entry.name(),
435 long_entry.value()); 457 long_entry.value());
436 EXPECT_EQ(new_entry, static_cast<HpackEntry*>(NULL)); 458 EXPECT_EQ(new_entry, static_cast<HpackEntry*>(NULL));
437 EXPECT_EQ(0u, peer_.dynamic_entries().size()); 459 EXPECT_EQ(0u, peer_.dynamic_entries().size());
438 } 460 }
439 461
462 TEST_F(HpackHeaderTableTest, ComparatorNameOrdering) {
463 HpackEntry entry1(StaticEntry());
464 name_[0]--;
465 HpackEntry entry2(StaticEntry());
466
467 HpackHeaderTable::EntryComparator comparator(&table_);
468 EXPECT_FALSE(comparator(&entry1, &entry2));
469 EXPECT_TRUE(comparator(&entry2, &entry1));
470 }
471
472 TEST_F(HpackHeaderTableTest, ComparatorValueOrdering) {
473 HpackEntry entry1(StaticEntry());
474 value_[0]--;
475 HpackEntry entry2(StaticEntry());
476
477 HpackHeaderTable::EntryComparator comparator(&table_);
478 EXPECT_FALSE(comparator(&entry1, &entry2));
479 EXPECT_TRUE(comparator(&entry2, &entry1));
480 }
481
482 TEST_F(HpackHeaderTableTest, ComparatorIndexOrdering) {
483 HpackEntry entry1(StaticEntry());
484 HpackEntry entry2(StaticEntry());
485
486 HpackHeaderTable::EntryComparator comparator(&table_);
487 EXPECT_TRUE(comparator(&entry1, &entry2));
488 EXPECT_FALSE(comparator(&entry2, &entry1));
489
490 HpackEntry entry3(DynamicEntry());
491 HpackEntry entry4(DynamicEntry());
492
493 // |entry4| has lower index than |entry3|.
494 EXPECT_TRUE(comparator(&entry4, &entry3));
495 EXPECT_FALSE(comparator(&entry3, &entry4));
496
497 // |entry3| has lower index than |entry1|.
498 EXPECT_TRUE(comparator(&entry3, &entry1));
499 EXPECT_FALSE(comparator(&entry1, &entry3));
500
501 // |entry1| & |entry2| ordering is preserved, though each Index() has changed.
502 EXPECT_TRUE(comparator(&entry1, &entry2));
503 EXPECT_FALSE(comparator(&entry2, &entry1));
504 }
505
506 TEST_F(HpackHeaderTableTest, ComparatorEqualityOrdering) {
507 HpackEntry entry1(StaticEntry());
508 HpackEntry entry2(DynamicEntry());
509
510 HpackHeaderTable::EntryComparator comparator(&table_);
511 EXPECT_FALSE(comparator(&entry1, &entry1));
512 EXPECT_FALSE(comparator(&entry2, &entry2));
513 }
514
440 } // namespace 515 } // namespace
441 516
442 } // namespace net 517 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/hpack_header_table.cc ('k') | net/spdy/mock_spdy_framer_visitor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698