Index: net/quic/chromium/quic_chromium_client_session_test.cc |
diff --git a/net/quic/chromium/quic_chromium_client_session_test.cc b/net/quic/chromium/quic_chromium_client_session_test.cc |
index ffae007acabad7d72db61bafc0c80285757dfc2c..3d85ddd620beefd2d2fa8e524bafa33dc2856f1c 100644 |
--- a/net/quic/chromium/quic_chromium_client_session_test.cc |
+++ b/net/quic/chromium/quic_chromium_client_session_test.cc |
@@ -318,6 +318,64 @@ TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) { |
EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
} |
+TEST_P(QuicChromiumClientSessionTest, ConnectionCloseBeforeStreamRequest) { |
+ MockQuicData quic_data; |
+ quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
+ quic_data.AddRead(server_maker_.MakeConnectionClosePacket(1)); |
+ quic_data.AddSocketDataToFactory(&socket_factory_); |
+ |
+ Initialize(); |
+ CompleteCryptoHandshake(); |
+ |
+ // Pump the message loop to read the connection close packet. |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ // Request a stream and verify that it failed. |
+ std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
+ session_->CreateStreamRequest(); |
+ TestCompletionCallback callback; |
+ ASSERT_EQ(ERR_CONNECTION_CLOSED, |
+ stream_request->StartRequest(callback.callback())); |
+ |
+ EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
+ EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
+} |
+ |
+TEST_P(QuicChromiumClientSessionTest, ConnectionCloseWithPendingStreamRequest) { |
+ MockQuicData quic_data; |
+ quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
+ quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
+ quic_data.AddRead(server_maker_.MakeConnectionClosePacket(1)); |
+ quic_data.AddSocketDataToFactory(&socket_factory_); |
+ |
+ Initialize(); |
+ CompleteCryptoHandshake(); |
+ |
+ // Open the maximum number of streams so that a subsequent request |
+ // can not proceed immediately. |
+ const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
+ for (size_t i = 0; i < kMaxOpenStreams; i++) { |
+ session_->CreateOutgoingDynamicStream(kDefaultPriority); |
+ } |
+ EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); |
+ |
+ // Request a stream and verify that it's pending. |
+ std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
+ session_->CreateStreamRequest(); |
+ TestCompletionCallback callback; |
+ ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
+ |
+ // Close the connection and verify that the StreamRequest completes with |
+ // an error. |
+ quic_data.Resume(); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); |
+ |
+ EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
+ EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
+} |
+ |
TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) { |
MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
std::unique_ptr<QuicEncryptedPacket> settings_packet( |