| 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 return entries; | 48 return entries; |
| 49 } | 49 } |
| 50 | 50 |
| 51 // Adds the given vector of entries to the given header table, | 51 // Adds the given vector of entries to the given header table, |
| 52 // expecting no eviction to happen. | 52 // expecting no eviction to happen. |
| 53 void AddEntriesExpectNoEviction(const HpackEntryVector& entries, | 53 void AddEntriesExpectNoEviction(const HpackEntryVector& entries, |
| 54 HpackHeaderTable* header_table) { | 54 HpackHeaderTable* header_table) { |
| 55 unsigned start_entry_count = header_table->GetEntryCount(); | 55 unsigned start_entry_count = header_table->GetEntryCount(); |
| 56 for (HpackEntryVector::const_iterator it = entries.begin(); | 56 for (HpackEntryVector::const_iterator it = entries.begin(); |
| 57 it != entries.end(); ++it) { | 57 it != entries.end(); ++it) { |
| 58 int32 index = -1; | 58 uint32 index = 0; |
| 59 std::vector<uint32> removed_referenced_indices; | 59 std::vector<uint32> removed_referenced_indices; |
| 60 header_table->TryAddEntry(*it, &index, &removed_referenced_indices); | 60 header_table->TryAddEntry(*it, &index, &removed_referenced_indices); |
| 61 EXPECT_EQ(0, index); | 61 EXPECT_EQ(1u, index); |
| 62 EXPECT_TRUE(removed_referenced_indices.empty()); | 62 EXPECT_TRUE(removed_referenced_indices.empty()); |
| 63 EXPECT_EQ(start_entry_count + (it - entries.begin()) + 1u, | 63 EXPECT_EQ(start_entry_count + (it - entries.begin()) + 1u, |
| 64 header_table->GetEntryCount()); | 64 header_table->GetEntryCount()); |
| 65 } | 65 } |
| 66 | 66 |
| 67 for (HpackEntryVector::const_iterator it = entries.begin(); | 67 for (HpackEntryVector::const_iterator it = entries.begin(); |
| 68 it != entries.end(); ++it) { | 68 it != entries.end(); ++it) { |
| 69 uint32 index = header_table->GetEntryCount() - (it - entries.begin()) - 1; | 69 uint32 index = header_table->GetEntryCount() - (it - entries.begin()); |
| 70 HpackEntry entry = header_table->GetEntry(index); | 70 HpackEntry entry = header_table->GetEntry(index); |
| 71 EXPECT_TRUE(it->Equals(entry)) | 71 EXPECT_TRUE(it->Equals(entry)) |
| 72 << "it = " << it->GetDebugString() << " != entry = " | 72 << "it = " << it->GetDebugString() << " != entry = " |
| 73 << entry.GetDebugString(); | 73 << entry.GetDebugString(); |
| 74 } | 74 } |
| 75 } | 75 } |
| 76 | 76 |
| 77 // Returns the set of all indices in header_table that are in that | 77 // Returns the set of all indices in header_table that are in that |
| 78 // table's reference set. | 78 // table's reference set. |
| 79 std::set<uint32> GetReferenceSet(const HpackHeaderTable& header_table) { | 79 std::set<uint32> GetReferenceSet(const HpackHeaderTable& header_table) { |
| 80 std::set<uint32> reference_set; | 80 std::set<uint32> reference_set; |
| 81 for (uint32 i = 0; i < header_table.GetEntryCount(); ++i) { | 81 for (uint32 i = 1; i <= header_table.GetEntryCount(); ++i) { |
| 82 if (header_table.GetEntry(i).IsReferenced()) { | 82 if (header_table.GetEntry(i).IsReferenced()) { |
| 83 reference_set.insert(i); | 83 reference_set.insert(i); |
| 84 } | 84 } |
| 85 } | 85 } |
| 86 return reference_set; | 86 return reference_set; |
| 87 } | 87 } |
| 88 | 88 |
| 89 // Fill a header table with entries. Make sure the entries are in | 89 // Fill a header table with entries. Make sure the entries are in |
| 90 // reverse order in the header table. | 90 // reverse order in the header table. |
| 91 TEST(HpackHeaderTableTest, TryAddEntryBasic) { | 91 TEST(HpackHeaderTableTest, TryAddEntryBasic) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 | 129 |
| 130 // Setting the max size of a header table to zero should clear its | 130 // Setting the max size of a header table to zero should clear its |
| 131 // reference set. | 131 // reference set. |
| 132 TEST(HpackHeaderTableTest, SetMaxSizeZeroClearsReferenceSet) { | 132 TEST(HpackHeaderTableTest, SetMaxSizeZeroClearsReferenceSet) { |
| 133 HpackHeaderTable header_table; | 133 HpackHeaderTable header_table; |
| 134 | 134 |
| 135 HpackEntryVector entries = MakeEntriesOfTotalSize(header_table.max_size()); | 135 HpackEntryVector entries = MakeEntriesOfTotalSize(header_table.max_size()); |
| 136 AddEntriesExpectNoEviction(entries, &header_table); | 136 AddEntriesExpectNoEviction(entries, &header_table); |
| 137 | 137 |
| 138 std::set<uint32> expected_reference_set; | 138 std::set<uint32> expected_reference_set; |
| 139 for (uint32 i = 0; i < header_table.GetEntryCount(); ++i) { | 139 for (uint32 i = 1; i <= header_table.GetEntryCount(); ++i) { |
| 140 header_table.GetMutableEntry(i)->SetReferenced(true); | 140 header_table.GetMutableEntry(i)->SetReferenced(true); |
| 141 expected_reference_set.insert(i); | 141 expected_reference_set.insert(i); |
| 142 } | 142 } |
| 143 EXPECT_EQ(expected_reference_set, GetReferenceSet(header_table)); | 143 EXPECT_EQ(expected_reference_set, GetReferenceSet(header_table)); |
| 144 | 144 |
| 145 header_table.SetMaxSize(0); | 145 header_table.SetMaxSize(0); |
| 146 EXPECT_TRUE(GetReferenceSet(header_table).empty()); | 146 EXPECT_TRUE(GetReferenceSet(header_table).empty()); |
| 147 } | 147 } |
| 148 | 148 |
| 149 // Fill a header table with entries, and then add an entry just big | 149 // Fill a header table with entries, and then add an entry just big |
| 150 // enough to cause eviction of all but one entry. Make sure the | 150 // enough to cause eviction of all but one entry. Make sure the |
| 151 // eviction happens as expected and the long entry is inserted into | 151 // eviction happens as expected and the long entry is inserted into |
| 152 // the table. | 152 // the table. |
| 153 TEST(HpackHeaderTableTest, TryAddEntryEviction) { | 153 TEST(HpackHeaderTableTest, TryAddEntryEviction) { |
| 154 HpackHeaderTable header_table; | 154 HpackHeaderTable header_table; |
| 155 | 155 |
| 156 HpackEntryVector entries = MakeEntriesOfTotalSize(header_table.max_size()); | 156 HpackEntryVector entries = MakeEntriesOfTotalSize(header_table.max_size()); |
| 157 AddEntriesExpectNoEviction(entries, &header_table); | 157 AddEntriesExpectNoEviction(entries, &header_table); |
| 158 | 158 |
| 159 EXPECT_EQ(entries.size(), header_table.GetEntryCount()); | 159 EXPECT_EQ(entries.size(), header_table.GetEntryCount()); |
| 160 HpackEntry first_entry = header_table.GetEntry(0); | 160 HpackEntry first_entry = header_table.GetEntry(1); |
| 161 HpackEntry long_entry = | 161 HpackEntry long_entry = |
| 162 MakeEntryOfSize(header_table.size() - first_entry.Size()); | 162 MakeEntryOfSize(header_table.size() - first_entry.Size()); |
| 163 | 163 |
| 164 header_table.SetMaxSize(header_table.size()); | 164 header_table.SetMaxSize(header_table.size()); |
| 165 EXPECT_EQ(entries.size(), header_table.GetEntryCount()); | 165 EXPECT_EQ(entries.size(), header_table.GetEntryCount()); |
| 166 | 166 |
| 167 std::set<uint32> expected_reference_set; | 167 std::set<uint32> expected_reference_set; |
| 168 for (uint32 i = 1; i < header_table.GetEntryCount(); ++i) { | 168 for (uint32 i = 2; i <= header_table.GetEntryCount(); ++i) { |
| 169 header_table.GetMutableEntry(i)->SetReferenced(true); | 169 header_table.GetMutableEntry(i)->SetReferenced(true); |
| 170 expected_reference_set.insert(i); | 170 expected_reference_set.insert(i); |
| 171 } | 171 } |
| 172 EXPECT_EQ(expected_reference_set, GetReferenceSet(header_table)); | 172 EXPECT_EQ(expected_reference_set, GetReferenceSet(header_table)); |
| 173 | 173 |
| 174 int32 index = -1; | 174 uint32 index = 0; |
| 175 std::vector<uint32> removed_referenced_indices; | 175 std::vector<uint32> removed_referenced_indices; |
| 176 header_table.TryAddEntry(long_entry, &index, &removed_referenced_indices); | 176 header_table.TryAddEntry(long_entry, &index, &removed_referenced_indices); |
| 177 | 177 |
| 178 EXPECT_EQ(0, index); | 178 EXPECT_EQ(1u, index); |
| 179 EXPECT_EQ(expected_reference_set, | 179 EXPECT_EQ(expected_reference_set, |
| 180 std::set<uint32>(removed_referenced_indices.begin(), | 180 std::set<uint32>(removed_referenced_indices.begin(), |
| 181 removed_referenced_indices.end())); | 181 removed_referenced_indices.end())); |
| 182 EXPECT_TRUE(GetReferenceSet(header_table).empty()); | 182 EXPECT_TRUE(GetReferenceSet(header_table).empty()); |
| 183 EXPECT_EQ(2u, header_table.GetEntryCount()); | 183 EXPECT_EQ(2u, header_table.GetEntryCount()); |
| 184 EXPECT_TRUE(header_table.GetEntry(0).Equals(long_entry)); | 184 EXPECT_TRUE(header_table.GetEntry(1).Equals(long_entry)); |
| 185 EXPECT_TRUE(header_table.GetEntry(1).Equals(first_entry)); | 185 EXPECT_TRUE(header_table.GetEntry(2).Equals(first_entry)); |
| 186 } | 186 } |
| 187 | 187 |
| 188 // Fill a header table with entries, and then add an entry bigger than | 188 // Fill a header table with entries, and then add an entry bigger than |
| 189 // the entire table. Make sure no entry remains in the table. | 189 // the entire table. Make sure no entry remains in the table. |
| 190 TEST(HpackHeaderTableTest, TryAddTooLargeEntry) { | 190 TEST(HpackHeaderTableTest, TryAddTooLargeEntry) { |
| 191 HpackHeaderTable header_table; | 191 HpackHeaderTable header_table; |
| 192 | 192 |
| 193 HpackEntryVector entries = MakeEntriesOfTotalSize(header_table.max_size()); | 193 HpackEntryVector entries = MakeEntriesOfTotalSize(header_table.max_size()); |
| 194 AddEntriesExpectNoEviction(entries, &header_table); | 194 AddEntriesExpectNoEviction(entries, &header_table); |
| 195 | 195 |
| 196 header_table.SetMaxSize(header_table.size()); | 196 header_table.SetMaxSize(header_table.size()); |
| 197 EXPECT_EQ(entries.size(), header_table.GetEntryCount()); | 197 EXPECT_EQ(entries.size(), header_table.GetEntryCount()); |
| 198 | 198 |
| 199 std::set<uint32> expected_removed_referenced_indices; | 199 std::set<uint32> expected_removed_referenced_indices; |
| 200 for (uint32 i = 0; i < header_table.GetEntryCount(); ++i) { | 200 for (uint32 i = 1; i <= header_table.GetEntryCount(); ++i) { |
| 201 header_table.GetMutableEntry(i)->SetReferenced(true); | 201 header_table.GetMutableEntry(i)->SetReferenced(true); |
| 202 expected_removed_referenced_indices.insert(i); | 202 expected_removed_referenced_indices.insert(i); |
| 203 } | 203 } |
| 204 | 204 |
| 205 HpackEntry long_entry = MakeEntryOfSize(header_table.size() + 1); | 205 HpackEntry long_entry = MakeEntryOfSize(header_table.size() + 1); |
| 206 int32 index = -1; | 206 uint32 index = 0; |
| 207 std::vector<uint32> removed_referenced_indices; | 207 std::vector<uint32> removed_referenced_indices; |
| 208 header_table.TryAddEntry(long_entry, &index, &removed_referenced_indices); | 208 header_table.TryAddEntry(long_entry, &index, &removed_referenced_indices); |
| 209 | 209 |
| 210 EXPECT_EQ(-1, index); | 210 EXPECT_EQ(0u, index); |
| 211 EXPECT_EQ(expected_removed_referenced_indices, | 211 EXPECT_EQ(expected_removed_referenced_indices, |
| 212 std::set<uint32>(removed_referenced_indices.begin(), | 212 std::set<uint32>(removed_referenced_indices.begin(), |
| 213 removed_referenced_indices.end())); | 213 removed_referenced_indices.end())); |
| 214 EXPECT_EQ(0u, header_table.GetEntryCount()); | 214 EXPECT_EQ(0u, header_table.GetEntryCount()); |
| 215 } | 215 } |
| 216 | 216 |
| 217 } // namespace | 217 } // namespace |
| 218 | 218 |
| 219 } // namespace net | 219 } // namespace net |
| OLD | NEW |