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

Unified Diff: net/spdy/hpack/hpack_input_stream_test.cc

Issue 1568423002: Implement better HPACK Huffman code decoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Do not use binary literals. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/spdy/hpack/hpack_input_stream.cc ('k') | net/spdy/hpack/hpack_round_trip_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/spdy/hpack/hpack_input_stream_test.cc
diff --git a/net/spdy/hpack/hpack_input_stream_test.cc b/net/spdy/hpack/hpack_input_stream_test.cc
index 6c4108f451c46c56e26362adb7dc37aa5e884645..1b68754080e386876c5868c39c7ab9a5d6001da1 100644
--- a/net/spdy/hpack/hpack_input_stream_test.cc
+++ b/net/spdy/hpack/hpack_input_stream_test.cc
@@ -12,6 +12,7 @@
#include "base/strings/string_piece.h"
#include "net/spdy/hpack/hpack_constants.h"
#include "net/spdy/spdy_test_utils.h"
+#include "net/test/gtest_util.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
@@ -24,17 +25,6 @@ using test::a2b_hex;
const size_t kLiteralBound = 1024;
-class HpackInputStreamTest : public ::testing::Test {
- public:
- void SetUp() override {
- std::vector<HpackHuffmanSymbol> code = HpackHuffmanCode();
- EXPECT_TRUE(huffman_table_.Initialize(&code[0], code.size()));
- }
-
- protected:
- HpackHuffmanTable huffman_table_;
-};
-
// Hex representation of encoded length and Huffman string.
const char kEncodedHuffmanFixture[] =
"2d" // Length prefix.
@@ -76,7 +66,7 @@ uint32_t bits32(const string& bitstring) {
// certain integers are decoded correctly with an 8-bit prefix in
// exactly {Number} bytes.
-TEST_F(HpackInputStreamTest, OneByteIntegersEightBitPrefix) {
+TEST(HpackInputStreamTest, OneByteIntegersEightBitPrefix) {
// Minimum.
EXPECT_EQ(0x00u, DecodeValidUint32(8, string("\x00", 1)));
EXPECT_EQ(0x7fu, DecodeValidUint32(8, "\x7f"));
@@ -86,7 +76,7 @@ TEST_F(HpackInputStreamTest, OneByteIntegersEightBitPrefix) {
ExpectDecodeUint32Invalid(8, "\xff");
}
-TEST_F(HpackInputStreamTest, TwoByteIntegersEightBitPrefix) {
+TEST(HpackInputStreamTest, TwoByteIntegersEightBitPrefix) {
// Minimum.
EXPECT_EQ(0xffu, DecodeValidUint32(8, string("\xff\x00", 2)));
EXPECT_EQ(0x0100u, DecodeValidUint32(8, "\xff\x01"));
@@ -97,7 +87,7 @@ TEST_F(HpackInputStreamTest, TwoByteIntegersEightBitPrefix) {
ExpectDecodeUint32Invalid(8, "\xff\xff");
}
-TEST_F(HpackInputStreamTest, ThreeByteIntegersEightBitPrefix) {
+TEST(HpackInputStreamTest, ThreeByteIntegersEightBitPrefix) {
// Minimum.
EXPECT_EQ(0x017fu, DecodeValidUint32(8, "\xff\x80\x01"));
EXPECT_EQ(0x0fffu, DecodeValidUint32(8, "\xff\x80\x1e"));
@@ -110,7 +100,7 @@ TEST_F(HpackInputStreamTest, ThreeByteIntegersEightBitPrefix) {
ExpectDecodeUint32Invalid(8, "\xff\xff\xff");
}
-TEST_F(HpackInputStreamTest, FourByteIntegersEightBitPrefix) {
+TEST(HpackInputStreamTest, FourByteIntegersEightBitPrefix) {
// Minimum.
EXPECT_EQ(0x40ffu, DecodeValidUint32(8, "\xff\x80\x80\x01"));
EXPECT_EQ(0xffffu, DecodeValidUint32(8, "\xff\x80\xfe\x03"));
@@ -123,7 +113,7 @@ TEST_F(HpackInputStreamTest, FourByteIntegersEightBitPrefix) {
ExpectDecodeUint32Invalid(8, "\xff\xff\xff\xff");
}
-TEST_F(HpackInputStreamTest, FiveByteIntegersEightBitPrefix) {
+TEST(HpackInputStreamTest, FiveByteIntegersEightBitPrefix) {
// Minimum.
EXPECT_EQ(0x002000ffu, DecodeValidUint32(8, "\xff\x80\x80\x80\x01"));
EXPECT_EQ(0x00ffffffu, DecodeValidUint32(8, "\xff\x80\xfe\xff\x07"));
@@ -136,7 +126,7 @@ TEST_F(HpackInputStreamTest, FiveByteIntegersEightBitPrefix) {
ExpectDecodeUint32Invalid(8, "\xff\xff\xff\xff\xff");
}
-TEST_F(HpackInputStreamTest, SixByteIntegersEightBitPrefix) {
+TEST(HpackInputStreamTest, SixByteIntegersEightBitPrefix) {
// Minimum.
EXPECT_EQ(0x100000ffu, DecodeValidUint32(8, "\xff\x80\x80\x80\x80\x01"));
// Maximum.
@@ -149,7 +139,7 @@ TEST_F(HpackInputStreamTest, SixByteIntegersEightBitPrefix) {
// There are no valid uint32_t encodings that are greater than six
// bytes.
-TEST_F(HpackInputStreamTest, SevenByteIntegersEightBitPrefix) {
+TEST(HpackInputStreamTest, SevenByteIntegersEightBitPrefix) {
ExpectDecodeUint32Invalid(8, "\xff\x80\x80\x80\x80\x80\x00");
ExpectDecodeUint32Invalid(8, "\xff\x80\x80\x80\x80\x80\x01");
ExpectDecodeUint32Invalid(8, "\xff\xff\xff\xff\xff\xff\xff");
@@ -159,7 +149,7 @@ TEST_F(HpackInputStreamTest, SevenByteIntegersEightBitPrefix) {
// certain integers are encoded correctly with an N-bit prefix in
// exactly {Number} bytes for N in {1, 2, ..., 7}.
-TEST_F(HpackInputStreamTest, OneByteIntegersOneToSevenBitPrefixes) {
+TEST(HpackInputStreamTest, OneByteIntegersOneToSevenBitPrefixes) {
// Minimums.
EXPECT_EQ(0x00u, DecodeValidUint32(7, string("\x00", 1)));
EXPECT_EQ(0x00u, DecodeValidUint32(7, "\x80"));
@@ -209,7 +199,7 @@ TEST_F(HpackInputStreamTest, OneByteIntegersOneToSevenBitPrefixes) {
ExpectDecodeUint32Invalid(1, "\xff");
}
-TEST_F(HpackInputStreamTest, TwoByteIntegersOneToSevenBitPrefixes) {
+TEST(HpackInputStreamTest, TwoByteIntegersOneToSevenBitPrefixes) {
// Minimums.
EXPECT_EQ(0x7fu, DecodeValidUint32(7, string("\x7f\x00", 2)));
EXPECT_EQ(0x7fu, DecodeValidUint32(7, string("\xff\x00", 2)));
@@ -259,7 +249,7 @@ TEST_F(HpackInputStreamTest, TwoByteIntegersOneToSevenBitPrefixes) {
ExpectDecodeUint32Invalid(1, "\xff\xff");
}
-TEST_F(HpackInputStreamTest, ThreeByteIntegersOneToSevenBitPrefixes) {
+TEST(HpackInputStreamTest, ThreeByteIntegersOneToSevenBitPrefixes) {
// Minimums.
EXPECT_EQ(0xffu, DecodeValidUint32(7, "\x7f\x80\x01"));
EXPECT_EQ(0xffu, DecodeValidUint32(7, "\xff\x80\x01"));
@@ -309,7 +299,7 @@ TEST_F(HpackInputStreamTest, ThreeByteIntegersOneToSevenBitPrefixes) {
ExpectDecodeUint32Invalid(1, "\xff\xff\xff");
}
-TEST_F(HpackInputStreamTest, FourByteIntegersOneToSevenBitPrefixes) {
+TEST(HpackInputStreamTest, FourByteIntegersOneToSevenBitPrefixes) {
// Minimums.
EXPECT_EQ(0x407fu, DecodeValidUint32(7, "\x7f\x80\x80\x01"));
EXPECT_EQ(0x407fu, DecodeValidUint32(7, "\xff\x80\x80\x01"));
@@ -359,7 +349,7 @@ TEST_F(HpackInputStreamTest, FourByteIntegersOneToSevenBitPrefixes) {
ExpectDecodeUint32Invalid(1, "\xff\xff\xff\xff");
}
-TEST_F(HpackInputStreamTest, FiveByteIntegersOneToSevenBitPrefixes) {
+TEST(HpackInputStreamTest, FiveByteIntegersOneToSevenBitPrefixes) {
// Minimums.
EXPECT_EQ(0x20007fu, DecodeValidUint32(7, "\x7f\x80\x80\x80\x01"));
EXPECT_EQ(0x20007fu, DecodeValidUint32(7, "\xff\x80\x80\x80\x01"));
@@ -409,7 +399,7 @@ TEST_F(HpackInputStreamTest, FiveByteIntegersOneToSevenBitPrefixes) {
ExpectDecodeUint32Invalid(1, "\xff\xff\xff\xff\xff");
}
-TEST_F(HpackInputStreamTest, SixByteIntegersOneToSevenBitPrefixes) {
+TEST(HpackInputStreamTest, SixByteIntegersOneToSevenBitPrefixes) {
// Minimums.
EXPECT_EQ(0x1000007fu, DecodeValidUint32(7, "\x7f\x80\x80\x80\x80\x01"));
EXPECT_EQ(0x1000007fu, DecodeValidUint32(7, "\xff\x80\x80\x80\x80\x01"));
@@ -461,7 +451,7 @@ TEST_F(HpackInputStreamTest, SixByteIntegersOneToSevenBitPrefixes) {
// There are no valid uint32_t encodings that are greater than six
// bytes.
-TEST_F(HpackInputStreamTest, SevenByteIntegersOneToSevenBitPrefixes) {
+TEST(HpackInputStreamTest, SevenByteIntegersOneToSevenBitPrefixes) {
ExpectDecodeUint32Invalid(7, "\x7f\x80\x80\x80\x80\x80\x00");
ExpectDecodeUint32Invalid(7, "\x7f\x80\x80\x80\x80\x80\x01");
ExpectDecodeUint32Invalid(7, "\xff\xff\xff\xff\xff\xff\xff");
@@ -486,7 +476,7 @@ TEST_F(HpackInputStreamTest, SevenByteIntegersOneToSevenBitPrefixes) {
}
// Decoding a valid encoded string literal should work.
-TEST_F(HpackInputStreamTest, DecodeNextIdentityString) {
+TEST(HpackInputStreamTest, DecodeNextIdentityString) {
HpackInputStream input_stream(kLiteralBound, "\x0estring literal");
EXPECT_TRUE(input_stream.HasMoreData());
@@ -498,7 +488,7 @@ TEST_F(HpackInputStreamTest, DecodeNextIdentityString) {
// Decoding an encoded string literal with size larger than
// |max_string_literal_size_| should fail.
-TEST_F(HpackInputStreamTest, DecodeNextIdentityStringSizeLimit) {
+TEST(HpackInputStreamTest, DecodeNextIdentityStringSizeLimit) {
HpackInputStream input_stream(13, "\x0estring literal");
EXPECT_TRUE(input_stream.HasMoreData());
@@ -508,7 +498,7 @@ TEST_F(HpackInputStreamTest, DecodeNextIdentityStringSizeLimit) {
// Decoding an encoded string literal with size larger than the
// remainder of the buffer should fail.
-TEST_F(HpackInputStreamTest, DecodeNextIdentityStringNotEnoughInput) {
+TEST(HpackInputStreamTest, DecodeNextIdentityStringNotEnoughInput) {
// Set the length to be one more than it should be.
HpackInputStream input_stream(kLiteralBound, "\x0fstring literal");
@@ -517,37 +507,37 @@ TEST_F(HpackInputStreamTest, DecodeNextIdentityStringNotEnoughInput) {
EXPECT_FALSE(input_stream.DecodeNextIdentityString(&string_piece));
}
-TEST_F(HpackInputStreamTest, DecodeNextHuffmanString) {
+TEST(HpackInputStreamTest, DecodeNextHuffmanString) {
string output, input(a2b_hex(kEncodedHuffmanFixture));
HpackInputStream input_stream(arraysize(kDecodedHuffmanFixture) - 1, input);
EXPECT_TRUE(input_stream.HasMoreData());
- EXPECT_TRUE(input_stream.DecodeNextHuffmanString(huffman_table_, &output));
+ EXPECT_TRUE(input_stream.DecodeNextHuffmanString(&output));
EXPECT_EQ(kDecodedHuffmanFixture, output);
EXPECT_FALSE(input_stream.HasMoreData());
}
-TEST_F(HpackInputStreamTest, DecodeNextHuffmanStringSizeLimit) {
+TEST(HpackInputStreamTest, DecodeNextHuffmanStringSizeLimit) {
string output, input(a2b_hex(kEncodedHuffmanFixture));
// Max string literal is one byte shorter than the decoded fixture.
HpackInputStream input_stream(arraysize(kDecodedHuffmanFixture) - 2, input);
// Decoded string overflows the max string literal.
EXPECT_TRUE(input_stream.HasMoreData());
- EXPECT_FALSE(input_stream.DecodeNextHuffmanString(huffman_table_, &output));
+ EXPECT_FALSE(input_stream.DecodeNextHuffmanString(&output));
}
-TEST_F(HpackInputStreamTest, DecodeNextHuffmanStringNotEnoughInput) {
+TEST(HpackInputStreamTest, DecodeNextHuffmanStringNotEnoughInput) {
string output, input(a2b_hex(kEncodedHuffmanFixture));
input[0]++; // Input prefix is one byte larger than available input.
HpackInputStream input_stream(arraysize(kDecodedHuffmanFixture) - 1, input);
// Not enough buffer for declared encoded length.
EXPECT_TRUE(input_stream.HasMoreData());
- EXPECT_FALSE(input_stream.DecodeNextHuffmanString(huffman_table_, &output));
+ EXPECT_FALSE(input_stream.DecodeNextHuffmanString(&output));
}
-TEST_F(HpackInputStreamTest, PeekBitsAndConsume) {
+TEST(HpackInputStreamTest, PeekBitsAndConsume) {
HpackInputStream input_stream(kLiteralBound, "\xad\xab\xad\xab\xad");
uint32_t bits = 0;
@@ -609,7 +599,97 @@ TEST_F(HpackInputStreamTest, PeekBitsAndConsume) {
EXPECT_FALSE(input_stream.HasMoreData());
}
-TEST_F(HpackInputStreamTest, ConsumeByteRemainder) {
+TEST(HpackInputStreamTest, InitializePeekBits) {
+ {
+ // Empty input, peeked_count == 0 and bits == 0.
+ HpackInputStream input_stream(kLiteralBound, "");
+ auto peeked_count_and_bits = input_stream.InitializePeekBits();
+ size_t peeked_count = peeked_count_and_bits.first;
+ uint32_t bits = peeked_count_and_bits.second;
+ EXPECT_EQ(0u, peeked_count);
+ EXPECT_EQ(0u, bits);
+ }
+ {
+ // One input byte, returns peeked_count == 8 and bits
+ // has the input byte in its high order bits.
+ HpackInputStream input_stream(kLiteralBound, "\xfe");
+ auto peeked_count_and_bits = input_stream.InitializePeekBits();
+ size_t peeked_count = peeked_count_and_bits.first;
+ uint32_t bits = peeked_count_and_bits.second;
+ EXPECT_EQ(8u, peeked_count);
+ EXPECT_EQ(0xfe000000, bits);
+ input_stream.ConsumeBits(8);
+ EXPECT_FALSE(input_stream.HasMoreData());
+ }
+ {
+ // Two input bytes, returns peeked_count == 16 and bits
+ // has the two input bytes in its high order bits.
+ HpackInputStream input_stream(kLiteralBound, "\xfe\xdc");
+ auto peeked_count_and_bits = input_stream.InitializePeekBits();
+ size_t peeked_count = peeked_count_and_bits.first;
+ uint32_t bits = peeked_count_and_bits.second;
+ EXPECT_EQ(16u, peeked_count);
+ EXPECT_EQ(0xfedc0000, bits);
+ input_stream.ConsumeBits(16);
+ EXPECT_FALSE(input_stream.HasMoreData());
+ }
+ {
+ // Three input bytes, returns peeked_count == 24 and bits
+ // has the three input bytes in its high order bits.
+ HpackInputStream input_stream(kLiteralBound, "\xab\xcd\xef");
+ auto peeked_count_and_bits = input_stream.InitializePeekBits();
+ size_t peeked_count = peeked_count_and_bits.first;
+ uint32_t bits = peeked_count_and_bits.second;
+ EXPECT_EQ(24u, peeked_count);
+ EXPECT_EQ(0xabcdef00, bits);
+ input_stream.ConsumeBits(24);
+ EXPECT_FALSE(input_stream.HasMoreData());
+ }
+ {
+ // Four input bytes, returns peeked_count == 32 and bits
+ // contains the four input bytes.
+ HpackInputStream input_stream(kLiteralBound, "\xfe\xed\xdc\xcb");
+ auto peeked_count_and_bits = input_stream.InitializePeekBits();
+ size_t peeked_count = peeked_count_and_bits.first;
+ uint32_t bits = peeked_count_and_bits.second;
+ EXPECT_EQ(32u, peeked_count);
+ EXPECT_EQ(0xfeeddccb, bits);
+ input_stream.ConsumeBits(32);
+ EXPECT_FALSE(input_stream.HasMoreData());
+ }
+ {
+ // Five input bytes, returns peeked_count == 32 and bits
+ // contains the first four input bytes.
+ HpackInputStream input_stream(kLiteralBound, "\xfe\xed\xdc\xcb\xba");
+ auto peeked_count_and_bits = input_stream.InitializePeekBits();
+ size_t peeked_count = peeked_count_and_bits.first;
+ uint32_t bits = peeked_count_and_bits.second;
+ EXPECT_EQ(32u, peeked_count);
+ EXPECT_EQ(0xfeeddccb, bits);
+ EXPECT_TRUE(input_stream.HasMoreData());
+
+ // If we consume some bits, then InitializePeekBits will return no bits.
+ input_stream.ConsumeBits(28);
+ peeked_count -= 28;
+ bits <<= 28;
+ EXPECT_EQ(0xb0000000, bits);
+
+ EXPECT_DFATAL(peeked_count_and_bits = input_stream.InitializePeekBits(),
+ "bit_offset_");
+ EXPECT_EQ(0u, peeked_count_and_bits.first);
+ EXPECT_EQ(0u, peeked_count_and_bits.second);
+ EXPECT_TRUE(input_stream.HasMoreData());
+
+ // Can PeekBits, which will get us the last byte's bits.
+ EXPECT_TRUE(input_stream.PeekBits(&peeked_count, &bits));
+ EXPECT_EQ(12u, peeked_count);
+ EXPECT_EQ(0xbba00000, bits);
+ input_stream.ConsumeBits(12);
+ EXPECT_FALSE(input_stream.HasMoreData());
+ }
+}
+
+TEST(HpackInputStreamTest, ConsumeByteRemainder) {
HpackInputStream input_stream(kLiteralBound, "\xad\xab");
// Does nothing.
input_stream.ConsumeByteRemainder();
« no previous file with comments | « net/spdy/hpack/hpack_input_stream.cc ('k') | net/spdy/hpack/hpack_round_trip_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698