OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "net/spdy/hpack_input_stream.h" | |
6 | |
7 #include <bitset> | |
8 #include <string> | |
9 #include <vector> | |
10 | |
11 #include "base/logging.h" | |
12 #include "base/strings/string_piece.h" | |
13 #include "net/spdy/hpack_constants.h" | |
14 #include "net/spdy/spdy_test_utils.h" | |
15 #include "testing/gtest/include/gtest/gtest.h" | |
16 | |
17 namespace net { | |
18 | |
19 namespace { | |
20 | |
21 using base::StringPiece; | |
22 using std::string; | |
23 using test::a2b_hex; | |
24 | |
25 const size_t kLiteralBound = 1024; | |
26 | |
27 class HpackInputStreamTest : public ::testing::Test { | |
28 public: | |
29 void SetUp() override { | |
30 std::vector<HpackHuffmanSymbol> code = HpackHuffmanCode(); | |
31 EXPECT_TRUE(huffman_table_.Initialize(&code[0], code.size())); | |
32 } | |
33 | |
34 protected: | |
35 HpackHuffmanTable huffman_table_; | |
36 }; | |
37 | |
38 // Hex representation of encoded length and Huffman string. | |
39 const char kEncodedHuffmanFixture[] = "2d" // Length prefix. | |
40 "94e7821dd7f2e6c7b335dfdfcd5b3960" | |
41 "d5af27087f3672c1ab270fb5291f9587" | |
42 "316065c003ed4ee5b1063d5007"; | |
43 | |
44 const char kDecodedHuffmanFixture[] = | |
45 "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"; | |
46 | |
47 // Utility function to decode an assumed-valid uint32 with an N-bit | |
48 // prefix. | |
49 uint32 DecodeValidUint32(uint8 N, StringPiece str) { | |
50 EXPECT_GT(N, 0); | |
51 EXPECT_LE(N, 8); | |
52 HpackInputStream input_stream(kLiteralBound, str); | |
53 input_stream.SetBitOffsetForTest(8 - N); | |
54 uint32 I; | |
55 EXPECT_TRUE(input_stream.DecodeNextUint32(&I)); | |
56 return I; | |
57 } | |
58 | |
59 // Utility function to decode an assumed-invalid uint32 with an N-bit | |
60 // prefix. | |
61 void ExpectDecodeUint32Invalid(uint8 N, StringPiece str) { | |
62 EXPECT_GT(N, 0); | |
63 EXPECT_LE(N, 8); | |
64 HpackInputStream input_stream(kLiteralBound, str); | |
65 input_stream.SetBitOffsetForTest(8 - N); | |
66 uint32 I; | |
67 EXPECT_FALSE(input_stream.DecodeNextUint32(&I)); | |
68 } | |
69 | |
70 uint32 bits32(const string& bitstring) { | |
71 return std::bitset<32>(bitstring).to_ulong(); | |
72 } | |
73 | |
74 // The {Number}ByteIntegersEightBitPrefix tests below test that | |
75 // certain integers are decoded correctly with an 8-bit prefix in | |
76 // exactly {Number} bytes. | |
77 | |
78 TEST_F(HpackInputStreamTest, OneByteIntegersEightBitPrefix) { | |
79 // Minimum. | |
80 EXPECT_EQ(0x00u, DecodeValidUint32(8, string("\x00", 1))); | |
81 EXPECT_EQ(0x7fu, DecodeValidUint32(8, "\x7f")); | |
82 // Maximum. | |
83 EXPECT_EQ(0xfeu, DecodeValidUint32(8, "\xfe")); | |
84 // Invalid. | |
85 ExpectDecodeUint32Invalid(8, "\xff"); | |
86 } | |
87 | |
88 TEST_F(HpackInputStreamTest, TwoByteIntegersEightBitPrefix) { | |
89 // Minimum. | |
90 EXPECT_EQ(0xffu, DecodeValidUint32(8, string("\xff\x00", 2))); | |
91 EXPECT_EQ(0x0100u, DecodeValidUint32(8, "\xff\x01")); | |
92 // Maximum. | |
93 EXPECT_EQ(0x017eu, DecodeValidUint32(8, "\xff\x7f")); | |
94 // Invalid. | |
95 ExpectDecodeUint32Invalid(8, "\xff\x80"); | |
96 ExpectDecodeUint32Invalid(8, "\xff\xff"); | |
97 } | |
98 | |
99 TEST_F(HpackInputStreamTest, ThreeByteIntegersEightBitPrefix) { | |
100 // Minimum. | |
101 EXPECT_EQ(0x017fu, DecodeValidUint32(8, "\xff\x80\x01")); | |
102 EXPECT_EQ(0x0fffu, DecodeValidUint32(8, "\xff\x80\x1e")); | |
103 // Maximum. | |
104 EXPECT_EQ(0x40feu, DecodeValidUint32(8, "\xff\xff\x7f")); | |
105 // Invalid. | |
106 ExpectDecodeUint32Invalid(8, "\xff\x80\x00"); | |
107 ExpectDecodeUint32Invalid(8, "\xff\xff\x00"); | |
108 ExpectDecodeUint32Invalid(8, "\xff\xff\x80"); | |
109 ExpectDecodeUint32Invalid(8, "\xff\xff\xff"); | |
110 } | |
111 | |
112 TEST_F(HpackInputStreamTest, FourByteIntegersEightBitPrefix) { | |
113 // Minimum. | |
114 EXPECT_EQ(0x40ffu, DecodeValidUint32(8, "\xff\x80\x80\x01")); | |
115 EXPECT_EQ(0xffffu, DecodeValidUint32(8, "\xff\x80\xfe\x03")); | |
116 // Maximum. | |
117 EXPECT_EQ(0x002000feu, DecodeValidUint32(8, "\xff\xff\xff\x7f")); | |
118 // Invalid. | |
119 ExpectDecodeUint32Invalid(8, "\xff\xff\x80\x00"); | |
120 ExpectDecodeUint32Invalid(8, "\xff\xff\xff\x00"); | |
121 ExpectDecodeUint32Invalid(8, "\xff\xff\xff\x80"); | |
122 ExpectDecodeUint32Invalid(8, "\xff\xff\xff\xff"); | |
123 } | |
124 | |
125 TEST_F(HpackInputStreamTest, FiveByteIntegersEightBitPrefix) { | |
126 // Minimum. | |
127 EXPECT_EQ(0x002000ffu, DecodeValidUint32(8, "\xff\x80\x80\x80\x01")); | |
128 EXPECT_EQ(0x00ffffffu, DecodeValidUint32(8, "\xff\x80\xfe\xff\x07")); | |
129 // Maximum. | |
130 EXPECT_EQ(0x100000feu, DecodeValidUint32(8, "\xff\xff\xff\xff\x7f")); | |
131 // Invalid. | |
132 ExpectDecodeUint32Invalid(8, "\xff\xff\xff\x80\x00"); | |
133 ExpectDecodeUint32Invalid(8, "\xff\xff\xff\xff\x00"); | |
134 ExpectDecodeUint32Invalid(8, "\xff\xff\xff\xff\x80"); | |
135 ExpectDecodeUint32Invalid(8, "\xff\xff\xff\xff\xff"); | |
136 } | |
137 | |
138 TEST_F(HpackInputStreamTest, SixByteIntegersEightBitPrefix) { | |
139 // Minimum. | |
140 EXPECT_EQ(0x100000ffu, DecodeValidUint32(8, "\xff\x80\x80\x80\x80\x01")); | |
141 // Maximum. | |
142 EXPECT_EQ(0xffffffffu, DecodeValidUint32(8, "\xff\x80\xfe\xff\xff\x0f")); | |
143 // Invalid. | |
144 ExpectDecodeUint32Invalid(8, "\xff\x80\x80\x80\x80\x00"); | |
145 ExpectDecodeUint32Invalid(8, "\xff\x80\xfe\xff\xff\x10"); | |
146 ExpectDecodeUint32Invalid(8, "\xff\xff\xff\xff\xff\xff"); | |
147 } | |
148 | |
149 // There are no valid uint32 encodings that are greater than six | |
150 // bytes. | |
151 TEST_F(HpackInputStreamTest, SevenByteIntegersEightBitPrefix) { | |
152 ExpectDecodeUint32Invalid(8, "\xff\x80\x80\x80\x80\x80\x00"); | |
153 ExpectDecodeUint32Invalid(8, "\xff\x80\x80\x80\x80\x80\x01"); | |
154 ExpectDecodeUint32Invalid(8, "\xff\xff\xff\xff\xff\xff\xff"); | |
155 } | |
156 | |
157 // The {Number}ByteIntegersOneToSevenBitPrefix tests below test that | |
158 // certain integers are encoded correctly with an N-bit prefix in | |
159 // exactly {Number} bytes for N in {1, 2, ..., 7}. | |
160 | |
161 TEST_F(HpackInputStreamTest, OneByteIntegersOneToSevenBitPrefixes) { | |
162 // Minimums. | |
163 EXPECT_EQ(0x00u, DecodeValidUint32(7, string("\x00", 1))); | |
164 EXPECT_EQ(0x00u, DecodeValidUint32(7, string("\x80", 1))); | |
165 EXPECT_EQ(0x00u, DecodeValidUint32(6, string("\x00", 1))); | |
166 EXPECT_EQ(0x00u, DecodeValidUint32(6, string("\xc0", 1))); | |
167 EXPECT_EQ(0x00u, DecodeValidUint32(5, string("\x00", 1))); | |
168 EXPECT_EQ(0x00u, DecodeValidUint32(5, string("\xe0", 1))); | |
169 EXPECT_EQ(0x00u, DecodeValidUint32(4, string("\x00", 1))); | |
170 EXPECT_EQ(0x00u, DecodeValidUint32(4, string("\xf0", 1))); | |
171 EXPECT_EQ(0x00u, DecodeValidUint32(3, string("\x00", 1))); | |
172 EXPECT_EQ(0x00u, DecodeValidUint32(3, string("\xf8", 1))); | |
173 EXPECT_EQ(0x00u, DecodeValidUint32(2, string("\x00", 1))); | |
174 EXPECT_EQ(0x00u, DecodeValidUint32(2, string("\xfc", 1))); | |
175 EXPECT_EQ(0x00u, DecodeValidUint32(1, string("\x00", 1))); | |
176 EXPECT_EQ(0x00u, DecodeValidUint32(1, string("\xfe", 1))); | |
177 | |
178 // Maximums. | |
179 EXPECT_EQ(0x7eu, DecodeValidUint32(7, "\x7e")); | |
180 EXPECT_EQ(0x7eu, DecodeValidUint32(7, "\xfe")); | |
181 EXPECT_EQ(0x3eu, DecodeValidUint32(6, "\x3e")); | |
182 EXPECT_EQ(0x3eu, DecodeValidUint32(6, "\xfe")); | |
183 EXPECT_EQ(0x1eu, DecodeValidUint32(5, "\x1e")); | |
184 EXPECT_EQ(0x1eu, DecodeValidUint32(5, "\xfe")); | |
185 EXPECT_EQ(0x0eu, DecodeValidUint32(4, "\x0e")); | |
186 EXPECT_EQ(0x0eu, DecodeValidUint32(4, "\xfe")); | |
187 EXPECT_EQ(0x06u, DecodeValidUint32(3, "\x06")); | |
188 EXPECT_EQ(0x06u, DecodeValidUint32(3, "\xfe")); | |
189 EXPECT_EQ(0x02u, DecodeValidUint32(2, "\x02")); | |
190 EXPECT_EQ(0x02u, DecodeValidUint32(2, "\xfe")); | |
191 EXPECT_EQ(0x00u, DecodeValidUint32(1, string("\x00", 1))); | |
192 EXPECT_EQ(0x00u, DecodeValidUint32(1, string("\xfe", 1))); | |
193 | |
194 // Invalid. | |
195 ExpectDecodeUint32Invalid(7, "\x7f"); | |
196 ExpectDecodeUint32Invalid(7, "\xff"); | |
197 ExpectDecodeUint32Invalid(6, "\x3f"); | |
198 ExpectDecodeUint32Invalid(6, "\xff"); | |
199 ExpectDecodeUint32Invalid(5, "\x1f"); | |
200 ExpectDecodeUint32Invalid(5, "\xff"); | |
201 ExpectDecodeUint32Invalid(4, "\x0f"); | |
202 ExpectDecodeUint32Invalid(4, "\xff"); | |
203 ExpectDecodeUint32Invalid(3, "\x07"); | |
204 ExpectDecodeUint32Invalid(3, "\xff"); | |
205 ExpectDecodeUint32Invalid(2, "\x03"); | |
206 ExpectDecodeUint32Invalid(2, "\xff"); | |
207 ExpectDecodeUint32Invalid(1, "\x01"); | |
208 ExpectDecodeUint32Invalid(1, "\xff"); | |
209 } | |
210 | |
211 TEST_F(HpackInputStreamTest, TwoByteIntegersOneToSevenBitPrefixes) { | |
212 // Minimums. | |
213 EXPECT_EQ(0x7fu, DecodeValidUint32(7, string("\x7f\x00", 2))); | |
214 EXPECT_EQ(0x7fu, DecodeValidUint32(7, string("\xff\x00", 2))); | |
215 EXPECT_EQ(0x3fu, DecodeValidUint32(6, string("\x3f\x00", 2))); | |
216 EXPECT_EQ(0x3fu, DecodeValidUint32(6, string("\xff\x00", 2))); | |
217 EXPECT_EQ(0x1fu, DecodeValidUint32(5, string("\x1f\x00", 2))); | |
218 EXPECT_EQ(0x1fu, DecodeValidUint32(5, string("\xff\x00", 2))); | |
219 EXPECT_EQ(0x0fu, DecodeValidUint32(4, string("\x0f\x00", 2))); | |
220 EXPECT_EQ(0x0fu, DecodeValidUint32(4, string("\xff\x00", 2))); | |
221 EXPECT_EQ(0x07u, DecodeValidUint32(3, string("\x07\x00", 2))); | |
222 EXPECT_EQ(0x07u, DecodeValidUint32(3, string("\xff\x00", 2))); | |
223 EXPECT_EQ(0x03u, DecodeValidUint32(2, string("\x03\x00", 2))); | |
224 EXPECT_EQ(0x03u, DecodeValidUint32(2, string("\xff\x00", 2))); | |
225 EXPECT_EQ(0x01u, DecodeValidUint32(1, string("\x01\x00", 2))); | |
226 EXPECT_EQ(0x01u, DecodeValidUint32(1, string("\xff\x00", 2))); | |
227 | |
228 // Maximums. | |
229 EXPECT_EQ(0xfeu, DecodeValidUint32(7, "\x7f\x7f")); | |
230 EXPECT_EQ(0xfeu, DecodeValidUint32(7, "\xff\x7f")); | |
231 EXPECT_EQ(0xbeu, DecodeValidUint32(6, "\x3f\x7f")); | |
232 EXPECT_EQ(0xbeu, DecodeValidUint32(6, "\xff\x7f")); | |
233 EXPECT_EQ(0x9eu, DecodeValidUint32(5, "\x1f\x7f")); | |
234 EXPECT_EQ(0x9eu, DecodeValidUint32(5, "\xff\x7f")); | |
235 EXPECT_EQ(0x8eu, DecodeValidUint32(4, "\x0f\x7f")); | |
236 EXPECT_EQ(0x8eu, DecodeValidUint32(4, "\xff\x7f")); | |
237 EXPECT_EQ(0x86u, DecodeValidUint32(3, "\x07\x7f")); | |
238 EXPECT_EQ(0x86u, DecodeValidUint32(3, "\xff\x7f")); | |
239 EXPECT_EQ(0x82u, DecodeValidUint32(2, "\x03\x7f")); | |
240 EXPECT_EQ(0x82u, DecodeValidUint32(2, "\xff\x7f")); | |
241 EXPECT_EQ(0x80u, DecodeValidUint32(1, "\x01\x7f")); | |
242 EXPECT_EQ(0x80u, DecodeValidUint32(1, "\xff\x7f")); | |
243 | |
244 // Invalid. | |
245 ExpectDecodeUint32Invalid(7, "\x7f\x80"); | |
246 ExpectDecodeUint32Invalid(7, "\xff\xff"); | |
247 ExpectDecodeUint32Invalid(6, "\x3f\x80"); | |
248 ExpectDecodeUint32Invalid(6, "\xff\xff"); | |
249 ExpectDecodeUint32Invalid(5, "\x1f\x80"); | |
250 ExpectDecodeUint32Invalid(5, "\xff\xff"); | |
251 ExpectDecodeUint32Invalid(4, "\x0f\x80"); | |
252 ExpectDecodeUint32Invalid(4, "\xff\xff"); | |
253 ExpectDecodeUint32Invalid(3, "\x07\x80"); | |
254 ExpectDecodeUint32Invalid(3, "\xff\xff"); | |
255 ExpectDecodeUint32Invalid(2, "\x03\x80"); | |
256 ExpectDecodeUint32Invalid(2, "\xff\xff"); | |
257 ExpectDecodeUint32Invalid(1, "\x01\x80"); | |
258 ExpectDecodeUint32Invalid(1, "\xff\xff"); | |
259 } | |
260 | |
261 TEST_F(HpackInputStreamTest, ThreeByteIntegersOneToSevenBitPrefixes) { | |
262 // Minimums. | |
263 EXPECT_EQ(0xffu, DecodeValidUint32(7, "\x7f\x80\x01")); | |
264 EXPECT_EQ(0xffu, DecodeValidUint32(7, "\xff\x80\x01")); | |
265 EXPECT_EQ(0xbfu, DecodeValidUint32(6, "\x3f\x80\x01")); | |
266 EXPECT_EQ(0xbfu, DecodeValidUint32(6, "\xff\x80\x01")); | |
267 EXPECT_EQ(0x9fu, DecodeValidUint32(5, "\x1f\x80\x01")); | |
268 EXPECT_EQ(0x9fu, DecodeValidUint32(5, "\xff\x80\x01")); | |
269 EXPECT_EQ(0x8fu, DecodeValidUint32(4, "\x0f\x80\x01")); | |
270 EXPECT_EQ(0x8fu, DecodeValidUint32(4, "\xff\x80\x01")); | |
271 EXPECT_EQ(0x87u, DecodeValidUint32(3, "\x07\x80\x01")); | |
272 EXPECT_EQ(0x87u, DecodeValidUint32(3, "\xff\x80\x01")); | |
273 EXPECT_EQ(0x83u, DecodeValidUint32(2, "\x03\x80\x01")); | |
274 EXPECT_EQ(0x83u, DecodeValidUint32(2, "\xff\x80\x01")); | |
275 EXPECT_EQ(0x81u, DecodeValidUint32(1, "\x01\x80\x01")); | |
276 EXPECT_EQ(0x81u, DecodeValidUint32(1, "\xff\x80\x01")); | |
277 | |
278 // Maximums. | |
279 EXPECT_EQ(0x407eu, DecodeValidUint32(7, "\x7f\xff\x7f")); | |
280 EXPECT_EQ(0x407eu, DecodeValidUint32(7, "\xff\xff\x7f")); | |
281 EXPECT_EQ(0x403eu, DecodeValidUint32(6, "\x3f\xff\x7f")); | |
282 EXPECT_EQ(0x403eu, DecodeValidUint32(6, "\xff\xff\x7f")); | |
283 EXPECT_EQ(0x401eu, DecodeValidUint32(5, "\x1f\xff\x7f")); | |
284 EXPECT_EQ(0x401eu, DecodeValidUint32(5, "\xff\xff\x7f")); | |
285 EXPECT_EQ(0x400eu, DecodeValidUint32(4, "\x0f\xff\x7f")); | |
286 EXPECT_EQ(0x400eu, DecodeValidUint32(4, "\xff\xff\x7f")); | |
287 EXPECT_EQ(0x4006u, DecodeValidUint32(3, "\x07\xff\x7f")); | |
288 EXPECT_EQ(0x4006u, DecodeValidUint32(3, "\xff\xff\x7f")); | |
289 EXPECT_EQ(0x4002u, DecodeValidUint32(2, "\x03\xff\x7f")); | |
290 EXPECT_EQ(0x4002u, DecodeValidUint32(2, "\xff\xff\x7f")); | |
291 EXPECT_EQ(0x4000u, DecodeValidUint32(1, "\x01\xff\x7f")); | |
292 EXPECT_EQ(0x4000u, DecodeValidUint32(1, "\xff\xff\x7f")); | |
293 | |
294 // Invalid. | |
295 ExpectDecodeUint32Invalid(7, "\x7f\xff\x80"); | |
296 ExpectDecodeUint32Invalid(7, "\xff\xff\xff"); | |
297 ExpectDecodeUint32Invalid(6, "\x3f\xff\x80"); | |
298 ExpectDecodeUint32Invalid(6, "\xff\xff\xff"); | |
299 ExpectDecodeUint32Invalid(5, "\x1f\xff\x80"); | |
300 ExpectDecodeUint32Invalid(5, "\xff\xff\xff"); | |
301 ExpectDecodeUint32Invalid(4, "\x0f\xff\x80"); | |
302 ExpectDecodeUint32Invalid(4, "\xff\xff\xff"); | |
303 ExpectDecodeUint32Invalid(3, "\x07\xff\x80"); | |
304 ExpectDecodeUint32Invalid(3, "\xff\xff\xff"); | |
305 ExpectDecodeUint32Invalid(2, "\x03\xff\x80"); | |
306 ExpectDecodeUint32Invalid(2, "\xff\xff\xff"); | |
307 ExpectDecodeUint32Invalid(1, "\x01\xff\x80"); | |
308 ExpectDecodeUint32Invalid(1, "\xff\xff\xff"); | |
309 } | |
310 | |
311 TEST_F(HpackInputStreamTest, FourByteIntegersOneToSevenBitPrefixes) { | |
312 // Minimums. | |
313 EXPECT_EQ(0x407fu, DecodeValidUint32(7, "\x7f\x80\x80\x01")); | |
314 EXPECT_EQ(0x407fu, DecodeValidUint32(7, "\xff\x80\x80\x01")); | |
315 EXPECT_EQ(0x403fu, DecodeValidUint32(6, "\x3f\x80\x80\x01")); | |
316 EXPECT_EQ(0x403fu, DecodeValidUint32(6, "\xff\x80\x80\x01")); | |
317 EXPECT_EQ(0x401fu, DecodeValidUint32(5, "\x1f\x80\x80\x01")); | |
318 EXPECT_EQ(0x401fu, DecodeValidUint32(5, "\xff\x80\x80\x01")); | |
319 EXPECT_EQ(0x400fu, DecodeValidUint32(4, "\x0f\x80\x80\x01")); | |
320 EXPECT_EQ(0x400fu, DecodeValidUint32(4, "\xff\x80\x80\x01")); | |
321 EXPECT_EQ(0x4007u, DecodeValidUint32(3, "\x07\x80\x80\x01")); | |
322 EXPECT_EQ(0x4007u, DecodeValidUint32(3, "\xff\x80\x80\x01")); | |
323 EXPECT_EQ(0x4003u, DecodeValidUint32(2, "\x03\x80\x80\x01")); | |
324 EXPECT_EQ(0x4003u, DecodeValidUint32(2, "\xff\x80\x80\x01")); | |
325 EXPECT_EQ(0x4001u, DecodeValidUint32(1, "\x01\x80\x80\x01")); | |
326 EXPECT_EQ(0x4001u, DecodeValidUint32(1, "\xff\x80\x80\x01")); | |
327 | |
328 // Maximums. | |
329 EXPECT_EQ(0x20007eu, DecodeValidUint32(7, "\x7f\xff\xff\x7f")); | |
330 EXPECT_EQ(0x20007eu, DecodeValidUint32(7, "\xff\xff\xff\x7f")); | |
331 EXPECT_EQ(0x20003eu, DecodeValidUint32(6, "\x3f\xff\xff\x7f")); | |
332 EXPECT_EQ(0x20003eu, DecodeValidUint32(6, "\xff\xff\xff\x7f")); | |
333 EXPECT_EQ(0x20001eu, DecodeValidUint32(5, "\x1f\xff\xff\x7f")); | |
334 EXPECT_EQ(0x20001eu, DecodeValidUint32(5, "\xff\xff\xff\x7f")); | |
335 EXPECT_EQ(0x20000eu, DecodeValidUint32(4, "\x0f\xff\xff\x7f")); | |
336 EXPECT_EQ(0x20000eu, DecodeValidUint32(4, "\xff\xff\xff\x7f")); | |
337 EXPECT_EQ(0x200006u, DecodeValidUint32(3, "\x07\xff\xff\x7f")); | |
338 EXPECT_EQ(0x200006u, DecodeValidUint32(3, "\xff\xff\xff\x7f")); | |
339 EXPECT_EQ(0x200002u, DecodeValidUint32(2, "\x03\xff\xff\x7f")); | |
340 EXPECT_EQ(0x200002u, DecodeValidUint32(2, "\xff\xff\xff\x7f")); | |
341 EXPECT_EQ(0x200000u, DecodeValidUint32(1, "\x01\xff\xff\x7f")); | |
342 EXPECT_EQ(0x200000u, DecodeValidUint32(1, "\xff\xff\xff\x7f")); | |
343 | |
344 // Invalid. | |
345 ExpectDecodeUint32Invalid(7, "\x7f\xff\xff\x80"); | |
346 ExpectDecodeUint32Invalid(7, "\xff\xff\xff\xff"); | |
347 ExpectDecodeUint32Invalid(6, "\x3f\xff\xff\x80"); | |
348 ExpectDecodeUint32Invalid(6, "\xff\xff\xff\xff"); | |
349 ExpectDecodeUint32Invalid(5, "\x1f\xff\xff\x80"); | |
350 ExpectDecodeUint32Invalid(5, "\xff\xff\xff\xff"); | |
351 ExpectDecodeUint32Invalid(4, "\x0f\xff\xff\x80"); | |
352 ExpectDecodeUint32Invalid(4, "\xff\xff\xff\xff"); | |
353 ExpectDecodeUint32Invalid(3, "\x07\xff\xff\x80"); | |
354 ExpectDecodeUint32Invalid(3, "\xff\xff\xff\xff"); | |
355 ExpectDecodeUint32Invalid(2, "\x03\xff\xff\x80"); | |
356 ExpectDecodeUint32Invalid(2, "\xff\xff\xff\xff"); | |
357 ExpectDecodeUint32Invalid(1, "\x01\xff\xff\x80"); | |
358 ExpectDecodeUint32Invalid(1, "\xff\xff\xff\xff"); | |
359 } | |
360 | |
361 TEST_F(HpackInputStreamTest, FiveByteIntegersOneToSevenBitPrefixes) { | |
362 // Minimums. | |
363 EXPECT_EQ(0x20007fu, DecodeValidUint32(7, "\x7f\x80\x80\x80\x01")); | |
364 EXPECT_EQ(0x20007fu, DecodeValidUint32(7, "\xff\x80\x80\x80\x01")); | |
365 EXPECT_EQ(0x20003fu, DecodeValidUint32(6, "\x3f\x80\x80\x80\x01")); | |
366 EXPECT_EQ(0x20003fu, DecodeValidUint32(6, "\xff\x80\x80\x80\x01")); | |
367 EXPECT_EQ(0x20001fu, DecodeValidUint32(5, "\x1f\x80\x80\x80\x01")); | |
368 EXPECT_EQ(0x20001fu, DecodeValidUint32(5, "\xff\x80\x80\x80\x01")); | |
369 EXPECT_EQ(0x20000fu, DecodeValidUint32(4, "\x0f\x80\x80\x80\x01")); | |
370 EXPECT_EQ(0x20000fu, DecodeValidUint32(4, "\xff\x80\x80\x80\x01")); | |
371 EXPECT_EQ(0x200007u, DecodeValidUint32(3, "\x07\x80\x80\x80\x01")); | |
372 EXPECT_EQ(0x200007u, DecodeValidUint32(3, "\xff\x80\x80\x80\x01")); | |
373 EXPECT_EQ(0x200003u, DecodeValidUint32(2, "\x03\x80\x80\x80\x01")); | |
374 EXPECT_EQ(0x200003u, DecodeValidUint32(2, "\xff\x80\x80\x80\x01")); | |
375 EXPECT_EQ(0x200001u, DecodeValidUint32(1, "\x01\x80\x80\x80\x01")); | |
376 EXPECT_EQ(0x200001u, DecodeValidUint32(1, "\xff\x80\x80\x80\x01")); | |
377 | |
378 // Maximums. | |
379 EXPECT_EQ(0x1000007eu, DecodeValidUint32(7, "\x7f\xff\xff\xff\x7f")); | |
380 EXPECT_EQ(0x1000007eu, DecodeValidUint32(7, "\xff\xff\xff\xff\x7f")); | |
381 EXPECT_EQ(0x1000003eu, DecodeValidUint32(6, "\x3f\xff\xff\xff\x7f")); | |
382 EXPECT_EQ(0x1000003eu, DecodeValidUint32(6, "\xff\xff\xff\xff\x7f")); | |
383 EXPECT_EQ(0x1000001eu, DecodeValidUint32(5, "\x1f\xff\xff\xff\x7f")); | |
384 EXPECT_EQ(0x1000001eu, DecodeValidUint32(5, "\xff\xff\xff\xff\x7f")); | |
385 EXPECT_EQ(0x1000000eu, DecodeValidUint32(4, "\x0f\xff\xff\xff\x7f")); | |
386 EXPECT_EQ(0x1000000eu, DecodeValidUint32(4, "\xff\xff\xff\xff\x7f")); | |
387 EXPECT_EQ(0x10000006u, DecodeValidUint32(3, "\x07\xff\xff\xff\x7f")); | |
388 EXPECT_EQ(0x10000006u, DecodeValidUint32(3, "\xff\xff\xff\xff\x7f")); | |
389 EXPECT_EQ(0x10000002u, DecodeValidUint32(2, "\x03\xff\xff\xff\x7f")); | |
390 EXPECT_EQ(0x10000002u, DecodeValidUint32(2, "\xff\xff\xff\xff\x7f")); | |
391 EXPECT_EQ(0x10000000u, DecodeValidUint32(1, "\x01\xff\xff\xff\x7f")); | |
392 EXPECT_EQ(0x10000000u, DecodeValidUint32(1, "\xff\xff\xff\xff\x7f")); | |
393 | |
394 // Invalid. | |
395 ExpectDecodeUint32Invalid(7, "\x7f\xff\xff\xff\x80"); | |
396 ExpectDecodeUint32Invalid(7, "\xff\xff\xff\xff\xff"); | |
397 ExpectDecodeUint32Invalid(6, "\x3f\xff\xff\xff\x80"); | |
398 ExpectDecodeUint32Invalid(6, "\xff\xff\xff\xff\xff"); | |
399 ExpectDecodeUint32Invalid(5, "\x1f\xff\xff\xff\x80"); | |
400 ExpectDecodeUint32Invalid(5, "\xff\xff\xff\xff\xff"); | |
401 ExpectDecodeUint32Invalid(4, "\x0f\xff\xff\xff\x80"); | |
402 ExpectDecodeUint32Invalid(4, "\xff\xff\xff\xff\xff"); | |
403 ExpectDecodeUint32Invalid(3, "\x07\xff\xff\xff\x80"); | |
404 ExpectDecodeUint32Invalid(3, "\xff\xff\xff\xff\xff"); | |
405 ExpectDecodeUint32Invalid(2, "\x03\xff\xff\xff\x80"); | |
406 ExpectDecodeUint32Invalid(2, "\xff\xff\xff\xff\xff"); | |
407 ExpectDecodeUint32Invalid(1, "\x01\xff\xff\xff\x80"); | |
408 ExpectDecodeUint32Invalid(1, "\xff\xff\xff\xff\xff"); | |
409 } | |
410 | |
411 TEST_F(HpackInputStreamTest, SixByteIntegersOneToSevenBitPrefixes) { | |
412 // Minimums. | |
413 EXPECT_EQ(0x1000007fu, DecodeValidUint32(7, "\x7f\x80\x80\x80\x80\x01")); | |
414 EXPECT_EQ(0x1000007fu, DecodeValidUint32(7, "\xff\x80\x80\x80\x80\x01")); | |
415 EXPECT_EQ(0x1000003fu, DecodeValidUint32(6, "\x3f\x80\x80\x80\x80\x01")); | |
416 EXPECT_EQ(0x1000003fu, DecodeValidUint32(6, "\xff\x80\x80\x80\x80\x01")); | |
417 EXPECT_EQ(0x1000001fu, DecodeValidUint32(5, "\x1f\x80\x80\x80\x80\x01")); | |
418 EXPECT_EQ(0x1000001fu, DecodeValidUint32(5, "\xff\x80\x80\x80\x80\x01")); | |
419 EXPECT_EQ(0x1000000fu, DecodeValidUint32(4, "\x0f\x80\x80\x80\x80\x01")); | |
420 EXPECT_EQ(0x1000000fu, DecodeValidUint32(4, "\xff\x80\x80\x80\x80\x01")); | |
421 EXPECT_EQ(0x10000007u, DecodeValidUint32(3, "\x07\x80\x80\x80\x80\x01")); | |
422 EXPECT_EQ(0x10000007u, DecodeValidUint32(3, "\xff\x80\x80\x80\x80\x01")); | |
423 EXPECT_EQ(0x10000003u, DecodeValidUint32(2, "\x03\x80\x80\x80\x80\x01")); | |
424 EXPECT_EQ(0x10000003u, DecodeValidUint32(2, "\xff\x80\x80\x80\x80\x01")); | |
425 EXPECT_EQ(0x10000001u, DecodeValidUint32(1, "\x01\x80\x80\x80\x80\x01")); | |
426 EXPECT_EQ(0x10000001u, DecodeValidUint32(1, "\xff\x80\x80\x80\x80\x01")); | |
427 | |
428 // Maximums. | |
429 EXPECT_EQ(0xffffffffu, DecodeValidUint32(7, "\x7f\x80\xff\xff\xff\x0f")); | |
430 EXPECT_EQ(0xffffffffu, DecodeValidUint32(7, "\xff\x80\xff\xff\xff\x0f")); | |
431 EXPECT_EQ(0xffffffffu, DecodeValidUint32(6, "\x3f\xc0\xff\xff\xff\x0f")); | |
432 EXPECT_EQ(0xffffffffu, DecodeValidUint32(6, "\xff\xc0\xff\xff\xff\x0f")); | |
433 EXPECT_EQ(0xffffffffu, DecodeValidUint32(5, "\x1f\xe0\xff\xff\xff\x0f")); | |
434 EXPECT_EQ(0xffffffffu, DecodeValidUint32(5, "\xff\xe0\xff\xff\xff\x0f")); | |
435 EXPECT_EQ(0xffffffffu, DecodeValidUint32(4, "\x0f\xf0\xff\xff\xff\x0f")); | |
436 EXPECT_EQ(0xffffffffu, DecodeValidUint32(4, "\xff\xf0\xff\xff\xff\x0f")); | |
437 EXPECT_EQ(0xffffffffu, DecodeValidUint32(3, "\x07\xf8\xff\xff\xff\x0f")); | |
438 EXPECT_EQ(0xffffffffu, DecodeValidUint32(3, "\xff\xf8\xff\xff\xff\x0f")); | |
439 EXPECT_EQ(0xffffffffu, DecodeValidUint32(2, "\x03\xfc\xff\xff\xff\x0f")); | |
440 EXPECT_EQ(0xffffffffu, DecodeValidUint32(2, "\xff\xfc\xff\xff\xff\x0f")); | |
441 EXPECT_EQ(0xffffffffu, DecodeValidUint32(1, "\x01\xfe\xff\xff\xff\x0f")); | |
442 EXPECT_EQ(0xffffffffu, DecodeValidUint32(1, "\xff\xfe\xff\xff\xff\x0f")); | |
443 | |
444 // Invalid. | |
445 ExpectDecodeUint32Invalid(7, "\x7f\x80\xff\xff\xff\x10"); | |
446 ExpectDecodeUint32Invalid(7, "\xff\x80\xff\xff\xff\xff"); | |
447 ExpectDecodeUint32Invalid(6, "\x3f\xc0\xff\xff\xff\x10"); | |
448 ExpectDecodeUint32Invalid(6, "\xff\xc0\xff\xff\xff\xff"); | |
449 ExpectDecodeUint32Invalid(5, "\x1f\xe0\xff\xff\xff\x10"); | |
450 ExpectDecodeUint32Invalid(5, "\xff\xe0\xff\xff\xff\xff"); | |
451 ExpectDecodeUint32Invalid(4, "\x0f\xf0\xff\xff\xff\x10"); | |
452 ExpectDecodeUint32Invalid(4, "\xff\xf0\xff\xff\xff\xff"); | |
453 ExpectDecodeUint32Invalid(3, "\x07\xf8\xff\xff\xff\x10"); | |
454 ExpectDecodeUint32Invalid(3, "\xff\xf8\xff\xff\xff\xff"); | |
455 ExpectDecodeUint32Invalid(2, "\x03\xfc\xff\xff\xff\x10"); | |
456 ExpectDecodeUint32Invalid(2, "\xff\xfc\xff\xff\xff\xff"); | |
457 ExpectDecodeUint32Invalid(1, "\x01\xfe\xff\xff\xff\x10"); | |
458 ExpectDecodeUint32Invalid(1, "\xff\xfe\xff\xff\xff\xff"); | |
459 } | |
460 | |
461 // There are no valid uint32 encodings that are greater than six | |
462 // bytes. | |
463 TEST_F(HpackInputStreamTest, SevenByteIntegersOneToSevenBitPrefixes) { | |
464 ExpectDecodeUint32Invalid(7, "\x7f\x80\x80\x80\x80\x80\x00"); | |
465 ExpectDecodeUint32Invalid(7, "\x7f\x80\x80\x80\x80\x80\x01"); | |
466 ExpectDecodeUint32Invalid(7, "\xff\xff\xff\xff\xff\xff\xff"); | |
467 ExpectDecodeUint32Invalid(6, "\x3f\x80\x80\x80\x80\x80\x00"); | |
468 ExpectDecodeUint32Invalid(6, "\x3f\x80\x80\x80\x80\x80\x01"); | |
469 ExpectDecodeUint32Invalid(6, "\xff\xff\xff\xff\xff\xff\xff"); | |
470 ExpectDecodeUint32Invalid(5, "\x1f\x80\x80\x80\x80\x80\x00"); | |
471 ExpectDecodeUint32Invalid(5, "\x1f\x80\x80\x80\x80\x80\x01"); | |
472 ExpectDecodeUint32Invalid(5, "\xff\xff\xff\xff\xff\xff\xff"); | |
473 ExpectDecodeUint32Invalid(4, "\x0f\x80\x80\x80\x80\x80\x00"); | |
474 ExpectDecodeUint32Invalid(4, "\x0f\x80\x80\x80\x80\x80\x01"); | |
475 ExpectDecodeUint32Invalid(4, "\xff\xff\xff\xff\xff\xff\xff"); | |
476 ExpectDecodeUint32Invalid(3, "\x07\x80\x80\x80\x80\x80\x00"); | |
477 ExpectDecodeUint32Invalid(3, "\x07\x80\x80\x80\x80\x80\x01"); | |
478 ExpectDecodeUint32Invalid(3, "\xff\xff\xff\xff\xff\xff\xff"); | |
479 ExpectDecodeUint32Invalid(2, "\x03\x80\x80\x80\x80\x80\x00"); | |
480 ExpectDecodeUint32Invalid(2, "\x03\x80\x80\x80\x80\x80\x01"); | |
481 ExpectDecodeUint32Invalid(2, "\xff\xff\xff\xff\xff\xff\xff"); | |
482 ExpectDecodeUint32Invalid(1, "\x01\x80\x80\x80\x80\x80\x00"); | |
483 ExpectDecodeUint32Invalid(1, "\x01\x80\x80\x80\x80\x80\x01"); | |
484 ExpectDecodeUint32Invalid(1, "\xff\xff\xff\xff\xff\xff\xff"); | |
485 } | |
486 | |
487 // Decoding a valid encoded string literal should work. | |
488 TEST_F(HpackInputStreamTest, DecodeNextIdentityString) { | |
489 HpackInputStream input_stream(kLiteralBound, "\x0estring literal"); | |
490 | |
491 EXPECT_TRUE(input_stream.HasMoreData()); | |
492 StringPiece string_piece; | |
493 EXPECT_TRUE(input_stream.DecodeNextIdentityString(&string_piece)); | |
494 EXPECT_EQ("string literal", string_piece); | |
495 EXPECT_FALSE(input_stream.HasMoreData()); | |
496 } | |
497 | |
498 // Decoding an encoded string literal with size larger than | |
499 // |max_string_literal_size_| should fail. | |
500 TEST_F(HpackInputStreamTest, DecodeNextIdentityStringSizeLimit) { | |
501 HpackInputStream input_stream(13, "\x0estring literal"); | |
502 | |
503 EXPECT_TRUE(input_stream.HasMoreData()); | |
504 StringPiece string_piece; | |
505 EXPECT_FALSE(input_stream.DecodeNextIdentityString(&string_piece)); | |
506 } | |
507 | |
508 // Decoding an encoded string literal with size larger than the | |
509 // remainder of the buffer should fail. | |
510 TEST_F(HpackInputStreamTest, DecodeNextIdentityStringNotEnoughInput) { | |
511 // Set the length to be one more than it should be. | |
512 HpackInputStream input_stream(kLiteralBound, "\x0fstring literal"); | |
513 | |
514 EXPECT_TRUE(input_stream.HasMoreData()); | |
515 StringPiece string_piece; | |
516 EXPECT_FALSE(input_stream.DecodeNextIdentityString(&string_piece)); | |
517 } | |
518 | |
519 TEST_F(HpackInputStreamTest, DecodeNextHuffmanString) { | |
520 string output, input(a2b_hex(kEncodedHuffmanFixture)); | |
521 HpackInputStream input_stream(arraysize(kDecodedHuffmanFixture)-1, input); | |
522 | |
523 EXPECT_TRUE(input_stream.HasMoreData()); | |
524 EXPECT_TRUE(input_stream.DecodeNextHuffmanString(huffman_table_, &output)); | |
525 EXPECT_EQ(kDecodedHuffmanFixture, output); | |
526 EXPECT_FALSE(input_stream.HasMoreData()); | |
527 } | |
528 | |
529 TEST_F(HpackInputStreamTest, DecodeNextHuffmanStringSizeLimit) { | |
530 string output, input(a2b_hex(kEncodedHuffmanFixture)); | |
531 // Max string literal is one byte shorter than the decoded fixture. | |
532 HpackInputStream input_stream(arraysize(kDecodedHuffmanFixture)-2, input); | |
533 | |
534 // Decoded string overflows the max string literal. | |
535 EXPECT_TRUE(input_stream.HasMoreData()); | |
536 EXPECT_FALSE(input_stream.DecodeNextHuffmanString(huffman_table_, &output)); | |
537 } | |
538 | |
539 TEST_F(HpackInputStreamTest, DecodeNextHuffmanStringNotEnoughInput) { | |
540 string output, input(a2b_hex(kEncodedHuffmanFixture)); | |
541 input[0]++; // Input prefix is one byte larger than available input. | |
542 HpackInputStream input_stream(arraysize(kDecodedHuffmanFixture)-1, input); | |
543 | |
544 // Not enough buffer for declared encoded length. | |
545 EXPECT_TRUE(input_stream.HasMoreData()); | |
546 EXPECT_FALSE(input_stream.DecodeNextHuffmanString(huffman_table_, &output)); | |
547 } | |
548 | |
549 TEST_F(HpackInputStreamTest, PeekBitsAndConsume) { | |
550 HpackInputStream input_stream(kLiteralBound, "\xad\xab\xad\xab\xad"); | |
551 | |
552 uint32 bits = 0; | |
553 size_t peeked_count = 0; | |
554 | |
555 // Read 0xad. | |
556 EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits)); | |
557 EXPECT_EQ(bits32("10101101000000000000000000000000"), bits); | |
558 EXPECT_EQ(8u, peeked_count); | |
559 | |
560 // Read 0xab. | |
561 EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits)); | |
562 EXPECT_EQ(bits32("10101101101010110000000000000000"), bits); | |
563 EXPECT_EQ(16u, peeked_count); | |
564 | |
565 input_stream.ConsumeBits(5); | |
566 bits = bits << 5; | |
567 peeked_count -= 5; | |
568 EXPECT_EQ(bits32("10110101011000000000000000000000"), bits); | |
569 EXPECT_EQ(11u, peeked_count); | |
570 | |
571 // Read 0xad. | |
572 EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits)); | |
573 EXPECT_EQ(bits32("10110101011101011010000000000000"), bits); | |
574 EXPECT_EQ(19u, peeked_count); | |
575 | |
576 // Read 0xab. | |
577 EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits)); | |
578 EXPECT_EQ(bits32("10110101011101011011010101100000"), bits); | |
579 EXPECT_EQ(27u, peeked_count); | |
580 | |
581 // Read 0xa, and 1 bit of 0xd | |
582 EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits)); | |
583 EXPECT_EQ(bits32("10110101011101011011010101110101"), bits); | |
584 EXPECT_EQ(32u, peeked_count); | |
585 | |
586 // |bits| is full, and doesn't change. | |
587 EXPECT_FALSE(input_stream.PeekBits(&peeked_count, &bits)); | |
588 EXPECT_EQ(bits32("10110101011101011011010101110101"), bits); | |
589 EXPECT_EQ(32u, peeked_count); | |
590 | |
591 input_stream.ConsumeBits(27); | |
592 bits = bits << 27; | |
593 peeked_count -= 27; | |
594 EXPECT_EQ(bits32("10101000000000000000000000000000"), bits); | |
595 EXPECT_EQ(5u, peeked_count); | |
596 | |
597 // Read remaining 3 bits of 0xd. | |
598 EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits)); | |
599 EXPECT_EQ(bits32("10101101000000000000000000000000"), bits); | |
600 EXPECT_EQ(8u, peeked_count); | |
601 | |
602 // EOF. | |
603 EXPECT_FALSE(input_stream.PeekBits(&peeked_count, &bits)); | |
604 EXPECT_EQ(bits32("10101101000000000000000000000000"), bits); | |
605 EXPECT_EQ(8u, peeked_count); | |
606 | |
607 input_stream.ConsumeBits(8); | |
608 EXPECT_FALSE(input_stream.HasMoreData()); | |
609 } | |
610 | |
611 TEST_F(HpackInputStreamTest, ConsumeByteRemainder) { | |
612 HpackInputStream input_stream(kLiteralBound, "\xad\xab"); | |
613 // Does nothing. | |
614 input_stream.ConsumeByteRemainder(); | |
615 | |
616 // Consumes one byte. | |
617 input_stream.ConsumeBits(3); | |
618 input_stream.ConsumeByteRemainder(); | |
619 EXPECT_TRUE(input_stream.HasMoreData()); | |
620 | |
621 input_stream.ConsumeBits(6); | |
622 EXPECT_TRUE(input_stream.HasMoreData()); | |
623 input_stream.ConsumeByteRemainder(); | |
624 EXPECT_FALSE(input_stream.HasMoreData()); | |
625 } | |
626 | |
627 } // namespace | |
628 | |
629 } // namespace net | |
OLD | NEW |