Index: net/spdy/spdy_headers_block_parser_test.cc |
diff --git a/net/spdy/spdy_headers_block_parser_test.cc b/net/spdy/spdy_headers_block_parser_test.cc |
index e2fdb311a1bbc268f6df018cbbca80486e52bb2a..81338883ef50732e8f29ed4f035ccdbf374e7159 100644 |
--- a/net/spdy/spdy_headers_block_parser_test.cc |
+++ b/net/spdy/spdy_headers_block_parser_test.cc |
@@ -9,6 +9,7 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/sys_byteorder.h" |
+#include "net/test/gtest_util.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -22,12 +23,9 @@ using std::string; |
// and call the callback methods when we should. |
class MockSpdyHeadersHandler : public SpdyHeadersHandlerInterface { |
public: |
- MOCK_METHOD2(OnHeaderBlock, void(SpdyStreamId stream_id, |
- uint32_t num_of_headers)); |
- MOCK_METHOD2(OnHeaderBlockEnd, void(SpdyStreamId stream_id, size_t bytes)); |
- MOCK_METHOD3(OnHeader, void(SpdyStreamId stream_id, |
- StringPiece, |
- StringPiece)); |
+ MOCK_METHOD1(OnHeaderBlock, void(uint32_t num_of_headers)); |
+ MOCK_METHOD1(OnHeaderBlockEnd, void(size_t bytes)); |
+ MOCK_METHOD2(OnHeader, void(StringPiece key, StringPiece value)); |
}; |
class SpdyHeadersBlockParserTest : |
@@ -121,13 +119,13 @@ TEST_P(SpdyHeadersBlockParserTest, BasicTest) { |
// handling a headers block. |
string headers(CreateHeaders(1, false)); |
- EXPECT_CALL(handler_, OnHeaderBlock(1, 1)).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlock(1)).Times(1); |
std::string expect_key = kBaseKey + IntToString(0); |
std::string expect_value = kBaseValue + IntToString(0); |
- EXPECT_CALL(handler_, OnHeader(1, StringPiece(expect_key), |
+ EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key), |
StringPiece(expect_value))).Times(1); |
- EXPECT_CALL(handler_, OnHeaderBlockEnd(1, headers.length())).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1); |
EXPECT_TRUE(parser_-> |
HandleControlFrameHeadersData(1, headers.c_str(), headers.length())); |
@@ -139,13 +137,13 @@ TEST_P(SpdyHeadersBlockParserTest, NullsSupportedTest) { |
// a single key-value pair when the key and value contain null charecters. |
string headers(CreateHeaders(1, true)); |
- EXPECT_CALL(handler_, OnHeaderBlock(1, 1)).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlock(1)).Times(1); |
std::string expect_key = kBaseKey + string("\0", 1) + IntToString(0); |
std::string expect_value = kBaseValue + string("\0", 1) + IntToString(0); |
- EXPECT_CALL(handler_, OnHeader(1, StringPiece(expect_key), |
+ EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key), |
StringPiece(expect_value))).Times(1); |
- EXPECT_CALL(handler_, OnHeaderBlockEnd(1, headers.length())).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1); |
EXPECT_TRUE(parser_-> |
HandleControlFrameHeadersData(1, headers.c_str(), headers.length())); |
@@ -166,17 +164,16 @@ TEST_P(SpdyHeadersBlockParserTest, MultipleBlocksAndHeadersWithPartialData) { |
} |
// For each block we expect to parse out the headers in order. |
for (int i = 0; i < kNumHeaderBlocks; i++) { |
- EXPECT_CALL(handler_, OnHeaderBlock(i, kNumHeadersInBlock)).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlock(kNumHeadersInBlock)).Times(1); |
for (int j = 0; j < kNumHeadersInBlock; j++) { |
EXPECT_CALL(handler_, OnHeader( |
- i, |
StringPiece(retained_arguments[2 * j]), |
StringPiece(retained_arguments[2 * j + 1]))).Times(1); |
} |
- EXPECT_CALL(handler_, OnHeaderBlockEnd(i, headers.length())).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1); |
} |
// Parse the header blocks, feeding the parser one byte at a time. |
- for (int i = 0; i < kNumHeaderBlocks; i++) { |
+ for (int i = 1; i <= kNumHeaderBlocks; i++) { |
for (string::iterator it = headers.begin(); it != headers.end(); ++it) { |
if ((it + 1) == headers.end()) { |
// Last byte completes the block. |
@@ -191,15 +188,15 @@ TEST_P(SpdyHeadersBlockParserTest, MultipleBlocksAndHeadersWithPartialData) { |
} |
TEST_P(SpdyHeadersBlockParserTest, HandlesEmptyCallsTest) { |
- EXPECT_CALL(handler_, OnHeaderBlock(1, 1)).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlock(1)).Times(1); |
string headers(CreateHeaders(1, false)); |
string expect_key = kBaseKey + IntToString(0); |
string expect_value = kBaseValue + IntToString(0); |
- EXPECT_CALL(handler_, OnHeader(1, StringPiece(expect_key), |
+ EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key), |
StringPiece(expect_value))).Times(1); |
- EXPECT_CALL(handler_, OnHeaderBlockEnd(1, headers.length())).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1); |
// Send a header in pieces with intermediate empty calls. |
for (string::iterator it = headers.begin(); it != headers.end(); ++it) { |
@@ -228,7 +225,7 @@ TEST_P(SpdyHeadersBlockParserTest, LargeBlocksDiscardedTest) { |
parser_.reset(new SpdyHeadersBlockParser(spdy_version_, &handler_)); |
// Header block with one header, which has a too-long key. |
{ |
- EXPECT_CALL(handler_, OnHeaderBlock(1, 1)).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlock(1)).Times(1); |
string headers = EncodeLength(1) + EncodeLength( |
SpdyHeadersBlockParser::kMaximumFieldLength + 1); |
@@ -242,17 +239,39 @@ TEST_P(SpdyHeadersBlockParserTest, LargeBlocksDiscardedTest) { |
TEST_P(SpdyHeadersBlockParserTest, ExtraDataTest) { |
string headers = CreateHeaders(1, false) + "foobar"; |
- EXPECT_CALL(handler_, OnHeaderBlock(1, 1)).Times(1); |
- EXPECT_CALL(handler_, OnHeaderBlockEnd(1, headers.length())).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlock(1)).Times(1); |
+ EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1); |
string expect_key = kBaseKey + IntToString(0); |
string expect_value = kBaseValue + IntToString(0); |
- EXPECT_CALL(handler_, OnHeader(1, StringPiece(expect_key), |
+ EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key), |
StringPiece(expect_value))).Times(1); |
- EXPECT_FALSE(parser_-> |
- HandleControlFrameHeadersData(1, headers.c_str(), headers.length())); |
+ EXPECT_FALSE(parser_->HandleControlFrameHeadersData(1, headers.c_str(), |
+ headers.length())); |
EXPECT_EQ(SpdyHeadersBlockParser::TOO_MUCH_DATA, parser_->get_error()); |
} |
+TEST_P(SpdyHeadersBlockParserTest, WrongStreamIdTest) { |
+ string headers(CreateHeaders(kNumHeadersInBlock, false)); |
+ EXPECT_FALSE(parser_->HandleControlFrameHeadersData(1, headers.data(), 1)); |
+ EXPECT_EQ(SpdyHeadersBlockParser::NEED_MORE_DATA, parser_->get_error()); |
+ bool result; |
+ EXPECT_DFATAL( |
+ result = parser_->HandleControlFrameHeadersData(2, headers.data() + 1, 1), |
+ "Unexpected stream id: 2 \\(expected 1\\)"); |
+ EXPECT_FALSE(result); |
+ EXPECT_EQ(SpdyHeadersBlockParser::UNEXPECTED_STREAM_ID, parser_->get_error()); |
+} |
+ |
+TEST_P(SpdyHeadersBlockParserTest, InvalidStreamIdTest) { |
+ string headers(CreateHeaders(kNumHeadersInBlock, false)); |
+ bool result; |
+ EXPECT_DFATAL( |
+ result = parser_->HandleControlFrameHeadersData(0, headers.data(), 1), |
+ "Expected nonzero stream id, saw: 0"); |
+ EXPECT_FALSE(result); |
+ EXPECT_EQ(SpdyHeadersBlockParser::UNEXPECTED_STREAM_ID, parser_->get_error()); |
+} |
+ |
} // namespace net |