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 17namespace net { 18 19namespace { 20 21using base::StringPiece; 22using std::string; 23using test::a2b_hex; 24 25const size_t kLiteralBound = 1024; 26 27class 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. 39const char kEncodedHuffmanFixture[] = "2d" // Length prefix. 40 "94e7821dd7f2e6c7b335dfdfcd5b3960" 41 "d5af27087f3672c1ab270fb5291f9587" 42 "316065c003ed4ee5b1063d5007"; 43 44const 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. 49uint32 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. 61void 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 70uint32 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 78TEST_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 88TEST_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 99TEST_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 112TEST_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 125TEST_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 138TEST_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. 151TEST_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 161TEST_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 211TEST_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 261TEST_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 311TEST_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 361TEST_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 411TEST_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. 463TEST_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. 488TEST_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. 500TEST_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. 510TEST_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 519TEST_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 529TEST_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 539TEST_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 549TEST_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 611TEST_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 630