Index: net/http/http_stream_factory_impl_unittest.cc |
diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc |
index e55aff50b27d06ee5a10e9e187311e7c0dca3041..b1feda1813a9d990a8d146d5b2c533076d885886 100644 |
--- a/net/http/http_stream_factory_impl_unittest.cc |
+++ b/net/http/http_stream_factory_impl_unittest.cc |
@@ -9,6 +9,7 @@ |
#include "base/basictypes.h" |
#include "base/compiler_specific.h" |
+#include "net/base/capturing_net_log.h" |
#include "net/base/net_log.h" |
#include "net/base/test_completion_callback.h" |
#include "net/cert/mock_cert_verifier.h" |
@@ -24,6 +25,9 @@ |
#include "net/http/transport_security_state.h" |
#include "net/proxy/proxy_info.h" |
#include "net/proxy/proxy_service.h" |
+#include "net/quic/test_tools/mock_clock.h" |
+#include "net/quic/test_tools/mock_crypto_client_stream_factory.h" |
+#include "net/quic/test_tools/mock_random.h" |
#include "net/socket/client_socket_handle.h" |
#include "net/socket/mock_client_socket_pool_manager.h" |
#include "net/socket/next_proto.h" |
@@ -1108,57 +1112,161 @@ TEST_P(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStreamOverProxy) { |
EXPECT_FALSE(waiter.used_proxy_info().is_direct()); |
} |
+TEST_P(HttpStreamFactoryTest, RequestQuicHTTPStream) { |
+ for (int i = 0; i <= 1; i++) { |
+ scoped_ptr<ProxyService> proxy_service; |
+ proxy_service.reset(ProxyService::CreateFixedFromPacResult("DIRECT")); |
+ |
+ HttpNetworkSession::Params params; |
+ MockClock* clock_ = new MockClock(); |
+ MockRandom random_generator_; |
+ MockCryptoClientStreamFactory crypto_client_stream_factory_; |
+ MockCertVerifier cert_verifier_; |
+ |
+ params.enable_quic = true; |
+ params.enable_quic_for_proxies = true; |
+ scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( |
+ new SSLConfigServiceDefaults); |
+ HttpServerPropertiesImpl http_server_properties; |
+ MockClientSocketFactory socket_factory; |
+ params.client_socket_factory = &socket_factory; |
+ MockHostResolver host_resolver; |
+ params.host_resolver = &host_resolver; |
+ TransportSecurityState transport_security_state; |
+ params.transport_security_state = &transport_security_state; |
+ params.proxy_service = proxy_service.get(); |
+ params.ssl_config_service = ssl_config_service.get(); |
+ params.http_server_properties = http_server_properties.GetWeakPtr(); |
+ params.use_alternate_protocols = true; |
+ params.next_protos = NextProtosWithSpdyAndQuic(true, true); |
+ params.quic_clock = clock_; |
+ clock_->AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); |
+ params.quic_random = &random_generator_; |
+ params.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; |
+ params.cert_verifier = &cert_verifier_; |
+ scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; |
+ params.http_auth_handler_factory = auth_handler_factory_.get(); |
+ params.quic_supported_versions.push_back(QUIC_VERSION_24); |
+ |
+ params.origin_to_force_quic_on = |
+ HostPortPair::FromString("www.google.com:80"); |
+ |
+ scoped_refptr<HttpNetworkSession> session; |
+ session = new HttpNetworkSession(params); |
+ session->quic_stream_factory()->set_require_confirmation(false); |
+ |
+ MockRead http_reads[] = { |
+ MockRead("HTTP/1.1 200 OK\r\n"), |
+ MockRead("Alternate-Protocol: 80:quic\r\n\r\n"), |
+ MockRead("hello world"), |
+ MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
+ MockRead(ASYNC, OK), |
+ }; |
+ |
+ HttpRequestInfo request_info; |
+ request_info.method = "GET"; |
+ request_info.url = GURL("http://www.google.com"); |
+ |
+ request_info.load_flags = 0; |
+ if (i == 1) { |
+ request_info.load_flags = LOAD_UNENCRYPTED_HTTP11; |
+ } |
+ |
+ SSLConfig ssl_config; |
+ EXPECT_TRUE(params.enable_quic) << i; |
+ |
+ StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
+ nullptr, 0); |
+ socket_factory.AddSocketDataProvider(&http_data); |
+ |
+ scoped_ptr<HttpNetworkTransaction> trans( |
+ new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
+ |
+ CapturingBoundNetLog net_log_; |
+ TestCompletionCallback callback; |
+ |
+ int rv = trans.get()->Start(&request_info, callback.callback(), |
+ net_log_.bound()); |
+ EXPECT_EQ(ERR_IO_PENDING, rv) << i; |
+ EXPECT_EQ(i == 0, OK != callback.WaitForResult()); |
+ |
+ const HttpResponseInfo* response = trans->GetResponseInfo(); |
+ EXPECT_EQ(i == 0, response == nullptr) << i; |
+ if (i == 0) { |
+ // When LOAD_UNENCRYPTED_HTTP11 is not enabled, request fails because |
+ // there is no QUIC mock socket. |
+ continue; |
+ } |
+ ASSERT_TRUE(response->headers.get() != nullptr) << i; |
+ EXPECT_FALSE(response->was_fetched_via_spdy) << i; |
+ EXPECT_FALSE(response->was_npn_negotiated) << i; |
+ |
+ EXPECT_EQ(HttpResponseInfo::CONNECTION_INFO_HTTP1, |
+ response->connection_info) |
+ << i; |
+ |
+ EXPECT_EQ(i == 1, http_server_properties.RequiresHTTP11( |
+ HostPortPair::FromString("www.google.com:80"))) |
+ << i; |
+ } |
+} |
+ |
TEST_P(HttpStreamFactoryTest, RequestSpdyHttpStream) { |
- SpdySessionDependencies session_deps(GetParam(), |
- ProxyService::CreateDirect()); |
+ for (int i = 0; i <= 1; i++) { |
+ SpdySessionDependencies session_deps(GetParam(), |
+ ProxyService::CreateDirect()); |
- MockRead mock_read(ASYNC, OK); |
- DeterministicSocketData socket_data(&mock_read, 1, nullptr, 0); |
- socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
- session_deps.deterministic_socket_factory->AddSocketDataProvider( |
- &socket_data); |
+ MockRead mock_read(ASYNC, OK); |
+ DeterministicSocketData socket_data(&mock_read, 1, nullptr, 0); |
+ socket_data.set_connect_data(MockConnect(ASYNC, OK)); |
+ session_deps.deterministic_socket_factory->AddSocketDataProvider( |
+ &socket_data); |
- SSLSocketDataProvider ssl_socket_data(ASYNC, OK); |
- ssl_socket_data.SetNextProto(GetParam()); |
- session_deps.deterministic_socket_factory->AddSSLSocketDataProvider( |
- &ssl_socket_data); |
+ SSLSocketDataProvider ssl_socket_data(ASYNC, OK); |
+ ssl_socket_data.SetNextProto(GetParam()); |
+ session_deps.deterministic_socket_factory->AddSSLSocketDataProvider( |
+ &ssl_socket_data); |
- HostPortPair host_port_pair("www.google.com", 443); |
- scoped_refptr<HttpNetworkSession> |
- session(SpdySessionDependencies::SpdyCreateSessionDeterministic( |
- &session_deps)); |
+ HostPortPair host_port_pair("www.google.com", 443); |
+ scoped_refptr<HttpNetworkSession> session( |
+ SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps)); |
- // Now request a stream. |
- HttpRequestInfo request_info; |
- request_info.method = "GET"; |
- request_info.url = GURL("https://www.google.com"); |
- request_info.load_flags = 0; |
+ // Now request a stream. |
+ HttpRequestInfo request_info; |
+ request_info.method = "GET"; |
+ request_info.url = GURL("https://www.google.com"); |
+ request_info.load_flags = 0; |
+ if (i == 1) { |
+ request_info.load_flags = LOAD_UNENCRYPTED_HTTP11; |
+ } |
- SSLConfig ssl_config; |
- StreamRequestWaiter waiter; |
- scoped_ptr<HttpStreamRequest> request( |
- session->http_stream_factory()->RequestStream( |
- request_info, |
- DEFAULT_PRIORITY, |
- ssl_config, |
- ssl_config, |
- &waiter, |
- BoundNetLog())); |
- waiter.WaitForStream(); |
- EXPECT_TRUE(waiter.stream_done()); |
- EXPECT_TRUE(nullptr == waiter.websocket_stream()); |
- ASSERT_TRUE(nullptr != waiter.stream()); |
- EXPECT_TRUE(waiter.stream()->IsSpdyHttpStream()); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(1, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetTransportSocketPool( |
- HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_EQ(0, GetSocketPoolGroupCount( |
- session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
- EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
+ SSLConfig ssl_config; |
+ StreamRequestWaiter waiter; |
+ scoped_ptr<HttpStreamRequest> request( |
+ session->http_stream_factory()->RequestStream( |
+ request_info, DEFAULT_PRIORITY, ssl_config, ssl_config, &waiter, |
+ BoundNetLog())); |
+ waiter.WaitForStream(); |
+ EXPECT_TRUE(waiter.stream_done()); |
+ EXPECT_TRUE(nullptr == waiter.websocket_stream()); |
+ ASSERT_TRUE(nullptr != waiter.stream()); |
+ EXPECT_EQ(i == 0, waiter.stream()->IsSpdyHttpStream()); |
+ EXPECT_EQ(1, GetSocketPoolGroupCount(session->GetTransportSocketPool( |
+ HttpNetworkSession::NORMAL_SOCKET_POOL))); |
+ EXPECT_EQ(1, GetSocketPoolGroupCount(session->GetSSLSocketPool( |
+ HttpNetworkSession::NORMAL_SOCKET_POOL))); |
+ EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetTransportSocketPool( |
+ HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
+ EXPECT_EQ(0, GetSocketPoolGroupCount(session->GetSSLSocketPool( |
+ HttpNetworkSession::WEBSOCKET_SOCKET_POOL))); |
+ EXPECT_TRUE(waiter.used_proxy_info().is_direct()); |
+ |
+ base::WeakPtr<HttpServerProperties> http_server_properties = |
+ session->http_server_properties(); |
+ |
+ EXPECT_EQ(i == 1, http_server_properties->RequiresHTTP11(host_port_pair)) |
+ << i; |
+ } |
} |
// TODO(ricea): This test can be removed once the new WebSocket stack supports |