Index: net/tools/quic/quic_spdy_server_stream_test.cc |
diff --git a/net/tools/quic/quic_spdy_server_stream_test.cc b/net/tools/quic/quic_spdy_server_stream_test.cc |
index dedb272f453a6c69e45ae0ba8e71780d99edd95b..a41989773b4b837a95a3e08e82330320504ab04d 100644 |
--- a/net/tools/quic/quic_spdy_server_stream_test.cc |
+++ b/net/tools/quic/quic_spdy_server_stream_test.cc |
@@ -77,11 +77,13 @@ class QuicSpdyServerStreamPeer : public QuicSpdyServerStream { |
namespace { |
-class QuicSpdyServerStreamTest : public ::testing::Test { |
+class QuicSpdyServerStreamTest : public ::testing::TestWithParam<QuicVersion> { |
public: |
QuicSpdyServerStreamTest() |
: connection_( |
- new StrictMock<MockConnection>(&helper_, Perspective::IS_SERVER)), |
+ new StrictMock<MockConnection>(&helper_, |
+ Perspective::IS_SERVER, |
+ SupportedVersions(GetParam()))), |
session_(connection_), |
body_("hello world") { |
SpdyHeaderBlock request_headers; |
@@ -144,7 +146,11 @@ QuicConsumedData ConsumeAllData( |
return QuicConsumedData(data.total_length, fin); |
} |
-TEST_F(QuicSpdyServerStreamTest, TestFraming) { |
+INSTANTIATE_TEST_CASE_P(Tests, |
+ QuicSpdyServerStreamTest, |
+ ::testing::ValuesIn(QuicSupportedVersions())); |
+ |
+TEST_P(QuicSpdyServerStreamTest, TestFraming) { |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
WillRepeatedly(Invoke(ConsumeAllData)); |
stream_->OnStreamHeaders(headers_string_); |
@@ -157,7 +163,7 @@ TEST_F(QuicSpdyServerStreamTest, TestFraming) { |
EXPECT_EQ(body_, StreamBody()); |
} |
-TEST_F(QuicSpdyServerStreamTest, TestFramingOnePacket) { |
+TEST_P(QuicSpdyServerStreamTest, TestFramingOnePacket) { |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
WillRepeatedly(Invoke(ConsumeAllData)); |
@@ -171,12 +177,13 @@ TEST_F(QuicSpdyServerStreamTest, TestFramingOnePacket) { |
EXPECT_EQ(body_, StreamBody()); |
} |
-TEST_F(QuicSpdyServerStreamTest, TestFramingExtraData) { |
+TEST_P(QuicSpdyServerStreamTest, TestFramingExtraData) { |
string large_body = "hello world!!!!!!"; |
// We'll automatically write out an error (headers + body) |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
WillRepeatedly(Invoke(ConsumeAllData)); |
+ EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
stream_->OnStreamHeaders(headers_string_); |
stream_->OnStreamHeadersComplete(false, headers_string_.size()); |
@@ -185,13 +192,13 @@ TEST_F(QuicSpdyServerStreamTest, TestFramingExtraData) { |
// Content length is still 11. This will register as an error and we won't |
// accept the bytes. |
stream_->OnStreamFrame( |
- QuicStreamFrame(stream_->id(), /*fin=*/false, body_.size(), large_body)); |
+ QuicStreamFrame(stream_->id(), /*fin=*/true, body_.size(), large_body)); |
EXPECT_EQ("11", StreamHeadersValue("content-length")); |
EXPECT_EQ("/", StreamHeadersValue(":path")); |
EXPECT_EQ("POST", StreamHeadersValue(":method")); |
} |
-TEST_F(QuicSpdyServerStreamTest, TestSendResponse) { |
+TEST_P(QuicSpdyServerStreamTest, TestSendResponse) { |
SpdyHeaderBlock* request_headers = stream_->mutable_headers(); |
(*request_headers)[":path"] = "/foo"; |
(*request_headers)[":authority"] = ""; |
@@ -201,6 +208,7 @@ TEST_F(QuicSpdyServerStreamTest, TestSendResponse) { |
response_headers_[":version"] = "HTTP/1.1"; |
response_headers_[":status"] = "200 OK"; |
response_headers_["content-length"] = "3"; |
+ stream_->set_fin_received(true); |
InSequence s; |
EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, 0, false, _, nullptr)); |
@@ -217,10 +225,13 @@ TEST_F(QuicSpdyServerStreamTest, TestSendResponse) { |
EXPECT_TRUE(stream_->write_side_closed()); |
} |
-TEST_F(QuicSpdyServerStreamTest, TestSendErrorResponse) { |
+TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { |
+ EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
+ |
response_headers_[":version"] = "HTTP/1.1"; |
response_headers_[":status"] = "500 Server Error"; |
response_headers_["content-length"] = "3"; |
+ stream_->set_fin_received(true); |
InSequence s; |
EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, 0, false, _, nullptr)); |
@@ -237,7 +248,9 @@ TEST_F(QuicSpdyServerStreamTest, TestSendErrorResponse) { |
EXPECT_TRUE(stream_->write_side_closed()); |
} |
-TEST_F(QuicSpdyServerStreamTest, InvalidMultipleContentLength) { |
+TEST_P(QuicSpdyServerStreamTest, InvalidMultipleContentLength) { |
+ EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
+ |
SpdyHeaderBlock request_headers; |
// \000 is a way to write the null byte when followed by a literal digit. |
request_headers["content-length"] = StringPiece("11\00012", 5); |
@@ -247,20 +260,17 @@ TEST_F(QuicSpdyServerStreamTest, InvalidMultipleContentLength) { |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.Times(AnyNumber()) |
.WillRepeatedly(Invoke(ConsumeAllData)); |
- |
stream_->OnStreamHeaders(headers_string_); |
- stream_->OnStreamHeadersComplete(false, headers_string_.size()); |
+ stream_->OnStreamHeadersComplete(true, headers_string_.size()); |
- if (!FLAGS_quic_implement_stop_reading) { |
- EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
- } else { |
- EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
- } |
+ EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
EXPECT_TRUE(stream_->reading_stopped()); |
EXPECT_TRUE(stream_->write_side_closed()); |
} |
-TEST_F(QuicSpdyServerStreamTest, InvalidLeadingNullContentLength) { |
+TEST_P(QuicSpdyServerStreamTest, InvalidLeadingNullContentLength) { |
+ EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
+ |
SpdyHeaderBlock request_headers; |
// \000 is a way to write the null byte when followed by a literal digit. |
request_headers["content-length"] = StringPiece("\00012", 3); |
@@ -270,20 +280,15 @@ TEST_F(QuicSpdyServerStreamTest, InvalidLeadingNullContentLength) { |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.Times(AnyNumber()) |
.WillRepeatedly(Invoke(ConsumeAllData)); |
- |
stream_->OnStreamHeaders(headers_string_); |
- stream_->OnStreamHeadersComplete(false, headers_string_.size()); |
+ stream_->OnStreamHeadersComplete(true, headers_string_.size()); |
- if (!FLAGS_quic_implement_stop_reading) { |
- EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
- } else { |
- EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
- } |
+ EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
EXPECT_TRUE(stream_->reading_stopped()); |
EXPECT_TRUE(stream_->write_side_closed()); |
} |
-TEST_F(QuicSpdyServerStreamTest, ValidMultipleContentLength) { |
+TEST_P(QuicSpdyServerStreamTest, ValidMultipleContentLength) { |
SpdyHeaderBlock request_headers; |
// \000 is a way to write the null byte when followed by a literal digit. |
request_headers["content-length"] = StringPiece("11\00011", 5); |
@@ -299,7 +304,46 @@ TEST_F(QuicSpdyServerStreamTest, ValidMultipleContentLength) { |
EXPECT_FALSE(stream_->write_side_closed()); |
} |
-TEST_F(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { |
+TEST_P(QuicSpdyServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { |
+ response_headers_[":version"] = "HTTP/1.1"; |
+ response_headers_[":status"] = "500 Server Error"; |
+ response_headers_["content-length"] = "3"; |
+ |
+ InSequence s; |
+ |
+ EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, 0, false, _, nullptr)); |
+ EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
+ .Times(1) |
+ .WillOnce(Return(QuicConsumedData(3, true))); |
+ if (GetParam() > QUIC_VERSION_28) { |
+ EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(1); |
+ } else { |
+ EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
+ } |
+ EXPECT_FALSE(stream_->fin_received()); |
+ QuicSpdyServerStreamPeer::SendErrorResponse(stream_); |
+ EXPECT_TRUE(stream_->reading_stopped()); |
+ EXPECT_TRUE(stream_->write_side_closed()); |
+} |
+ |
+TEST_P(QuicSpdyServerStreamTest, DoNotSendQuicRstStreamNoErrorWithRstReceived) { |
+ response_headers_[":version"] = "HTTP/1.1"; |
+ response_headers_[":status"] = "500 Server Error"; |
+ response_headers_["content-length"] = "3"; |
+ |
+ InSequence s; |
+ EXPECT_FALSE(stream_->reading_stopped()); |
+ |
+ EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
+ EXPECT_CALL(session_, SendRstStream(_, QUIC_RST_ACKNOWLEDGEMENT, _)).Times(1); |
+ QuicRstStreamFrame rst_frame(stream_->id(), QUIC_STREAM_CANCELLED, 1234); |
+ stream_->OnStreamReset(rst_frame); |
+ |
+ EXPECT_TRUE(stream_->reading_stopped()); |
+ EXPECT_TRUE(stream_->write_side_closed()); |
+} |
+ |
+TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { |
char arr[] = { |
0x3a, 0x68, 0x6f, 0x73, // :hos |
0x74, 0x00, 0x00, 0x00, // t... |