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