Home | History | Annotate | Download | only in spdy
      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  protected:
     29   virtual void SetUp() {
     30     std::vector<HpackHuffmanSymbol> code = HpackHuffmanCode();
     31     EXPECT_TRUE(huffman_table.Initialize(&code[0], code.size()));
     32   }
     33 
     34   HpackHuffmanTable huffman_table;
     35 };
     36 
     37 // Hex representation of encoded length and Huffman string.
     38 const char kEncodedHuffmanFixture[] = "31"  // Length prefix.
     39   "e0d6cf9f6e8f9fd3e5f6fa76fefd3c7e"
     40   "df9eff1f2f0f3cfe9f6fcf7f8f879f61"
     41   "ad4f4cc9a973a2200ec3725e18b1b74e"
     42   "3f";
     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
    630