| Index: net/http/http_network_transaction_unittest.cc
|
| diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
|
| index 13cef372d5242c49b04980287eed0e5ec825c4da..160c9a1a2ba499f8383f7c75d8acacf63c90b66e 100644
|
| --- a/net/http/http_network_transaction_unittest.cc
|
| +++ b/net/http/http_network_transaction_unittest.cc
|
| @@ -289,7 +289,8 @@ class HttpNetworkTransactionTest
|
| // failure should cause the network transaction to resend the request, and the
|
| // other argument should be NULL.
|
| void PreconnectErrorResendRequestTest(const MockWrite* write_failure,
|
| - const MockRead* read_failure);
|
| + const MockRead* read_failure,
|
| + bool use_spdy);
|
|
|
| SimpleGetHelperResult SimpleGetHelperForData(StaticSocketDataProvider* data[],
|
| size_t data_count) {
|
| @@ -1308,46 +1309,81 @@ void HttpNetworkTransactionTest::KeepAliveConnectionResendRequestTest(
|
|
|
| void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
|
| const MockWrite* write_failure,
|
| - const MockRead* read_failure) {
|
| + const MockRead* read_failure,
|
| + bool use_spdy) {
|
| HttpRequestInfo request;
|
| request.method = "GET";
|
| - request.url = GURL("http://www.foo.com/");
|
| + request.url = GURL("https://www.foo.com/");
|
| request.load_flags = 0;
|
|
|
| CapturingNetLog net_log;
|
| session_deps_.net_log = &net_log;
|
| scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
|
|
|
| - // Written data for successfully sending a request.
|
| - MockWrite data1_writes[] = {
|
| - MockWrite("GET / HTTP/1.1\r\n"
|
| - "Host: www.foo.com\r\n"
|
| - "Connection: keep-alive\r\n\r\n"),
|
| - };
|
| + SSLSocketDataProvider ssl1(ASYNC, OK);
|
| + SSLSocketDataProvider ssl2(ASYNC, OK);
|
| + if (use_spdy) {
|
| + ssl1.SetNextProto(GetParam());
|
| + ssl2.SetNextProto(GetParam());
|
| + }
|
| + session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl1);
|
| + session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2);
|
|
|
| - // Read results for the first request.
|
| - MockRead data1_reads[] = {
|
| - MockRead(ASYNC, OK),
|
| - };
|
| + // SPDY versions of the request and response.
|
| + scoped_ptr<SpdyFrame> spdy_request(spdy_util_.ConstructSpdyGet(
|
| + request.url.spec().c_str(), false, 1, DEFAULT_PRIORITY));
|
| + scoped_ptr<SpdyFrame> spdy_response(
|
| + spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
|
| + scoped_ptr<SpdyFrame> spdy_data(
|
| + spdy_util_.ConstructSpdyBodyFrame(1, "hello", 5, true));
|
|
|
| + // HTTP/1.1 versions of the request and response.
|
| + const char kHttpRequest[] = "GET / HTTP/1.1\r\n"
|
| + "Host: www.foo.com\r\n"
|
| + "Connection: keep-alive\r\n\r\n";
|
| + const char kHttpResponse[] = "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n";
|
| + const char kHttpData[] = "hello";
|
| +
|
| + std::vector<MockRead> data1_reads;
|
| + std::vector<MockWrite> data1_writes;
|
| if (write_failure) {
|
| ASSERT_FALSE(read_failure);
|
| - data1_writes[0] = *write_failure;
|
| + data1_writes.push_back(*write_failure);
|
| + data1_reads.push_back(MockRead(ASYNC, OK));
|
| } else {
|
| ASSERT_TRUE(read_failure);
|
| - data1_reads[0] = *read_failure;
|
| + if (use_spdy) {
|
| + data1_writes.push_back(CreateMockWrite(*spdy_request));
|
| + } else {
|
| + data1_writes.push_back(MockWrite(kHttpRequest));
|
| + }
|
| + data1_reads.push_back(*read_failure);
|
| }
|
|
|
| - StaticSocketDataProvider data1(data1_reads, arraysize(data1_reads),
|
| - data1_writes, arraysize(data1_writes));
|
| + StaticSocketDataProvider data1(&data1_reads[0], data1_reads.size(),
|
| + &data1_writes[0], data1_writes.size());
|
| session_deps_.socket_factory->AddSocketDataProvider(&data1);
|
|
|
| - MockRead data2_reads[] = {
|
| - MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"),
|
| - MockRead("hello"),
|
| - MockRead(ASYNC, OK),
|
| - };
|
| - StaticSocketDataProvider data2(data2_reads, arraysize(data2_reads), NULL, 0);
|
| + std::vector<MockRead> data2_reads;
|
| + std::vector<MockWrite> data2_writes;
|
| +
|
| + if (use_spdy) {
|
| + data2_writes.push_back(CreateMockWrite(*spdy_request, 0, ASYNC));
|
| +
|
| + data2_reads.push_back(CreateMockRead(*spdy_response, 1, ASYNC));
|
| + data2_reads.push_back(CreateMockRead(*spdy_data, 2, ASYNC));
|
| + data2_reads.push_back(MockRead(ASYNC, OK, 3));
|
| + } else {
|
| + data2_writes.push_back(
|
| + MockWrite(ASYNC, kHttpRequest, strlen(kHttpRequest), 0));
|
| +
|
| + data2_reads.push_back(
|
| + MockRead(ASYNC, kHttpResponse, strlen(kHttpResponse), 1));
|
| + data2_reads.push_back(MockRead(ASYNC, kHttpData, strlen(kHttpData), 2));
|
| + data2_reads.push_back(MockRead(ASYNC, OK, 3));
|
| + }
|
| + OrderedSocketData data2(&data2_reads[0], data2_reads.size(),
|
| + &data2_writes[0], data2_writes.size());
|
| session_deps_.socket_factory->AddSocketDataProvider(&data2);
|
|
|
| // Preconnect a socket.
|
| @@ -1360,7 +1396,7 @@ void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
|
| // Wait for the preconnect to complete.
|
| // TODO(davidben): Some way to wait for an idle socket count might be handy.
|
| base::RunLoop().RunUntilIdle();
|
| - EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get()));
|
| + EXPECT_EQ(1, GetIdleSocketCountInSSLSocketPool(session.get()));
|
|
|
| // Make the request.
|
| TestCompletionCallback callback;
|
| @@ -1376,7 +1412,9 @@ void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
|
|
|
| LoadTimingInfo load_timing_info;
|
| EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info));
|
| - TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
|
| + TestLoadTimingNotReused(
|
| + load_timing_info,
|
| + CONNECT_TIMING_HAS_DNS_TIMES|CONNECT_TIMING_HAS_SSL_TIMES);
|
|
|
| const HttpResponseInfo* response = trans->GetResponseInfo();
|
| ASSERT_TRUE(response != NULL);
|
| @@ -1387,7 +1425,7 @@ void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
|
| std::string response_data;
|
| rv = ReadTransaction(trans.get(), &response_data);
|
| EXPECT_EQ(OK, rv);
|
| - EXPECT_EQ("hello", response_data);
|
| + EXPECT_EQ(kHttpData, response_data);
|
| }
|
|
|
| TEST_P(HttpNetworkTransactionTest,
|
| @@ -1409,17 +1447,43 @@ TEST_P(HttpNetworkTransactionTest, KeepAliveConnectionEOF) {
|
| TEST_P(HttpNetworkTransactionTest,
|
| PreconnectErrorNotConnectedOnWrite) {
|
| MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED);
|
| - PreconnectErrorResendRequestTest(&write_failure, NULL);
|
| + PreconnectErrorResendRequestTest(&write_failure, NULL, false);
|
| }
|
|
|
| TEST_P(HttpNetworkTransactionTest, PreconnectErrorReset) {
|
| MockRead read_failure(ASYNC, ERR_CONNECTION_RESET);
|
| - PreconnectErrorResendRequestTest(NULL, &read_failure);
|
| + PreconnectErrorResendRequestTest(NULL, &read_failure, false);
|
| }
|
|
|
| TEST_P(HttpNetworkTransactionTest, PreconnectErrorEOF) {
|
| MockRead read_failure(SYNCHRONOUS, OK); // EOF
|
| - PreconnectErrorResendRequestTest(NULL, &read_failure);
|
| + PreconnectErrorResendRequestTest(NULL, &read_failure, false);
|
| +}
|
| +
|
| +TEST_P(HttpNetworkTransactionTest, PreconnectErrorAsyncEOF) {
|
| + MockRead read_failure(ASYNC, OK); // EOF
|
| + PreconnectErrorResendRequestTest(NULL, &read_failure, false);
|
| +}
|
| +
|
| +TEST_P(HttpNetworkTransactionTest,
|
| + SpdyPreconnectErrorNotConnectedOnWrite) {
|
| + MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED);
|
| + PreconnectErrorResendRequestTest(&write_failure, NULL, true);
|
| +}
|
| +
|
| +TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorReset) {
|
| + MockRead read_failure(ASYNC, ERR_CONNECTION_RESET);
|
| + PreconnectErrorResendRequestTest(NULL, &read_failure, true);
|
| +}
|
| +
|
| +TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorEOF) {
|
| + MockRead read_failure(SYNCHRONOUS, OK); // EOF
|
| + PreconnectErrorResendRequestTest(NULL, &read_failure, true);
|
| +}
|
| +
|
| +TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorAsyncEOF) {
|
| + MockRead read_failure(ASYNC, OK); // EOF
|
| + PreconnectErrorResendRequestTest(NULL, &read_failure, true);
|
| }
|
|
|
| TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) {
|
|
|