diff options
Diffstat (limited to 'net/http/http_network_transaction_unittest.cc')
-rw-r--r-- | net/http/http_network_transaction_unittest.cc | 282 |
1 files changed, 219 insertions, 63 deletions
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index ecd6132..b238f57 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc @@ -6437,7 +6437,6 @@ TEST_F(HttpNetworkTransactionTest, HonorAlternateProtocolHeader) { EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); EXPECT_FALSE(response->was_fetched_via_spdy); EXPECT_FALSE(response->was_npn_negotiated); - EXPECT_FALSE(response->was_alternate_protocol_available); std::string response_data; ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); @@ -6478,11 +6477,6 @@ TEST_F(HttpNetworkTransactionTest, MarkBrokenAlternateProtocol) { data_reads, arraysize(data_reads), NULL, 0); session_deps.socket_factory.AddSocketDataProvider(&second_data); - // TODO(willchan): Delete this extra data provider. It's necessary due to a - // ClientSocketPoolBaseHelper bug that starts up too many ConnectJobs: - // http://crbug.com/37454. - session_deps.socket_factory.AddSocketDataProvider(&second_data); - TestCompletionCallback callback; scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); @@ -6517,59 +6511,6 @@ TEST_F(HttpNetworkTransactionTest, MarkBrokenAlternateProtocol) { HttpStreamFactory::set_use_alternate_protocols(false); } -// TODO(willchan): Redo this test to use TLS/NPN=>SPDY. Currently, the code -// says that it does SPDY, but it just does the TLS handshake, but the NPN -// response does not indicate SPDY, so we just do standard HTTPS over the port. -// We should add code such that we don't fallback to HTTPS, but fallback to HTTP -// on the original port. -// TEST_F(HttpNetworkTransactionTest, UseAlternateProtocol) { -// SessionDependencies session_deps; -// -// HttpRequestInfo request; -// request.method = "GET"; -// request.url = GURL("http://www.google.com/"); -// request.load_flags = 0; -// -// MockRead data_reads[] = { -// MockRead("HTTP/1.1 200 OK\r\n\r\n"), -// MockRead("hello world"), -// MockRead(true, OK), -// }; -// StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); -// session_deps.socket_factory.AddSocketDataProvider(&data); -// -// SSLSocketDataProvider ssl(true, OK); -// session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); -// -// TestCompletionCallback callback; -// -// scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); -// -// HostPortPair http_host_port_pair; -// http_host_port_pair.host = "www.google.com"; -// http_host_port_pair.port = 80; -// HttpAlternateProtocols* alternate_protocols = -// session->mutable_alternate_protocols(); -// alternate_protocols->SetAlternateProtocolFor( -// http_host_port_pair, 1234 /* port is ignored */, -// HttpAlternateProtocols::NPN_SPDY_1); -// -// scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); -// -// int rv = trans->Start(&request, &callback, BoundNetLog()); -// EXPECT_EQ(ERR_IO_PENDING, rv); -// EXPECT_EQ(OK, callback.WaitForResult()); -// -// const HttpResponseInfo* response = trans->GetResponseInfo(); -// ASSERT_TRUE(response != NULL); -// ASSERT_TRUE(response->headers != NULL); -// EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); -// -// std::string response_data; -// ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); -// EXPECT_EQ("hello world", response_data); -// } - TEST_F(HttpNetworkTransactionTest, FailNpnSpdyAndFallback) { HttpStreamFactory::set_use_alternate_protocols(true); HttpStreamFactory::set_next_protos(kExpectedNPNString); @@ -6669,6 +6610,14 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { spdy_writes, arraysize(spdy_writes))); session_deps.socket_factory.AddSocketDataProvider(spdy_data); + MockConnect never_finishing_connect(false, ERR_IO_PENDING); + StaticSocketDataProvider hanging_non_alternate_protocol_socket( + NULL, 0, NULL, 0); + hanging_non_alternate_protocol_socket.set_connect_data( + never_finishing_connect); + session_deps.socket_factory.AddSocketDataProvider( + &hanging_non_alternate_protocol_socket); + TestCompletionCallback callback; scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); @@ -6699,7 +6648,6 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); EXPECT_TRUE(response->was_fetched_via_spdy); EXPECT_TRUE(response->was_npn_negotiated); - EXPECT_TRUE(response->was_alternate_protocol_available); ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); EXPECT_EQ("hello!", response_data); @@ -6708,6 +6656,200 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { HttpStreamFactory::set_use_alternate_protocols(false); } +TEST_F(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { + HttpStreamFactory::set_use_alternate_protocols(true); + HttpStreamFactory::set_next_protos(kExpectedNPNString); + SessionDependencies session_deps; + + HttpRequestInfo request; + request.method = "GET"; + request.url = GURL("http://www.google.com/"); + request.load_flags = 0; + + MockRead data_reads[] = { + MockRead("HTTP/1.1 200 OK\r\n"), + MockRead(kAlternateProtocolHttpHeader), + MockRead("hello world"), + MockRead(true, OK), + }; + + StaticSocketDataProvider first_transaction( + data_reads, arraysize(data_reads), NULL, 0); + // Socket 1 is the HTTP transaction with the Alternate-Protocol header. + session_deps.socket_factory.AddSocketDataProvider(&first_transaction); + + MockConnect never_finishing_connect(false, ERR_IO_PENDING); + StaticSocketDataProvider hanging_socket( + NULL, 0, NULL, 0); + hanging_socket.set_connect_data(never_finishing_connect); + // Socket 2 and 3 are the hanging Alternate-Protocol and + // non-Alternate-Protocol jobs from the 2nd transaction. + session_deps.socket_factory.AddSocketDataProvider(&hanging_socket); + session_deps.socket_factory.AddSocketDataProvider(&hanging_socket); + + SSLSocketDataProvider ssl(true, OK); + ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; + ssl.next_proto = "spdy/2"; + ssl.was_npn_negotiated = true; + session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); + + scoped_ptr<spdy::SpdyFrame> req1(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); + scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST)); + MockWrite spdy_writes[] = { + CreateMockWrite(*req1), + CreateMockWrite(*req2), + }; + scoped_ptr<spdy::SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 1)); + scoped_ptr<spdy::SpdyFrame> data1(ConstructSpdyBodyFrame(1, true)); + scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3)); + scoped_ptr<spdy::SpdyFrame> data2(ConstructSpdyBodyFrame(3, true)); + MockRead spdy_reads[] = { + CreateMockRead(*resp1), + CreateMockRead(*data1), + CreateMockRead(*resp2), + CreateMockRead(*data2), + MockRead(true, 0, 0), + }; + + scoped_refptr<DelayedSocketData> spdy_data( + new DelayedSocketData( + 2, // wait for writes to finish before reading. + spdy_reads, arraysize(spdy_reads), + spdy_writes, arraysize(spdy_writes))); + // Socket 4 is the successful Alternate-Protocol for transaction 3. + session_deps.socket_factory.AddSocketDataProvider(spdy_data); + + // Socket 5 is the unsuccessful non-Alternate-Protocol for transaction 3. + session_deps.socket_factory.AddSocketDataProvider(&hanging_socket); + + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); + TestCompletionCallback callback1; + HttpNetworkTransaction trans1(session); + + int rv = trans1.Start(&request, &callback1, BoundNetLog()); + EXPECT_EQ(ERR_IO_PENDING, rv); + EXPECT_EQ(OK, callback1.WaitForResult()); + + const HttpResponseInfo* response = trans1.GetResponseInfo(); + ASSERT_TRUE(response != NULL); + ASSERT_TRUE(response->headers != NULL); + EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); + + std::string response_data; + ASSERT_EQ(OK, ReadTransaction(&trans1, &response_data)); + EXPECT_EQ("hello world", response_data); + + TestCompletionCallback callback2; + HttpNetworkTransaction trans2(session); + rv = trans2.Start(&request, &callback2, BoundNetLog()); + EXPECT_EQ(ERR_IO_PENDING, rv); + + TestCompletionCallback callback3; + HttpNetworkTransaction trans3(session); + rv = trans3.Start(&request, &callback3, BoundNetLog()); + EXPECT_EQ(ERR_IO_PENDING, rv); + + EXPECT_EQ(OK, callback2.WaitForResult()); + EXPECT_EQ(OK, callback3.WaitForResult()); + + response = trans2.GetResponseInfo(); + ASSERT_TRUE(response != NULL); + ASSERT_TRUE(response->headers != NULL); + EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); + EXPECT_TRUE(response->was_fetched_via_spdy); + EXPECT_TRUE(response->was_npn_negotiated); + ASSERT_EQ(OK, ReadTransaction(&trans2, &response_data)); + EXPECT_EQ("hello!", response_data); + + response = trans3.GetResponseInfo(); + ASSERT_TRUE(response != NULL); + ASSERT_TRUE(response->headers != NULL); + EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); + EXPECT_TRUE(response->was_fetched_via_spdy); + EXPECT_TRUE(response->was_npn_negotiated); + ASSERT_EQ(OK, ReadTransaction(&trans3, &response_data)); + EXPECT_EQ("hello!", response_data); + + HttpStreamFactory::set_next_protos(""); + HttpStreamFactory::set_use_alternate_protocols(false); +} + +TEST_F(HttpNetworkTransactionTest, StallAlternateProtocolForNpnSpdy) { + HttpStreamFactory::set_use_alternate_protocols(true); + HttpStreamFactory::set_next_protos(kExpectedNPNString); + SessionDependencies session_deps; + + HttpRequestInfo request; + request.method = "GET"; + request.url = GURL("http://www.google.com/"); + request.load_flags = 0; + + MockRead data_reads[] = { + MockRead("HTTP/1.1 200 OK\r\n"), + MockRead(kAlternateProtocolHttpHeader), + MockRead("hello world"), + MockRead(true, OK), + }; + + StaticSocketDataProvider first_transaction( + data_reads, arraysize(data_reads), NULL, 0); + session_deps.socket_factory.AddSocketDataProvider(&first_transaction); + + SSLSocketDataProvider ssl(true, OK); + ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; + ssl.next_proto = "spdy/2"; + ssl.was_npn_negotiated = true; + session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); + + MockConnect never_finishing_connect(false, ERR_IO_PENDING); + StaticSocketDataProvider hanging_alternate_protocol_socket( + NULL, 0, NULL, 0); + hanging_alternate_protocol_socket.set_connect_data( + never_finishing_connect); + session_deps.socket_factory.AddSocketDataProvider( + &hanging_alternate_protocol_socket); + + // 2nd request is just a copy of the first one, over HTTP again. + session_deps.socket_factory.AddSocketDataProvider(&first_transaction); + + TestCompletionCallback callback; + + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); + scoped_ptr<HttpNetworkTransaction> trans(new HttpNetworkTransaction(session)); + + int rv = trans->Start(&request, &callback, BoundNetLog()); + EXPECT_EQ(ERR_IO_PENDING, rv); + EXPECT_EQ(OK, callback.WaitForResult()); + + const HttpResponseInfo* response = trans->GetResponseInfo(); + ASSERT_TRUE(response != NULL); + ASSERT_TRUE(response->headers != NULL); + EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); + + std::string response_data; + ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); + EXPECT_EQ("hello world", response_data); + + trans.reset(new HttpNetworkTransaction(session)); + + rv = trans->Start(&request, &callback, BoundNetLog()); + EXPECT_EQ(ERR_IO_PENDING, rv); + EXPECT_EQ(OK, callback.WaitForResult()); + + response = trans->GetResponseInfo(); + ASSERT_TRUE(response != NULL); + ASSERT_TRUE(response->headers != NULL); + EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); + EXPECT_FALSE(response->was_fetched_via_spdy); + EXPECT_FALSE(response->was_npn_negotiated); + + ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); + EXPECT_EQ("hello world", response_data); + + HttpStreamFactory::set_next_protos(""); + HttpStreamFactory::set_use_alternate_protocols(false); +} + class CapturingProxyResolver : public ProxyResolver { public: CapturingProxyResolver() : ProxyResolver(false /* expects_pac_bytes */) {} @@ -6807,6 +6949,14 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForTunneledNpnSpdy) { spdy_writes, arraysize(spdy_writes))); session_deps.socket_factory.AddSocketDataProvider(spdy_data); + MockConnect never_finishing_connect(false, ERR_IO_PENDING); + StaticSocketDataProvider hanging_non_alternate_protocol_socket( + NULL, 0, NULL, 0); + hanging_non_alternate_protocol_socket.set_connect_data( + never_finishing_connect); + session_deps.socket_factory.AddSocketDataProvider( + &hanging_non_alternate_protocol_socket); + TestCompletionCallback callback; scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); @@ -6842,7 +6992,7 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForTunneledNpnSpdy) { ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); EXPECT_EQ("hello!", response_data); - ASSERT_EQ(2u, capturing_proxy_resolver->resolved().size()); + ASSERT_EQ(3u, capturing_proxy_resolver->resolved().size()); EXPECT_EQ("http://www.google.com/", capturing_proxy_resolver->resolved()[0].spec()); EXPECT_EQ("https://www.google.com/", @@ -6958,7 +7108,6 @@ TEST_F(HttpNetworkTransactionTest, EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); EXPECT_TRUE(response->was_fetched_via_spdy); EXPECT_TRUE(response->was_npn_negotiated); - EXPECT_TRUE(response->was_alternate_protocol_available); ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); EXPECT_EQ("hello!", response_data); @@ -7729,7 +7878,6 @@ TEST_F(HttpNetworkTransactionTest, NpnWithHttpOverSSL) { EXPECT_FALSE(response->was_fetched_via_spdy); EXPECT_TRUE(response->was_npn_negotiated); - EXPECT_FALSE(response->was_alternate_protocol_available); HttpStreamFactory::set_next_protos(""); HttpStreamFactory::set_use_alternate_protocols(false); @@ -7885,9 +8033,17 @@ TEST_F(HttpNetworkTransactionTest, SpdyAlternateProtocolThroughProxy) { ssl.next_proto = "spdy/2"; ssl.was_npn_negotiated = true; + MockConnect never_finishing_connect(false, ERR_IO_PENDING); + StaticSocketDataProvider hanging_non_alternate_protocol_socket( + NULL, 0, NULL, 0); + hanging_non_alternate_protocol_socket.set_connect_data( + never_finishing_connect); + session_deps.socket_factory.AddSocketDataProvider(&data_1); session_deps.socket_factory.AddSocketDataProvider(data_2.get()); session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); + session_deps.socket_factory.AddSocketDataProvider( + &hanging_non_alternate_protocol_socket); scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); // First round should work and provide the Alternate-Protocol state. |