OLD | NEW |
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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 HpackHeaderTable::EntryTable::iterator begin, end; | 124 HpackHeaderTable::EntryTable::iterator begin, end; |
125 | 125 |
126 table_.EvictionSet(it->name(), it->value(), &begin, &end); | 126 table_.EvictionSet(it->name(), it->value(), &begin, &end); |
127 EXPECT_EQ(0, distance(begin, end)); | 127 EXPECT_EQ(0, distance(begin, end)); |
128 | 128 |
129 HpackEntry* entry = table_.TryAddEntry(it->name(), it->value()); | 129 HpackEntry* entry = table_.TryAddEntry(it->name(), it->value()); |
130 EXPECT_NE(entry, static_cast<HpackEntry*>(NULL)); | 130 EXPECT_NE(entry, static_cast<HpackEntry*>(NULL)); |
131 } | 131 } |
132 | 132 |
133 for (size_t i = 0; i != entries.size(); ++i) { | 133 for (size_t i = 0; i != entries.size(); ++i) { |
134 size_t index = entries.size() - i; | 134 // Static table has 61 entries, dynamic entries follow those. |
| 135 size_t index = 61 + entries.size() - i; |
135 HpackEntry* entry = table_.GetByIndex(index); | 136 HpackEntry* entry = table_.GetByIndex(index); |
136 EXPECT_EQ(entries[i].name(), entry->name()); | 137 EXPECT_EQ(entries[i].name(), entry->name()); |
137 EXPECT_EQ(entries[i].value(), entry->value()); | 138 EXPECT_EQ(entries[i].value(), entry->value()); |
138 EXPECT_EQ(index, table_.IndexOf(entry)); | 139 EXPECT_EQ(index, table_.IndexOf(entry)); |
139 } | 140 } |
140 } | 141 } |
141 | 142 |
142 HpackEntry StaticEntry() { | 143 HpackEntry StaticEntry() { |
143 peer_.AddStaticEntry(name_, value_); | 144 peer_.AddStaticEntry(name_, value_); |
144 return peer_.static_entries().back(); | 145 return peer_.static_entries().back(); |
145 } | 146 } |
146 HpackEntry DynamicEntry() { | 147 HpackEntry DynamicEntry() { |
147 peer_.AddDynamicEntry(name_, value_); | 148 peer_.AddDynamicEntry(name_, value_); |
148 return peer_.dynamic_entries().back(); | 149 return peer_.dynamic_entries().back(); |
149 } | 150 } |
150 | 151 |
151 HpackHeaderTable table_; | 152 HpackHeaderTable table_; |
152 test::HpackHeaderTablePeer peer_; | 153 test::HpackHeaderTablePeer peer_; |
153 string name_, value_; | 154 string name_, value_; |
154 }; | 155 }; |
155 | 156 |
156 TEST_F(HpackHeaderTableTest, StaticTableInitialization) { | 157 TEST_F(HpackHeaderTableTest, StaticTableInitialization) { |
157 EXPECT_EQ(0u, table_.size()); | 158 EXPECT_EQ(0u, table_.size()); |
158 EXPECT_EQ(kDefaultHeaderTableSizeSetting, table_.max_size()); | 159 EXPECT_EQ(kDefaultHeaderTableSizeSetting, table_.max_size()); |
159 EXPECT_EQ(kDefaultHeaderTableSizeSetting, table_.settings_size_bound()); | 160 EXPECT_EQ(kDefaultHeaderTableSizeSetting, table_.settings_size_bound()); |
160 | 161 |
161 EXPECT_EQ(0u, peer_.dynamic_entries_count()); | 162 EXPECT_EQ(0u, peer_.dynamic_entries_count()); |
162 EXPECT_EQ(0u, table_.reference_set().size()); | |
163 EXPECT_EQ(peer_.static_entries().size(), peer_.total_insertions()); | 163 EXPECT_EQ(peer_.static_entries().size(), peer_.total_insertions()); |
164 | 164 |
165 // Static entries have been populated and inserted into the table & index. | 165 // Static entries have been populated and inserted into the table & index. |
166 EXPECT_NE(0u, peer_.static_entries().size()); | 166 EXPECT_NE(0u, peer_.static_entries().size()); |
167 EXPECT_EQ(peer_.index().size(), peer_.static_entries().size()); | 167 EXPECT_EQ(peer_.index().size(), peer_.static_entries().size()); |
168 for (size_t i = 0; i != peer_.static_entries().size(); ++i) { | 168 for (size_t i = 0; i != peer_.static_entries().size(); ++i) { |
169 const HpackEntry* entry = &peer_.static_entries()[i]; | 169 const HpackEntry* entry = &peer_.static_entries()[i]; |
170 | 170 |
171 EXPECT_TRUE(entry->IsStatic()); | 171 EXPECT_TRUE(entry->IsStatic()); |
172 EXPECT_EQ(entry, table_.GetByIndex(i + 1)); | 172 EXPECT_EQ(entry, table_.GetByIndex(i + 1)); |
(...skipping 13 matching lines...) Expand all Loading... |
186 EXPECT_FALSE(entry->IsStatic()); | 186 EXPECT_FALSE(entry->IsStatic()); |
187 | 187 |
188 // Table counts were updated appropriately. | 188 // Table counts were updated appropriately. |
189 EXPECT_EQ(entry->Size(), table_.size()); | 189 EXPECT_EQ(entry->Size(), table_.size()); |
190 EXPECT_EQ(1u, peer_.dynamic_entries_count()); | 190 EXPECT_EQ(1u, peer_.dynamic_entries_count()); |
191 EXPECT_EQ(peer_.dynamic_entries().size(), peer_.dynamic_entries_count()); | 191 EXPECT_EQ(peer_.dynamic_entries().size(), peer_.dynamic_entries_count()); |
192 EXPECT_EQ(static_count + 1, peer_.total_insertions()); | 192 EXPECT_EQ(static_count + 1, peer_.total_insertions()); |
193 EXPECT_EQ(static_count + 1, peer_.index().size()); | 193 EXPECT_EQ(static_count + 1, peer_.index().size()); |
194 | 194 |
195 // Index() of entries reflects the insertion. | 195 // Index() of entries reflects the insertion. |
196 EXPECT_EQ(1u, table_.IndexOf(entry)); | 196 EXPECT_EQ(1u, table_.IndexOf(first_static_entry)); |
197 EXPECT_EQ(2u, table_.IndexOf(first_static_entry)); | 197 // Static table has 61 entries. |
198 EXPECT_EQ(entry, table_.GetByIndex(1)); | 198 EXPECT_EQ(62u, table_.IndexOf(entry)); |
199 EXPECT_EQ(first_static_entry, table_.GetByIndex(2)); | 199 EXPECT_EQ(first_static_entry, table_.GetByIndex(1)); |
| 200 EXPECT_EQ(entry, table_.GetByIndex(62)); |
200 | 201 |
201 // Evict |entry|. Table counts are again updated appropriately. | 202 // Evict |entry|. Table counts are again updated appropriately. |
202 peer_.Evict(1); | 203 peer_.Evict(1); |
203 EXPECT_EQ(0u, table_.size()); | 204 EXPECT_EQ(0u, table_.size()); |
204 EXPECT_EQ(0u, peer_.dynamic_entries_count()); | 205 EXPECT_EQ(0u, peer_.dynamic_entries_count()); |
205 EXPECT_EQ(peer_.dynamic_entries().size(), peer_.dynamic_entries_count()); | 206 EXPECT_EQ(peer_.dynamic_entries().size(), peer_.dynamic_entries_count()); |
206 EXPECT_EQ(static_count + 1, peer_.total_insertions()); | 207 EXPECT_EQ(static_count + 1, peer_.total_insertions()); |
207 EXPECT_EQ(static_count, peer_.index().size()); | 208 EXPECT_EQ(static_count, peer_.index().size()); |
208 | 209 |
209 // Index() of |first_static_entry| reflects the eviction. | 210 // Index() of |first_static_entry| reflects the eviction. |
(...skipping 15 matching lines...) Expand all Loading... |
225 first_static_entry->value()); | 226 first_static_entry->value()); |
226 HpackEntry* entry2 = table_.TryAddEntry(first_static_entry->name(), | 227 HpackEntry* entry2 = table_.TryAddEntry(first_static_entry->name(), |
227 "Value Four"); | 228 "Value Four"); |
228 HpackEntry* entry3 = table_.TryAddEntry("key-1", "Value One"); | 229 HpackEntry* entry3 = table_.TryAddEntry("key-1", "Value One"); |
229 HpackEntry* entry4 = table_.TryAddEntry("key-2", "Value Three"); | 230 HpackEntry* entry4 = table_.TryAddEntry("key-2", "Value Three"); |
230 HpackEntry* entry5 = table_.TryAddEntry("key-1", "Value Two"); | 231 HpackEntry* entry5 = table_.TryAddEntry("key-1", "Value Two"); |
231 HpackEntry* entry6 = table_.TryAddEntry("key-2", "Value Three"); | 232 HpackEntry* entry6 = table_.TryAddEntry("key-2", "Value Three"); |
232 HpackEntry* entry7 = table_.TryAddEntry("key-2", "Value Four"); | 233 HpackEntry* entry7 = table_.TryAddEntry("key-2", "Value Four"); |
233 | 234 |
234 // Entries are queryable under their current index. | 235 // Entries are queryable under their current index. |
235 EXPECT_EQ(entry7, table_.GetByIndex(1)); | 236 EXPECT_EQ(entry7, table_.GetByIndex(62)); |
236 EXPECT_EQ(entry6, table_.GetByIndex(2)); | 237 EXPECT_EQ(entry6, table_.GetByIndex(63)); |
237 EXPECT_EQ(entry5, table_.GetByIndex(3)); | 238 EXPECT_EQ(entry5, table_.GetByIndex(64)); |
238 EXPECT_EQ(entry4, table_.GetByIndex(4)); | 239 EXPECT_EQ(entry4, table_.GetByIndex(65)); |
239 EXPECT_EQ(entry3, table_.GetByIndex(5)); | 240 EXPECT_EQ(entry3, table_.GetByIndex(66)); |
240 EXPECT_EQ(entry2, table_.GetByIndex(6)); | 241 EXPECT_EQ(entry2, table_.GetByIndex(67)); |
241 EXPECT_EQ(entry1, table_.GetByIndex(7)); | 242 EXPECT_EQ(entry1, table_.GetByIndex(68)); |
242 EXPECT_EQ(first_static_entry, table_.GetByIndex(8)); | 243 EXPECT_EQ(first_static_entry, table_.GetByIndex(1)); |
243 | 244 |
244 // Querying by name returns the lowest-value matching entry. | 245 // Querying by name returns the lowest-value matching entry. |
245 EXPECT_EQ(entry3, table_.GetByName("key-1")); | 246 EXPECT_EQ(entry3, table_.GetByName("key-1")); |
246 EXPECT_EQ(entry7, table_.GetByName("key-2")); | 247 EXPECT_EQ(entry7, table_.GetByName("key-2")); |
247 EXPECT_EQ(entry2->name(), | 248 EXPECT_EQ(entry2->name(), |
248 table_.GetByName(first_static_entry->name())->name()); | 249 table_.GetByName(first_static_entry->name())->name()); |
249 EXPECT_EQ(NULL, table_.GetByName("not-present")); | 250 EXPECT_EQ(NULL, table_.GetByName("not-present")); |
250 | 251 |
251 // Querying by name & value returns the lowest-index matching entry. | 252 // Querying by name & value returns the lowest-index matching entry. |
252 EXPECT_EQ(entry3, table_.GetByNameAndValue("key-1", "Value One")); | 253 EXPECT_EQ(entry3, table_.GetByNameAndValue("key-1", "Value One")); |
253 EXPECT_EQ(entry5, table_.GetByNameAndValue("key-1", "Value Two")); | 254 EXPECT_EQ(entry5, table_.GetByNameAndValue("key-1", "Value Two")); |
254 EXPECT_EQ(entry6, table_.GetByNameAndValue("key-2", "Value Three")); | 255 EXPECT_EQ(entry6, table_.GetByNameAndValue("key-2", "Value Three")); |
255 EXPECT_EQ(entry7, table_.GetByNameAndValue("key-2", "Value Four")); | 256 EXPECT_EQ(entry7, table_.GetByNameAndValue("key-2", "Value Four")); |
256 EXPECT_EQ(entry1, table_.GetByNameAndValue(first_static_entry->name(), | 257 EXPECT_EQ(first_static_entry, |
257 first_static_entry->value())); | 258 table_.GetByNameAndValue(first_static_entry->name(), |
| 259 first_static_entry->value())); |
258 EXPECT_EQ(entry2, table_.GetByNameAndValue(first_static_entry->name(), | 260 EXPECT_EQ(entry2, table_.GetByNameAndValue(first_static_entry->name(), |
259 "Value Four")); | 261 "Value Four")); |
260 EXPECT_EQ(NULL, table_.GetByNameAndValue("key-1", "Not Present")); | 262 EXPECT_EQ(NULL, table_.GetByNameAndValue("key-1", "Not Present")); |
261 EXPECT_EQ(NULL, table_.GetByNameAndValue("not-present", "Value One")); | 263 EXPECT_EQ(NULL, table_.GetByNameAndValue("not-present", "Value One")); |
262 | 264 |
263 // Evict |entry1|. Queries for its name & value now return the static entry. | 265 // Evict |entry1|. Queries for its name & value now return the static entry. |
264 // |entry2| remains queryable. | 266 // |entry2| remains queryable. |
265 peer_.Evict(1); | 267 peer_.Evict(1); |
266 EXPECT_EQ(first_static_entry, | 268 EXPECT_EQ(first_static_entry, |
267 table_.GetByNameAndValue(first_static_entry->name(), | 269 table_.GetByNameAndValue(first_static_entry->name(), |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 | 304 |
303 // SETTINGS_HEADER_TABLE_SIZE upper-bounds |table_.max_size()|, | 305 // SETTINGS_HEADER_TABLE_SIZE upper-bounds |table_.max_size()|, |
304 // and will force evictions. | 306 // and will force evictions. |
305 max_size = entry3->Size() - 1; | 307 max_size = entry3->Size() - 1; |
306 table_.SetSettingsHeaderTableSize(max_size); | 308 table_.SetSettingsHeaderTableSize(max_size); |
307 EXPECT_EQ(max_size, table_.max_size()); | 309 EXPECT_EQ(max_size, table_.max_size()); |
308 EXPECT_EQ(max_size, table_.settings_size_bound()); | 310 EXPECT_EQ(max_size, table_.settings_size_bound()); |
309 EXPECT_EQ(0u, peer_.dynamic_entries().size()); | 311 EXPECT_EQ(0u, peer_.dynamic_entries().size()); |
310 } | 312 } |
311 | 313 |
312 TEST_F(HpackHeaderTableTest, ToggleReferenceSet) { | |
313 HpackEntry* entry1 = table_.TryAddEntry("key-1", "Value One"); | |
314 HpackEntry* entry2 = table_.TryAddEntry("key-2", "Value Two"); | |
315 | |
316 // Entries must be explictly toggled after creation. | |
317 EXPECT_EQ(0u, table_.reference_set().size()); | |
318 | |
319 // Add |entry1|. | |
320 EXPECT_TRUE(table_.Toggle(entry1)); | |
321 EXPECT_EQ(1u, table_.reference_set().size()); | |
322 EXPECT_EQ(1u, table_.reference_set().count(entry1)); | |
323 EXPECT_EQ(0u, table_.reference_set().count(entry2)); | |
324 | |
325 // Add |entry2|. | |
326 EXPECT_TRUE(table_.Toggle(entry2)); | |
327 EXPECT_EQ(2u, table_.reference_set().size()); | |
328 EXPECT_EQ(1u, table_.reference_set().count(entry1)); | |
329 EXPECT_EQ(1u, table_.reference_set().count(entry2)); | |
330 | |
331 // Remove |entry2|. | |
332 EXPECT_FALSE(table_.Toggle(entry2)); | |
333 EXPECT_EQ(1u, table_.reference_set().size()); | |
334 EXPECT_EQ(0u, table_.reference_set().count(entry2)); | |
335 | |
336 // Evict |entry1|. Implicit removal from reference set. | |
337 peer_.Evict(1); | |
338 EXPECT_EQ(0u, table_.reference_set().size()); | |
339 } | |
340 | |
341 TEST_F(HpackHeaderTableTest, ClearReferenceSet) { | |
342 HpackEntry* entry1 = table_.TryAddEntry("key-1", "Value One"); | |
343 EXPECT_TRUE(table_.Toggle(entry1)); | |
344 entry1->set_state(123); | |
345 | |
346 // |entry1| state is cleared, and removed from the reference set. | |
347 table_.ClearReferenceSet(); | |
348 EXPECT_EQ(0u, entry1->state()); | |
349 EXPECT_EQ(0u, table_.reference_set().size()); | |
350 } | |
351 | |
352 TEST_F(HpackHeaderTableTest, EvictionCountForEntry) { | 314 TEST_F(HpackHeaderTableTest, EvictionCountForEntry) { |
353 string key = "key", value = "value"; | 315 string key = "key", value = "value"; |
354 HpackEntry* entry1 = table_.TryAddEntry(key, value); | 316 HpackEntry* entry1 = table_.TryAddEntry(key, value); |
355 HpackEntry* entry2 = table_.TryAddEntry(key, value); | 317 HpackEntry* entry2 = table_.TryAddEntry(key, value); |
356 size_t entry3_size = HpackEntry::Size(key, value); | 318 size_t entry3_size = HpackEntry::Size(key, value); |
357 | 319 |
358 // Just enough capacity for third entry. | 320 // Just enough capacity for third entry. |
359 table_.SetMaxSize(entry1->Size() + entry2->Size() + entry3_size); | 321 table_.SetMaxSize(entry1->Size() + entry2->Size() + entry3_size); |
360 EXPECT_EQ(0u, peer_.EvictionCountForEntry(key, value)); | 322 EXPECT_EQ(0u, peer_.EvictionCountForEntry(key, value)); |
361 EXPECT_EQ(1u, peer_.EvictionCountForEntry(key, value + "x")); | 323 EXPECT_EQ(1u, peer_.EvictionCountForEntry(key, value + "x")); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 } | 380 } |
419 | 381 |
420 // Fill a header table with entries, and then add an entry just big | 382 // Fill a header table with entries, and then add an entry just big |
421 // enough to cause eviction of all but one entry. Make sure the | 383 // enough to cause eviction of all but one entry. Make sure the |
422 // eviction happens as expected and the long entry is inserted into | 384 // eviction happens as expected and the long entry is inserted into |
423 // the table. | 385 // the table. |
424 TEST_F(HpackHeaderTableTest, TryAddEntryEviction) { | 386 TEST_F(HpackHeaderTableTest, TryAddEntryEviction) { |
425 HpackEntryVector entries = MakeEntriesOfTotalSize(table_.max_size()); | 387 HpackEntryVector entries = MakeEntriesOfTotalSize(table_.max_size()); |
426 AddEntriesExpectNoEviction(entries); | 388 AddEntriesExpectNoEviction(entries); |
427 | 389 |
428 HpackEntry* survivor_entry = table_.GetByIndex(1); | 390 HpackEntry* survivor_entry = table_.GetByIndex(61 + 1); |
429 HpackEntry long_entry = | 391 HpackEntry long_entry = |
430 MakeEntryOfSize(table_.max_size() - survivor_entry->Size()); | 392 MakeEntryOfSize(table_.max_size() - survivor_entry->Size()); |
431 | 393 |
432 // All entries but the first are to be evicted. | 394 // All dynamic entries but the first are to be evicted. |
433 EXPECT_EQ(peer_.dynamic_entries().size() - 1, peer_.EvictionSet( | 395 EXPECT_EQ(peer_.dynamic_entries().size() - 1, peer_.EvictionSet( |
434 long_entry.name(), long_entry.value()).size()); | 396 long_entry.name(), long_entry.value()).size()); |
435 | 397 |
436 HpackEntry* new_entry = table_.TryAddEntry(long_entry.name(), | 398 HpackEntry* new_entry = table_.TryAddEntry(long_entry.name(), |
437 long_entry.value()); | 399 long_entry.value()); |
438 EXPECT_EQ(1u, table_.IndexOf(new_entry)); | 400 EXPECT_EQ(62u, table_.IndexOf(new_entry)); |
439 EXPECT_EQ(2u, peer_.dynamic_entries().size()); | 401 EXPECT_EQ(2u, peer_.dynamic_entries().size()); |
440 EXPECT_EQ(table_.GetByIndex(2), survivor_entry); | 402 EXPECT_EQ(table_.GetByIndex(63), survivor_entry); |
441 EXPECT_EQ(table_.GetByIndex(1), new_entry); | 403 EXPECT_EQ(table_.GetByIndex(62), new_entry); |
442 } | 404 } |
443 | 405 |
444 // Fill a header table with entries, and then add an entry bigger than | 406 // Fill a header table with entries, and then add an entry bigger than |
445 // the entire table. Make sure no entry remains in the table. | 407 // the entire table. Make sure no entry remains in the table. |
446 TEST_F(HpackHeaderTableTest, TryAddTooLargeEntry) { | 408 TEST_F(HpackHeaderTableTest, TryAddTooLargeEntry) { |
447 HpackEntryVector entries = MakeEntriesOfTotalSize(table_.max_size()); | 409 HpackEntryVector entries = MakeEntriesOfTotalSize(table_.max_size()); |
448 AddEntriesExpectNoEviction(entries); | 410 AddEntriesExpectNoEviction(entries); |
449 | 411 |
450 HpackEntry long_entry = MakeEntryOfSize(table_.max_size() + 1); | 412 HpackEntry long_entry = MakeEntryOfSize(table_.max_size() + 1); |
451 | 413 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 EXPECT_TRUE(comparator(&entry1, &entry2)); | 449 EXPECT_TRUE(comparator(&entry1, &entry2)); |
488 EXPECT_FALSE(comparator(&entry2, &entry1)); | 450 EXPECT_FALSE(comparator(&entry2, &entry1)); |
489 | 451 |
490 HpackEntry entry3(DynamicEntry()); | 452 HpackEntry entry3(DynamicEntry()); |
491 HpackEntry entry4(DynamicEntry()); | 453 HpackEntry entry4(DynamicEntry()); |
492 | 454 |
493 // |entry4| has lower index than |entry3|. | 455 // |entry4| has lower index than |entry3|. |
494 EXPECT_TRUE(comparator(&entry4, &entry3)); | 456 EXPECT_TRUE(comparator(&entry4, &entry3)); |
495 EXPECT_FALSE(comparator(&entry3, &entry4)); | 457 EXPECT_FALSE(comparator(&entry3, &entry4)); |
496 | 458 |
497 // |entry3| has lower index than |entry1|. | 459 // |entry1| has lower index than |entry3|. |
498 EXPECT_TRUE(comparator(&entry3, &entry1)); | 460 EXPECT_TRUE(comparator(&entry1, &entry3)); |
499 EXPECT_FALSE(comparator(&entry1, &entry3)); | 461 EXPECT_FALSE(comparator(&entry3, &entry1)); |
500 | 462 |
501 // |entry1| & |entry2| ordering is preserved, though each Index() has changed. | 463 // |entry1| & |entry2| ordering is preserved, though each Index() has changed. |
502 EXPECT_TRUE(comparator(&entry1, &entry2)); | 464 EXPECT_TRUE(comparator(&entry1, &entry2)); |
503 EXPECT_FALSE(comparator(&entry2, &entry1)); | 465 EXPECT_FALSE(comparator(&entry2, &entry1)); |
504 } | 466 } |
505 | 467 |
506 TEST_F(HpackHeaderTableTest, ComparatorEqualityOrdering) { | 468 TEST_F(HpackHeaderTableTest, ComparatorEqualityOrdering) { |
507 HpackEntry entry1(StaticEntry()); | 469 HpackEntry entry1(StaticEntry()); |
508 HpackEntry entry2(DynamicEntry()); | 470 HpackEntry entry2(DynamicEntry()); |
509 | 471 |
510 HpackHeaderTable::EntryComparator comparator(&table_); | 472 HpackHeaderTable::EntryComparator comparator(&table_); |
511 EXPECT_FALSE(comparator(&entry1, &entry1)); | 473 EXPECT_FALSE(comparator(&entry1, &entry1)); |
512 EXPECT_FALSE(comparator(&entry2, &entry2)); | 474 EXPECT_FALSE(comparator(&entry2, &entry2)); |
513 } | 475 } |
514 | 476 |
515 } // namespace | 477 } // namespace |
516 | 478 |
517 } // namespace net | 479 } // namespace net |
OLD | NEW |