Index: net/quic/quic_http_stream_test.cc |
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc |
index a92266b1d6edf1e39ced4154abb353a390f4eb6d..be3364c59aa70d8133223125d80db4ad4d059b4d 100644 |
--- a/net/quic/quic_http_stream_test.cc |
+++ b/net/quic/quic_http_stream_test.cc |
@@ -125,8 +125,10 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<QuicVersion> { |
struct PacketToWrite { |
PacketToWrite(IoMode mode, QuicEncryptedPacket* packet) |
: mode(mode), packet(packet) {} |
+ PacketToWrite(IoMode mode, int rv) : mode(mode), packet(nullptr), rv(rv) {} |
IoMode mode; |
QuicEncryptedPacket* packet; |
+ int rv; |
}; |
QuicHttpStreamTest() |
@@ -157,6 +159,10 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<QuicVersion> { |
writes_.push_back(PacketToWrite(SYNCHRONOUS, packet.release())); |
} |
+ void AddWrite(IoMode mode, int rv) { |
+ writes_.push_back(PacketToWrite(mode, rv)); |
+ } |
+ |
// Returns the packet to be written at position |pos|. |
QuicEncryptedPacket* GetWrite(size_t pos) { return writes_[pos].packet; } |
@@ -173,8 +179,12 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<QuicVersion> { |
void Initialize() { |
mock_writes_.reset(new MockWrite[writes_.size()]); |
for (size_t i = 0; i < writes_.size(); i++) { |
- mock_writes_[i] = MockWrite(writes_[i].mode, writes_[i].packet->data(), |
- writes_[i].packet->length()); |
+ if (writes_[i].packet == nullptr) { |
+ mock_writes_[i] = MockWrite(writes_[i].mode, writes_[i].rv, i); |
+ } else { |
+ mock_writes_[i] = MockWrite(writes_[i].mode, writes_[i].packet->data(), |
+ writes_[i].packet->length()); |
+ } |
}; |
socket_data_.reset(new StaticSocketDataProvider( |
@@ -936,5 +946,48 @@ TEST_P(QuicHttpStreamTest, CheckPriorityWithNoDelegate) { |
EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); |
} |
+TEST_P(QuicHttpStreamTest, SessionClosedBeforeSendHeadersComplete) { |
+ SetRequest("POST", "/", DEFAULT_PRIORITY); |
+ AddWrite(SYNCHRONOUS, ERR_FAILED); |
+ Initialize(); |
+ |
+ ChunkedUploadDataStream upload_data_stream(0); |
+ |
+ request_.method = "POST"; |
+ request_.url = GURL("http://www.google.com/"); |
+ request_.upload_data_stream = &upload_data_stream; |
+ ASSERT_EQ(OK, request_.upload_data_stream->Init( |
+ TestCompletionCallback().callback())); |
+ |
+ ASSERT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, net_log_, |
+ callback_.callback())); |
+ ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR, |
+ stream_->SendRequest(headers_, &response_, callback_.callback())); |
+} |
+ |
+TEST_P(QuicHttpStreamTest, SessionClosedBeforeSendBodyComplete) { |
+ SetRequest("POST", "/", DEFAULT_PRIORITY); |
+ size_t spdy_request_headers_frame_length; |
+ AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY, |
+ &spdy_request_headers_frame_length)); |
+ AddWrite(SYNCHRONOUS, ERR_FAILED); |
+ Initialize(); |
+ |
+ ChunkedUploadDataStream upload_data_stream(0); |
+ size_t chunk_size = strlen(kUploadData); |
+ upload_data_stream.AppendData(kUploadData, chunk_size, false); |
+ |
+ request_.method = "POST"; |
+ request_.url = GURL("http://www.google.com/"); |
+ request_.upload_data_stream = &upload_data_stream; |
+ ASSERT_EQ(OK, request_.upload_data_stream->Init( |
+ TestCompletionCallback().callback())); |
+ |
+ ASSERT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, net_log_, |
+ callback_.callback())); |
+ ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR, |
+ stream_->SendRequest(headers_, &response_, callback_.callback())); |
+} |
+ |
} // namespace test |
} // namespace net |