Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / net / spdy / hpack_input_stream_test.cc
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   virtual void SetUp() {
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