Index: net/quic/quic_network_transaction_unittest.cc |
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc |
index 5830e564627513ed958e70d40d4b54e0addaeb65..dd0bdb7b28a289caea4416d195bd2260be7397f1 100644 |
--- a/net/quic/quic_network_transaction_unittest.cc |
+++ b/net/quic/quic_network_transaction_unittest.cc |
@@ -838,5 +838,56 @@ TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { |
EXPECT_TRUE(quic_data.at_write_eof()); |
} |
+TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) { |
+ HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. |
+ |
+ QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3; |
+ MockQuicData mock_quic_data; |
+ mock_quic_data.AddRead(ConstructConnectionClosePacket(1)); |
+ if (GetParam() > QUIC_VERSION_12) { |
+ mock_quic_data.AddWrite( |
+ ConstructRequestHeadersPacket(1, stream_id, true, true, |
+ GetRequestHeaders("GET", "http", "/"))); |
+ mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
+ } else { |
+ mock_quic_data.AddWrite( |
+ ConstructDataPacket(1, stream_id, true, true, 0, |
+ GetRequestString("GET", "http", "/"))); |
+ mock_quic_data.AddWrite(ConstructAckPacket(1, 0)); |
+ } |
+ mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); |
+ |
+ // When the QUIC connection fails, we will try the request again over HTTP. |
+ MockRead http_reads[] = { |
+ MockRead("HTTP/1.1 200 OK\r\n"), |
+ MockRead(kQuicAlternateProtocolHttpHeader), |
+ MockRead("hello world"), |
+ MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
+ MockRead(ASYNC, OK) |
+ }; |
+ |
+ StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
+ NULL, 0); |
+ socket_factory_.AddSocketDataProvider(&http_data); |
+ |
+ // In order for a new QUIC session to be established via alternate-protocol |
+ // without racing an HTTP connection, we need the host resolution to happen |
+ // synchronously. |
+ host_resolver_.set_synchronous_mode(true); |
+ host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
+ HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
+ AddressList address; |
+ host_resolver_.Resolve(info, |
+ DEFAULT_PRIORITY, |
+ &address, |
+ CompletionCallback(), |
+ NULL, |
+ net_log_.bound()); |
+ |
+ CreateSession(); |
+ AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
+ SendRequestAndExpectHttpResponse("hello world"); |
+} |
+ |
} // namespace test |
} // namespace net |