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

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

Issue 145353017: Update HPACK implementation to draft 05 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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/hpack_output_stream.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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW
« no previous file with comments | « net/spdy/hpack_header_table.cc ('k') | net/spdy/hpack_output_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698