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

Unified Diff: net/tools/quic/quic_spdy_server_stream_test.cc

Issue 1413373013: Quic streams honor RST_STREAM + NO_ERROR on the write side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@106851267
Patch Set: Created 5 years, 1 month 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/tools/quic/end_to_end_test.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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...
« no previous file with comments | « net/tools/quic/end_to_end_test.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698