| 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 8f76a7fd80ec766ec224dd582ad7bdf89f9eaee4..11ae2cb63b6f3ffa031eb91ba4648970792fec4c 100644
|
| --- a/net/quic/quic_http_stream_test.cc
|
| +++ b/net/quic/quic_http_stream_test.cc
|
| @@ -144,6 +144,26 @@ class ReadErrorUploadDataStream : public UploadDataStream {
|
| DISALLOW_COPY_AND_ASSIGN(ReadErrorUploadDataStream);
|
| };
|
|
|
| +// A Callback that deletes the QuicHttpStream.
|
| +class DeleteStreamCallback : public TestCompletionCallbackBase {
|
| + public:
|
| + DeleteStreamCallback(std::unique_ptr<QuicHttpStream> stream)
|
| + : stream_(std::move(stream)),
|
| + callback_(base::Bind(&DeleteStreamCallback::DeleteStream,
|
| + base::Unretained(this))) {}
|
| +
|
| + const CompletionCallback& callback() const { return callback_; }
|
| +
|
| + private:
|
| + void DeleteStream(int result) {
|
| + stream_.reset();
|
| + SetResult(result);
|
| + }
|
| +
|
| + std::unique_ptr<QuicHttpStream> stream_;
|
| + CompletionCallback callback_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| class QuicHttpStreamPeer {
|
| @@ -1312,6 +1332,41 @@ TEST_P(QuicHttpStreamTest, CheckPriorityWithNoDelegate) {
|
| EXPECT_EQ(0, stream_->GetTotalReceivedBytes());
|
| }
|
|
|
| +TEST_P(QuicHttpStreamTest, SessionClosedDuringDoLoop) {
|
| + SetRequest("POST", "/", DEFAULT_PRIORITY);
|
| + size_t spdy_request_headers_frame_length;
|
| + AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
|
| + &spdy_request_headers_frame_length));
|
| + AddWrite(
|
| + ConstructClientDataPacket(2, kIncludeVersion, !kFin, 0, kUploadData));
|
| + // Second data write will result in a synchronous failure which will close
|
| + // the session.
|
| + AddWrite(SYNCHRONOUS, ERR_FAILED);
|
| + Initialize();
|
| +
|
| + ChunkedUploadDataStream upload_data_stream(0);
|
| +
|
| + request_.method = "POST";
|
| + request_.url = GURL("http://www.example.org/");
|
| + request_.upload_data_stream = &upload_data_stream;
|
| + ASSERT_EQ(OK, request_.upload_data_stream->Init(
|
| + TestCompletionCallback().callback()));
|
| +
|
| + size_t chunk_size = strlen(kUploadData);
|
| + upload_data_stream.AppendData(kUploadData, chunk_size, false);
|
| + ASSERT_EQ(OK,
|
| + stream_->InitializeStream(&request_, DEFAULT_PRIORITY,
|
| + net_log_.bound(), callback_.callback()));
|
| + QuicHttpStream* stream = stream_.get();
|
| + DeleteStreamCallback delete_stream_callback(std::move(stream_));
|
| + // SendRequest() completes asynchronously after the final chunk is added.
|
| + ASSERT_EQ(ERR_IO_PENDING,
|
| + stream->SendRequest(headers_, &response_, callback_.callback()));
|
| + upload_data_stream.AppendData(kUploadData, chunk_size, true);
|
| + int rv = callback_.WaitForResult();
|
| + EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, rv);
|
| +}
|
| +
|
| TEST_P(QuicHttpStreamTest, SessionClosedBeforeSendHeadersComplete) {
|
| SetRequest("POST", "/", DEFAULT_PRIORITY);
|
| AddWrite(SYNCHRONOUS, ERR_FAILED);
|
|
|