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

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

Issue 1914193002: Implements incremental decode in HPACK. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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') | no next file » | 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 520f6f73c855ac806ffb8577a8455e54502e4658..a923944a14b5b181d2519aceeb6e9e1a91aebe82 100644
--- a/net/spdy/hpack/hpack_input_stream_test.cc
+++ b/net/spdy/hpack/hpack_input_stream_test.cc
@@ -17,7 +17,7 @@
namespace net {
-namespace {
+namespace test {
using base::StringPiece;
using std::string;
@@ -35,15 +35,33 @@ const char kEncodedHuffmanFixture[] =
const char kDecodedHuffmanFixture[] =
"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1";
+class HpackInputStreamPeer {
+ public:
+ explicit HpackInputStreamPeer(HpackInputStream* input_stream)
+ : input_stream_(input_stream) {}
+
+ void SetBitOffsetForTest(size_t bit_offset) {
+ input_stream_->bit_offset_ = bit_offset;
+ }
+
+ uint32_t ParsedBytesCurrent() { return input_stream_->parsed_bytes_current_; }
+
+ private:
+ HpackInputStream* input_stream_;
+};
+
// Utility function to decode an assumed-valid uint32_t with an N-bit
// prefix.
uint32_t DecodeValidUint32(uint8_t N, StringPiece str) {
EXPECT_GT(N, 0);
EXPECT_LE(N, 8);
HpackInputStream input_stream(kLiteralBound, str);
- input_stream.SetBitOffsetForTest(8 - N);
+ HpackInputStreamPeer input_stream_peer(&input_stream);
+ input_stream_peer.SetBitOffsetForTest(8 - N);
uint32_t I;
EXPECT_TRUE(input_stream.DecodeNextUint32(&I));
+ EXPECT_EQ(str.size(), input_stream_peer.ParsedBytesCurrent());
+ EXPECT_FALSE(input_stream.NeedMoreData());
return I;
}
@@ -53,7 +71,8 @@ void ExpectDecodeUint32Invalid(uint8_t N, StringPiece str) {
EXPECT_GT(N, 0);
EXPECT_LE(N, 8);
HpackInputStream input_stream(kLiteralBound, str);
- input_stream.SetBitOffsetForTest(8 - N);
+ HpackInputStreamPeer input_stream_peer(&input_stream);
+ input_stream_peer.SetBitOffsetForTest(8 - N);
uint32_t I;
EXPECT_FALSE(input_stream.DecodeNextUint32(&I));
}
@@ -478,12 +497,15 @@ TEST(HpackInputStreamTest, SevenByteIntegersOneToSevenBitPrefixes) {
// Decoding a valid encoded string literal should work.
TEST(HpackInputStreamTest, DecodeNextIdentityString) {
HpackInputStream input_stream(kLiteralBound, "\x0estring literal");
+ HpackInputStreamPeer input_stream_peer(&input_stream);
EXPECT_TRUE(input_stream.HasMoreData());
StringPiece string_piece;
EXPECT_TRUE(input_stream.DecodeNextIdentityString(&string_piece));
EXPECT_EQ("string literal", string_piece);
EXPECT_FALSE(input_stream.HasMoreData());
+ EXPECT_EQ(string_piece.size() + 1, input_stream_peer.ParsedBytesCurrent());
+ EXPECT_FALSE(input_stream.NeedMoreData());
}
// Decoding an encoded string literal with size larger than
@@ -494,6 +516,7 @@ TEST(HpackInputStreamTest, DecodeNextIdentityStringSizeLimit) {
EXPECT_TRUE(input_stream.HasMoreData());
StringPiece string_piece;
EXPECT_FALSE(input_stream.DecodeNextIdentityString(&string_piece));
+ EXPECT_FALSE(input_stream.NeedMoreData());
}
// Decoding an encoded string literal with size larger than the
@@ -505,16 +528,20 @@ TEST(HpackInputStreamTest, DecodeNextIdentityStringNotEnoughInput) {
EXPECT_TRUE(input_stream.HasMoreData());
StringPiece string_piece;
EXPECT_FALSE(input_stream.DecodeNextIdentityString(&string_piece));
+ EXPECT_TRUE(input_stream.NeedMoreData());
}
TEST(HpackInputStreamTest, DecodeNextHuffmanString) {
string output, input(a2b_hex(kEncodedHuffmanFixture));
HpackInputStream input_stream(arraysize(kDecodedHuffmanFixture) - 1, input);
+ HpackInputStreamPeer input_stream_peer(&input_stream);
EXPECT_TRUE(input_stream.HasMoreData());
EXPECT_TRUE(input_stream.DecodeNextHuffmanString(&output));
EXPECT_EQ(kDecodedHuffmanFixture, output);
EXPECT_FALSE(input_stream.HasMoreData());
+ EXPECT_FALSE(input_stream.NeedMoreData());
+ EXPECT_EQ(46u, input_stream_peer.ParsedBytesCurrent());
}
TEST(HpackInputStreamTest, DecodeNextHuffmanStringSizeLimit) {
@@ -525,6 +552,7 @@ TEST(HpackInputStreamTest, DecodeNextHuffmanStringSizeLimit) {
// Decoded string overflows the max string literal.
EXPECT_TRUE(input_stream.HasMoreData());
EXPECT_FALSE(input_stream.DecodeNextHuffmanString(&output));
+ EXPECT_FALSE(input_stream.NeedMoreData());
}
TEST(HpackInputStreamTest, DecodeNextHuffmanStringNotEnoughInput) {
@@ -535,6 +563,7 @@ TEST(HpackInputStreamTest, DecodeNextHuffmanStringNotEnoughInput) {
// Not enough buffer for declared encoded length.
EXPECT_TRUE(input_stream.HasMoreData());
EXPECT_FALSE(input_stream.DecodeNextHuffmanString(&output));
+ EXPECT_TRUE(input_stream.NeedMoreData());
}
TEST(HpackInputStreamTest, PeekBitsAndConsume) {
@@ -705,6 +734,75 @@ TEST(HpackInputStreamTest, ConsumeByteRemainder) {
EXPECT_FALSE(input_stream.HasMoreData());
}
-} // namespace
+TEST(HpackInputStreamTest, IncompleteHeaderMatchPrefixAndConsume) {
+ HpackInputStream input_stream(kLiteralBound, "");
+ HpackInputStreamPeer input_stream_peer(&input_stream);
+ EXPECT_FALSE(input_stream.MatchPrefixAndConsume(kIndexedOpcode));
+ EXPECT_EQ(0u, input_stream_peer.ParsedBytesCurrent());
+ EXPECT_TRUE(input_stream.NeedMoreData());
+}
+
+TEST(HpackInputStreamTest, IncompleteHeaderDecodeNextUint32) {
+ // First byte only
+ HpackInputStream input_stream1(kLiteralBound, "\xff");
+ HpackInputStreamPeer input_stream1_peer(&input_stream1);
+ EXPECT_TRUE(input_stream1.MatchPrefixAndConsume(kIndexedOpcode));
+ uint32_t result;
+ EXPECT_FALSE(input_stream1.DecodeNextUint32(&result));
+ EXPECT_TRUE(input_stream1.NeedMoreData());
+ EXPECT_EQ(1u, input_stream1_peer.ParsedBytesCurrent());
+
+ // No last byte
+ HpackInputStream input_stream2(kLiteralBound, "\xff\x80\x80\x80");
+ HpackInputStreamPeer input_stream2_peer(&input_stream2);
+ EXPECT_TRUE(input_stream2.MatchPrefixAndConsume(kIndexedOpcode));
+ EXPECT_FALSE(input_stream2.DecodeNextUint32(&result));
+ EXPECT_TRUE(input_stream2.NeedMoreData());
+ EXPECT_EQ(4u, input_stream2_peer.ParsedBytesCurrent());
+
+ // Error happens before finishing parsing.
+ HpackInputStream input_stream3(kLiteralBound, "\xff\xff\xff\xff\xff\xff\xff");
+ HpackInputStreamPeer input_stream3_peer(&input_stream3);
+ EXPECT_TRUE(input_stream3.MatchPrefixAndConsume(kIndexedOpcode));
+ EXPECT_FALSE(input_stream3.DecodeNextUint32(&result));
+ EXPECT_FALSE(input_stream3.NeedMoreData());
+ EXPECT_EQ(6u, input_stream3_peer.ParsedBytesCurrent());
+}
+
+TEST(HpackInputStreamTest, IncompleteHeaderDecodeNextIdentityString) {
+ HpackInputStream input_stream1(kLiteralBound, "\x0estring litera");
+ HpackInputStreamPeer input_stream1_peer(&input_stream1);
+ StringPiece string_piece;
+ EXPECT_FALSE(input_stream1.DecodeNextIdentityString(&string_piece));
+ // Only parsed first byte.
+ EXPECT_EQ(1u, input_stream1_peer.ParsedBytesCurrent());
+ EXPECT_TRUE(input_stream1.NeedMoreData());
+
+ HpackInputStream input_stream2(kLiteralBound, "\x0e");
+ HpackInputStreamPeer input_stream2_peer(&input_stream2);
+ EXPECT_FALSE(input_stream2.DecodeNextIdentityString(&string_piece));
+ // Only parsed first byte.
+ EXPECT_EQ(1u, input_stream2_peer.ParsedBytesCurrent());
+ EXPECT_TRUE(input_stream2.NeedMoreData());
+}
+
+TEST(HpackInputStreamTest, IncompleteHeaderDecodeNextHuffmanString) {
+ string output, input(a2b_hex(kEncodedHuffmanFixture));
+ input.resize(input.size() - 1); // Remove last byte.
+ HpackInputStream input_stream1(arraysize(kDecodedHuffmanFixture) - 1, input);
+ HpackInputStreamPeer input_stream1_peer(&input_stream1);
+ EXPECT_FALSE(input_stream1.DecodeNextHuffmanString(&output));
+ EXPECT_EQ(1u, input_stream1_peer.ParsedBytesCurrent());
+ EXPECT_TRUE(input_stream1.NeedMoreData());
+
+ input.erase(1, input.size()); // Remove all bytes except the first one.
+ HpackInputStream input_stream2(arraysize(kDecodedHuffmanFixture) - 1, input);
+ HpackInputStreamPeer input_stream2_peer(&input_stream2);
+ EXPECT_FALSE(input_stream2.DecodeNextHuffmanString(&output));
+ EXPECT_EQ(1u, input_stream2_peer.ParsedBytesCurrent());
+ EXPECT_TRUE(input_stream2.NeedMoreData());
+}
+
+} // namespace test
} // namespace net
« no previous file with comments | « net/spdy/hpack/hpack_input_stream.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698