Index: net/socket/ssl_client_socket_pool_unittest.cc |
diff --git a/net/socket/ssl_client_socket_pool_unittest.cc b/net/socket/ssl_client_socket_pool_unittest.cc |
deleted file mode 100644 |
index 411a5d79d6cfb186ed66054b15ff0c037253ca83..0000000000000000000000000000000000000000 |
--- a/net/socket/ssl_client_socket_pool_unittest.cc |
+++ /dev/null |
@@ -1,1395 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/http/http_proxy_client_socket_pool.h" |
- |
-#include "base/callback.h" |
-#include "base/compiler_specific.h" |
-#include "base/run_loop.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/time/time.h" |
-#include "net/base/auth.h" |
-#include "net/base/load_timing_info.h" |
-#include "net/base/load_timing_info_test_util.h" |
-#include "net/base/net_errors.h" |
-#include "net/base/test_completion_callback.h" |
-#include "net/cert/cert_verifier.h" |
-#include "net/dns/mock_host_resolver.h" |
-#include "net/http/http_auth_handler_factory.h" |
-#include "net/http/http_network_session.h" |
-#include "net/http/http_request_headers.h" |
-#include "net/http/http_response_headers.h" |
-#include "net/http/http_server_properties_impl.h" |
-#include "net/http/transport_security_state.h" |
-#include "net/proxy/proxy_service.h" |
-#include "net/socket/client_socket_handle.h" |
-#include "net/socket/client_socket_pool_histograms.h" |
-#include "net/socket/next_proto.h" |
-#include "net/socket/socket_test_util.h" |
-#include "net/spdy/spdy_session.h" |
-#include "net/spdy/spdy_session_pool.h" |
-#include "net/spdy/spdy_test_util_common.h" |
-#include "net/ssl/ssl_config_service_defaults.h" |
-#include "net/test/test_certificate_data.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace net { |
- |
-namespace { |
- |
-const int kMaxSockets = 32; |
-const int kMaxSocketsPerGroup = 6; |
- |
-// Make sure |handle|'s load times are set correctly. DNS and connect start |
-// times comes from mock client sockets in these tests, so primarily serves to |
-// check those times were copied, and ssl times / connect end are set correctly. |
-void TestLoadTimingInfo(const ClientSocketHandle& handle) { |
- LoadTimingInfo load_timing_info; |
- EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info)); |
- |
- EXPECT_FALSE(load_timing_info.socket_reused); |
- // None of these tests use a NetLog. |
- EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); |
- |
- ExpectConnectTimingHasTimes( |
- load_timing_info.connect_timing, |
- CONNECT_TIMING_HAS_SSL_TIMES | CONNECT_TIMING_HAS_DNS_TIMES); |
- ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); |
-} |
- |
-// Just like TestLoadTimingInfo, except DNS times are expected to be null, for |
-// tests over proxies that do DNS lookups themselves. |
-void TestLoadTimingInfoNoDns(const ClientSocketHandle& handle) { |
- LoadTimingInfo load_timing_info; |
- EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info)); |
- |
- // None of these tests use a NetLog. |
- EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); |
- |
- EXPECT_FALSE(load_timing_info.socket_reused); |
- |
- ExpectConnectTimingHasTimes(load_timing_info.connect_timing, |
- CONNECT_TIMING_HAS_SSL_TIMES); |
- ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); |
-} |
- |
-class SSLClientSocketPoolTest |
- : public testing::Test, |
- public ::testing::WithParamInterface<NextProto> { |
- protected: |
- SSLClientSocketPoolTest() |
- : transport_security_state_(new TransportSecurityState), |
- proxy_service_(ProxyService::CreateDirect()), |
- ssl_config_service_(new SSLConfigServiceDefaults), |
- http_auth_handler_factory_( |
- HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), |
- session_(CreateNetworkSession()), |
- direct_transport_socket_params_( |
- new TransportSocketParams( |
- HostPortPair("host", 443), |
- false, |
- false, |
- OnHostResolutionCallback(), |
- TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)), |
- transport_histograms_("MockTCP"), |
- transport_socket_pool_(kMaxSockets, |
- kMaxSocketsPerGroup, |
- &transport_histograms_, |
- &socket_factory_), |
- proxy_transport_socket_params_( |
- new TransportSocketParams( |
- HostPortPair("proxy", 443), |
- false, |
- false, |
- OnHostResolutionCallback(), |
- TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)), |
- socks_socket_params_( |
- new SOCKSSocketParams(proxy_transport_socket_params_, |
- true, |
- HostPortPair("sockshost", 443))), |
- socks_histograms_("MockSOCKS"), |
- socks_socket_pool_(kMaxSockets, |
- kMaxSocketsPerGroup, |
- &socks_histograms_, |
- &transport_socket_pool_), |
- http_proxy_socket_params_( |
- new HttpProxySocketParams(proxy_transport_socket_params_, |
- NULL, |
- GURL("http://host"), |
- std::string(), |
- HostPortPair("host", 80), |
- session_->http_auth_cache(), |
- session_->http_auth_handler_factory(), |
- session_->spdy_session_pool(), |
- true, |
- NULL)), |
- http_proxy_histograms_("MockHttpProxy"), |
- http_proxy_socket_pool_(kMaxSockets, |
- kMaxSocketsPerGroup, |
- &http_proxy_histograms_, |
- &transport_socket_pool_, |
- NULL, |
- NULL), |
- enable_ssl_connect_job_waiting_(false) { |
- scoped_refptr<SSLConfigService> ssl_config_service( |
- new SSLConfigServiceDefaults); |
- ssl_config_service->GetSSLConfig(&ssl_config_); |
- } |
- |
- void CreatePool(bool transport_pool, bool http_proxy_pool, bool socks_pool) { |
- ssl_histograms_.reset(new ClientSocketPoolHistograms("SSLUnitTest")); |
- pool_.reset(new SSLClientSocketPool( |
- kMaxSockets, kMaxSocketsPerGroup, ssl_histograms_.get(), |
- NULL /* cert_verifier */, NULL /* channel_id_service */, |
- NULL /* transport_security_state */, |
- NULL /* cert_transparency_verifier */, NULL /* cert_policy_enforcer */, |
- std::string() /* ssl_session_cache_shard */, &socket_factory_, |
- transport_pool ? &transport_socket_pool_ : NULL, |
- socks_pool ? &socks_socket_pool_ : NULL, |
- http_proxy_pool ? &http_proxy_socket_pool_ : NULL, NULL, |
- enable_ssl_connect_job_waiting_, NULL)); |
- } |
- |
- scoped_refptr<SSLSocketParams> SSLParams(ProxyServer::Scheme proxy, |
- bool want_spdy_over_npn) { |
- return make_scoped_refptr(new SSLSocketParams( |
- proxy == ProxyServer::SCHEME_DIRECT ? direct_transport_socket_params_ |
- : NULL, |
- proxy == ProxyServer::SCHEME_SOCKS5 ? socks_socket_params_ : NULL, |
- proxy == ProxyServer::SCHEME_HTTP ? http_proxy_socket_params_ : NULL, |
- HostPortPair("host", 443), |
- ssl_config_, |
- PRIVACY_MODE_DISABLED, |
- 0, |
- false, |
- want_spdy_over_npn)); |
- } |
- |
- void AddAuthToCache() { |
- const base::string16 kFoo(base::ASCIIToUTF16("foo")); |
- const base::string16 kBar(base::ASCIIToUTF16("bar")); |
- session_->http_auth_cache()->Add(GURL("http://proxy:443/"), |
- "MyRealm1", |
- HttpAuth::AUTH_SCHEME_BASIC, |
- "Basic realm=MyRealm1", |
- AuthCredentials(kFoo, kBar), |
- "/"); |
- } |
- |
- HttpNetworkSession* CreateNetworkSession() { |
- HttpNetworkSession::Params params; |
- params.host_resolver = &host_resolver_; |
- params.cert_verifier = cert_verifier_.get(); |
- params.transport_security_state = transport_security_state_.get(); |
- params.proxy_service = proxy_service_.get(); |
- params.client_socket_factory = &socket_factory_; |
- params.ssl_config_service = ssl_config_service_.get(); |
- params.http_auth_handler_factory = http_auth_handler_factory_.get(); |
- params.http_server_properties = |
- http_server_properties_.GetWeakPtr(); |
- params.enable_spdy_compression = false; |
- params.spdy_default_protocol = GetParam(); |
- return new HttpNetworkSession(params); |
- } |
- |
- void TestIPPoolingDisabled(SSLSocketDataProvider* ssl); |
- |
- MockClientSocketFactory socket_factory_; |
- MockCachingHostResolver host_resolver_; |
- scoped_ptr<CertVerifier> cert_verifier_; |
- scoped_ptr<TransportSecurityState> transport_security_state_; |
- const scoped_ptr<ProxyService> proxy_service_; |
- const scoped_refptr<SSLConfigService> ssl_config_service_; |
- const scoped_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_; |
- HttpServerPropertiesImpl http_server_properties_; |
- const scoped_refptr<HttpNetworkSession> session_; |
- |
- scoped_refptr<TransportSocketParams> direct_transport_socket_params_; |
- ClientSocketPoolHistograms transport_histograms_; |
- MockTransportClientSocketPool transport_socket_pool_; |
- |
- scoped_refptr<TransportSocketParams> proxy_transport_socket_params_; |
- |
- scoped_refptr<SOCKSSocketParams> socks_socket_params_; |
- ClientSocketPoolHistograms socks_histograms_; |
- MockSOCKSClientSocketPool socks_socket_pool_; |
- |
- scoped_refptr<HttpProxySocketParams> http_proxy_socket_params_; |
- ClientSocketPoolHistograms http_proxy_histograms_; |
- HttpProxyClientSocketPool http_proxy_socket_pool_; |
- |
- SSLConfig ssl_config_; |
- scoped_ptr<ClientSocketPoolHistograms> ssl_histograms_; |
- scoped_ptr<SSLClientSocketPool> pool_; |
- |
- bool enable_ssl_connect_job_waiting_; |
-}; |
- |
-INSTANTIATE_TEST_CASE_P( |
- NextProto, |
- SSLClientSocketPoolTest, |
- testing::Values(kProtoSPDY31, kProtoSPDY4_14, kProtoSPDY4_15)); |
- |
-// Tests that the final socket will connect even if all sockets |
-// prior to it fail. |
-// |
-// All sockets should wait for the first socket to attempt to |
-// connect. Once it fails to connect, all other sockets should |
-// attempt to connect. All should fail, except the final socket. |
-TEST_P(SSLClientSocketPoolTest, AllSocketsFailButLast) { |
- // Although we request four sockets, the first three socket connect |
- // failures cause the socket pool to create three more sockets because |
- // there are pending requests. |
- StaticSocketDataProvider data1; |
- StaticSocketDataProvider data2; |
- StaticSocketDataProvider data3; |
- StaticSocketDataProvider data4; |
- StaticSocketDataProvider data5; |
- StaticSocketDataProvider data6; |
- StaticSocketDataProvider data7; |
- socket_factory_.AddSocketDataProvider(&data1); |
- socket_factory_.AddSocketDataProvider(&data2); |
- socket_factory_.AddSocketDataProvider(&data3); |
- socket_factory_.AddSocketDataProvider(&data4); |
- socket_factory_.AddSocketDataProvider(&data5); |
- socket_factory_.AddSocketDataProvider(&data6); |
- socket_factory_.AddSocketDataProvider(&data7); |
- SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR); |
- ssl.is_in_session_cache = false; |
- SSLSocketDataProvider ssl2(ASYNC, ERR_SSL_PROTOCOL_ERROR); |
- ssl2.is_in_session_cache = false; |
- SSLSocketDataProvider ssl3(ASYNC, ERR_SSL_PROTOCOL_ERROR); |
- ssl3.is_in_session_cache = false; |
- SSLSocketDataProvider ssl4(ASYNC, OK); |
- ssl4.is_in_session_cache = false; |
- SSLSocketDataProvider ssl5(ASYNC, OK); |
- ssl5.is_in_session_cache = false; |
- SSLSocketDataProvider ssl6(ASYNC, OK); |
- ssl6.is_in_session_cache = false; |
- SSLSocketDataProvider ssl7(ASYNC, OK); |
- ssl7.is_in_session_cache = false; |
- |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- socket_factory_.AddSSLSocketDataProvider(&ssl2); |
- socket_factory_.AddSSLSocketDataProvider(&ssl3); |
- socket_factory_.AddSSLSocketDataProvider(&ssl4); |
- socket_factory_.AddSSLSocketDataProvider(&ssl5); |
- socket_factory_.AddSSLSocketDataProvider(&ssl6); |
- socket_factory_.AddSSLSocketDataProvider(&ssl7); |
- |
- enable_ssl_connect_job_waiting_ = true; |
- CreatePool(true, false, false); |
- |
- scoped_refptr<SSLSocketParams> params1 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params2 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params3 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params4 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- ClientSocketHandle handle1; |
- ClientSocketHandle handle2; |
- ClientSocketHandle handle3; |
- ClientSocketHandle handle4; |
- TestCompletionCallback callback1; |
- TestCompletionCallback callback2; |
- TestCompletionCallback callback3; |
- TestCompletionCallback callback4; |
- |
- handle1.Init( |
- "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); |
- handle2.Init( |
- "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); |
- handle3.Init( |
- "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); |
- handle4.Init( |
- "b", params4, MEDIUM, callback4.callback(), pool_.get(), BoundNetLog()); |
- |
- base::RunLoop().RunUntilIdle(); |
- |
- // Only the last socket should have connected. |
- EXPECT_FALSE(handle1.socket()); |
- EXPECT_FALSE(handle2.socket()); |
- EXPECT_FALSE(handle3.socket()); |
- EXPECT_TRUE(handle4.socket()->IsConnected()); |
-} |
- |
-// Tests that sockets will still connect in parallel if the |
-// EnableSSLConnectJobWaiting flag is not enabled. |
-TEST_P(SSLClientSocketPoolTest, SocketsConnectWithoutFlag) { |
- StaticSocketDataProvider data1; |
- StaticSocketDataProvider data2; |
- StaticSocketDataProvider data3; |
- socket_factory_.AddSocketDataProvider(&data1); |
- socket_factory_.AddSocketDataProvider(&data2); |
- socket_factory_.AddSocketDataProvider(&data3); |
- |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.is_in_session_cache = false; |
- ssl.should_pause_on_connect = true; |
- SSLSocketDataProvider ssl2(ASYNC, OK); |
- ssl2.is_in_session_cache = false; |
- ssl2.should_pause_on_connect = true; |
- SSLSocketDataProvider ssl3(ASYNC, OK); |
- ssl3.is_in_session_cache = false; |
- ssl3.should_pause_on_connect = true; |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- socket_factory_.AddSSLSocketDataProvider(&ssl2); |
- socket_factory_.AddSSLSocketDataProvider(&ssl3); |
- |
- CreatePool(true, false, false); |
- |
- scoped_refptr<SSLSocketParams> params1 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params2 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params3 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- ClientSocketHandle handle1; |
- ClientSocketHandle handle2; |
- ClientSocketHandle handle3; |
- TestCompletionCallback callback1; |
- TestCompletionCallback callback2; |
- TestCompletionCallback callback3; |
- |
- handle1.Init( |
- "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); |
- handle2.Init( |
- "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); |
- handle3.Init( |
- "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); |
- |
- base::RunLoop().RunUntilIdle(); |
- |
- std::vector<MockSSLClientSocket*> sockets = |
- socket_factory_.ssl_client_sockets(); |
- |
- // All sockets should have started their connections. |
- for (std::vector<MockSSLClientSocket*>::iterator it = sockets.begin(); |
- it != sockets.end(); |
- ++it) { |
- EXPECT_TRUE((*it)->reached_connect()); |
- } |
- |
- // Resume connecting all of the sockets. |
- for (std::vector<MockSSLClientSocket*>::iterator it = sockets.begin(); |
- it != sockets.end(); |
- ++it) { |
- (*it)->RestartPausedConnect(); |
- } |
- |
- callback1.WaitForResult(); |
- callback2.WaitForResult(); |
- callback3.WaitForResult(); |
- |
- EXPECT_TRUE(handle1.socket()->IsConnected()); |
- EXPECT_TRUE(handle2.socket()->IsConnected()); |
- EXPECT_TRUE(handle3.socket()->IsConnected()); |
-} |
- |
-// Tests that the pool deleting an SSLConnectJob will not cause a crash, |
-// or prevent pending sockets from connecting. |
-TEST_P(SSLClientSocketPoolTest, DeletedSSLConnectJob) { |
- StaticSocketDataProvider data1; |
- StaticSocketDataProvider data2; |
- StaticSocketDataProvider data3; |
- socket_factory_.AddSocketDataProvider(&data1); |
- socket_factory_.AddSocketDataProvider(&data2); |
- socket_factory_.AddSocketDataProvider(&data3); |
- |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.is_in_session_cache = false; |
- ssl.should_pause_on_connect = true; |
- SSLSocketDataProvider ssl2(ASYNC, OK); |
- ssl2.is_in_session_cache = false; |
- SSLSocketDataProvider ssl3(ASYNC, OK); |
- ssl3.is_in_session_cache = false; |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- socket_factory_.AddSSLSocketDataProvider(&ssl2); |
- socket_factory_.AddSSLSocketDataProvider(&ssl3); |
- |
- enable_ssl_connect_job_waiting_ = true; |
- CreatePool(true, false, false); |
- |
- scoped_refptr<SSLSocketParams> params1 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params2 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params3 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- ClientSocketHandle handle1; |
- ClientSocketHandle handle2; |
- ClientSocketHandle handle3; |
- TestCompletionCallback callback1; |
- TestCompletionCallback callback2; |
- TestCompletionCallback callback3; |
- |
- handle1.Init( |
- "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); |
- handle2.Init( |
- "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); |
- handle3.Init( |
- "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); |
- |
- // Allow the connections to proceed until the first socket has started |
- // connecting. |
- base::RunLoop().RunUntilIdle(); |
- |
- std::vector<MockSSLClientSocket*> sockets = |
- socket_factory_.ssl_client_sockets(); |
- |
- pool_->CancelRequest("b", &handle2); |
- |
- sockets[0]->RestartPausedConnect(); |
- |
- callback1.WaitForResult(); |
- callback3.WaitForResult(); |
- |
- EXPECT_TRUE(handle1.socket()->IsConnected()); |
- EXPECT_FALSE(handle2.socket()); |
- EXPECT_TRUE(handle3.socket()->IsConnected()); |
-} |
- |
-// Tests that all pending sockets still connect when the pool deletes a pending |
-// SSLConnectJob which immediately followed a failed leading connection. |
-TEST_P(SSLClientSocketPoolTest, DeletedSocketAfterFail) { |
- StaticSocketDataProvider data1; |
- StaticSocketDataProvider data2; |
- StaticSocketDataProvider data3; |
- StaticSocketDataProvider data4; |
- socket_factory_.AddSocketDataProvider(&data1); |
- socket_factory_.AddSocketDataProvider(&data2); |
- socket_factory_.AddSocketDataProvider(&data3); |
- socket_factory_.AddSocketDataProvider(&data4); |
- |
- SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR); |
- ssl.is_in_session_cache = false; |
- ssl.should_pause_on_connect = true; |
- SSLSocketDataProvider ssl2(ASYNC, OK); |
- ssl2.is_in_session_cache = false; |
- SSLSocketDataProvider ssl3(ASYNC, OK); |
- ssl3.is_in_session_cache = false; |
- SSLSocketDataProvider ssl4(ASYNC, OK); |
- ssl4.is_in_session_cache = false; |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- socket_factory_.AddSSLSocketDataProvider(&ssl2); |
- socket_factory_.AddSSLSocketDataProvider(&ssl3); |
- socket_factory_.AddSSLSocketDataProvider(&ssl4); |
- |
- enable_ssl_connect_job_waiting_ = true; |
- CreatePool(true, false, false); |
- |
- scoped_refptr<SSLSocketParams> params1 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params2 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params3 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- ClientSocketHandle handle1; |
- ClientSocketHandle handle2; |
- ClientSocketHandle handle3; |
- TestCompletionCallback callback1; |
- TestCompletionCallback callback2; |
- TestCompletionCallback callback3; |
- |
- handle1.Init( |
- "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); |
- handle2.Init( |
- "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); |
- handle3.Init( |
- "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); |
- |
- // Allow the connections to proceed until the first socket has started |
- // connecting. |
- base::RunLoop().RunUntilIdle(); |
- |
- std::vector<MockSSLClientSocket*> sockets = |
- socket_factory_.ssl_client_sockets(); |
- |
- EXPECT_EQ(3u, sockets.size()); |
- EXPECT_TRUE(sockets[0]->reached_connect()); |
- EXPECT_FALSE(handle1.socket()); |
- |
- pool_->CancelRequest("b", &handle2); |
- |
- sockets[0]->RestartPausedConnect(); |
- |
- callback1.WaitForResult(); |
- callback3.WaitForResult(); |
- |
- EXPECT_FALSE(handle1.socket()); |
- EXPECT_FALSE(handle2.socket()); |
- EXPECT_TRUE(handle3.socket()->IsConnected()); |
-} |
- |
-// Make sure that sockets still connect after the leader socket's |
-// connection fails. |
-TEST_P(SSLClientSocketPoolTest, SimultaneousConnectJobsFail) { |
- StaticSocketDataProvider data1; |
- StaticSocketDataProvider data2; |
- StaticSocketDataProvider data3; |
- StaticSocketDataProvider data4; |
- StaticSocketDataProvider data5; |
- socket_factory_.AddSocketDataProvider(&data1); |
- socket_factory_.AddSocketDataProvider(&data2); |
- socket_factory_.AddSocketDataProvider(&data3); |
- socket_factory_.AddSocketDataProvider(&data4); |
- socket_factory_.AddSocketDataProvider(&data5); |
- SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR); |
- ssl.is_in_session_cache = false; |
- ssl.should_pause_on_connect = true; |
- SSLSocketDataProvider ssl2(ASYNC, OK); |
- ssl2.is_in_session_cache = false; |
- ssl2.should_pause_on_connect = true; |
- SSLSocketDataProvider ssl3(ASYNC, OK); |
- ssl3.is_in_session_cache = false; |
- SSLSocketDataProvider ssl4(ASYNC, OK); |
- ssl4.is_in_session_cache = false; |
- SSLSocketDataProvider ssl5(ASYNC, OK); |
- ssl5.is_in_session_cache = false; |
- |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- socket_factory_.AddSSLSocketDataProvider(&ssl2); |
- socket_factory_.AddSSLSocketDataProvider(&ssl3); |
- socket_factory_.AddSSLSocketDataProvider(&ssl4); |
- socket_factory_.AddSSLSocketDataProvider(&ssl5); |
- |
- enable_ssl_connect_job_waiting_ = true; |
- CreatePool(true, false, false); |
- scoped_refptr<SSLSocketParams> params1 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params2 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params3 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params4 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- ClientSocketHandle handle1; |
- ClientSocketHandle handle2; |
- ClientSocketHandle handle3; |
- ClientSocketHandle handle4; |
- TestCompletionCallback callback1; |
- TestCompletionCallback callback2; |
- TestCompletionCallback callback3; |
- TestCompletionCallback callback4; |
- handle1.Init( |
- "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); |
- handle2.Init( |
- "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); |
- handle3.Init( |
- "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); |
- handle4.Init( |
- "b", params4, MEDIUM, callback4.callback(), pool_.get(), BoundNetLog()); |
- |
- base::RunLoop().RunUntilIdle(); |
- |
- std::vector<MockSSLClientSocket*> sockets = |
- socket_factory_.ssl_client_sockets(); |
- |
- std::vector<MockSSLClientSocket*>::const_iterator it = sockets.begin(); |
- |
- // The first socket should have had Connect called on it. |
- EXPECT_TRUE((*it)->reached_connect()); |
- ++it; |
- |
- // No other socket should have reached connect yet. |
- for (; it != sockets.end(); ++it) |
- EXPECT_FALSE((*it)->reached_connect()); |
- |
- // Allow the first socket to resume it's connection process. |
- sockets[0]->RestartPausedConnect(); |
- |
- base::RunLoop().RunUntilIdle(); |
- |
- // The second socket should have reached connect. |
- EXPECT_TRUE(sockets[1]->reached_connect()); |
- |
- // Allow the second socket to continue its connection. |
- sockets[1]->RestartPausedConnect(); |
- |
- base::RunLoop().RunUntilIdle(); |
- |
- EXPECT_FALSE(handle1.socket()); |
- EXPECT_TRUE(handle2.socket()->IsConnected()); |
- EXPECT_TRUE(handle3.socket()->IsConnected()); |
- EXPECT_TRUE(handle4.socket()->IsConnected()); |
-} |
- |
-// Make sure that no sockets connect before the "leader" socket, |
-// given that the leader has a successful connection. |
-TEST_P(SSLClientSocketPoolTest, SimultaneousConnectJobsSuccess) { |
- StaticSocketDataProvider data1; |
- StaticSocketDataProvider data2; |
- StaticSocketDataProvider data3; |
- socket_factory_.AddSocketDataProvider(&data1); |
- socket_factory_.AddSocketDataProvider(&data2); |
- socket_factory_.AddSocketDataProvider(&data3); |
- |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.is_in_session_cache = false; |
- ssl.should_pause_on_connect = true; |
- SSLSocketDataProvider ssl2(ASYNC, OK); |
- ssl2.is_in_session_cache = false; |
- SSLSocketDataProvider ssl3(ASYNC, OK); |
- ssl3.is_in_session_cache = false; |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- socket_factory_.AddSSLSocketDataProvider(&ssl2); |
- socket_factory_.AddSSLSocketDataProvider(&ssl3); |
- |
- enable_ssl_connect_job_waiting_ = true; |
- CreatePool(true, false, false); |
- |
- scoped_refptr<SSLSocketParams> params1 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params2 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- scoped_refptr<SSLSocketParams> params3 = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- ClientSocketHandle handle1; |
- ClientSocketHandle handle2; |
- ClientSocketHandle handle3; |
- TestCompletionCallback callback1; |
- TestCompletionCallback callback2; |
- TestCompletionCallback callback3; |
- |
- handle1.Init( |
- "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); |
- handle2.Init( |
- "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); |
- handle3.Init( |
- "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); |
- |
- // Allow the connections to proceed until the first socket has finished |
- // connecting. |
- base::RunLoop().RunUntilIdle(); |
- |
- std::vector<MockSSLClientSocket*> sockets = |
- socket_factory_.ssl_client_sockets(); |
- |
- std::vector<MockSSLClientSocket*>::const_iterator it = sockets.begin(); |
- // The first socket should have reached connect. |
- EXPECT_TRUE((*it)->reached_connect()); |
- ++it; |
- // No other socket should have reached connect yet. |
- for (; it != sockets.end(); ++it) |
- EXPECT_FALSE((*it)->reached_connect()); |
- |
- sockets[0]->RestartPausedConnect(); |
- |
- callback1.WaitForResult(); |
- callback2.WaitForResult(); |
- callback3.WaitForResult(); |
- |
- EXPECT_TRUE(handle1.socket()->IsConnected()); |
- EXPECT_TRUE(handle2.socket()->IsConnected()); |
- EXPECT_TRUE(handle3.socket()->IsConnected()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, TCPFail) { |
- StaticSocketDataProvider data; |
- data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED)); |
- socket_factory_.AddSocketDataProvider(&data); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
- false); |
- |
- ClientSocketHandle handle; |
- int rv = handle.Init("a", params, MEDIUM, CompletionCallback(), pool_.get(), |
- BoundNetLog()); |
- EXPECT_EQ(ERR_CONNECTION_FAILED, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- EXPECT_FALSE(handle.is_ssl_error()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, TCPFailAsync) { |
- StaticSocketDataProvider data; |
- data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_FAILED)); |
- socket_factory_.AddSocketDataProvider(&data); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- EXPECT_FALSE(handle.is_ssl_error()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, BasicDirect) { |
- StaticSocketDataProvider data; |
- data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(OK, rv); |
- EXPECT_TRUE(handle.is_initialized()); |
- EXPECT_TRUE(handle.socket()); |
- TestLoadTimingInfo(handle); |
-} |
- |
-// Make sure that SSLConnectJob passes on its priority to its |
-// socket request on Init (for the DIRECT case). |
-TEST_P(SSLClientSocketPoolTest, SetSocketRequestPriorityOnInitDirect) { |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = |
- SSLParams(ProxyServer::SCHEME_DIRECT, false); |
- |
- for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { |
- RequestPriority priority = static_cast<RequestPriority>(i); |
- StaticSocketDataProvider data; |
- data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- EXPECT_EQ(OK, handle.Init("a", params, priority, callback.callback(), |
- pool_.get(), BoundNetLog())); |
- EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); |
- handle.socket()->Disconnect(); |
- } |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, BasicDirectAsync) { |
- StaticSocketDataProvider data; |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(OK, callback.WaitForResult()); |
- EXPECT_TRUE(handle.is_initialized()); |
- EXPECT_TRUE(handle.socket()); |
- TestLoadTimingInfo(handle); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, DirectCertError) { |
- StaticSocketDataProvider data; |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(ASYNC, ERR_CERT_COMMON_NAME_INVALID); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, callback.WaitForResult()); |
- EXPECT_TRUE(handle.is_initialized()); |
- EXPECT_TRUE(handle.socket()); |
- TestLoadTimingInfo(handle); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, DirectSSLError) { |
- StaticSocketDataProvider data; |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, callback.WaitForResult()); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- EXPECT_TRUE(handle.is_ssl_error()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, DirectWithNPN) { |
- StaticSocketDataProvider data; |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.SetNextProto(kProtoHTTP11); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(OK, callback.WaitForResult()); |
- EXPECT_TRUE(handle.is_initialized()); |
- EXPECT_TRUE(handle.socket()); |
- TestLoadTimingInfo(handle); |
- SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); |
- EXPECT_TRUE(ssl_socket->WasNpnNegotiated()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, DirectNoSPDY) { |
- StaticSocketDataProvider data; |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.SetNextProto(kProtoHTTP11); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
- true); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(ERR_NPN_NEGOTIATION_FAILED, callback.WaitForResult()); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- EXPECT_TRUE(handle.is_ssl_error()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, DirectGotSPDY) { |
- StaticSocketDataProvider data; |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.SetNextProto(GetParam()); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
- true); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(OK, callback.WaitForResult()); |
- EXPECT_TRUE(handle.is_initialized()); |
- EXPECT_TRUE(handle.socket()); |
- TestLoadTimingInfo(handle); |
- |
- SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); |
- EXPECT_TRUE(ssl_socket->WasNpnNegotiated()); |
- std::string proto; |
- ssl_socket->GetNextProto(&proto); |
- EXPECT_EQ(GetParam(), SSLClientSocket::NextProtoFromString(proto)); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, DirectGotBonusSPDY) { |
- StaticSocketDataProvider data; |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.SetNextProto(GetParam()); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, |
- true); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(OK, callback.WaitForResult()); |
- EXPECT_TRUE(handle.is_initialized()); |
- EXPECT_TRUE(handle.socket()); |
- TestLoadTimingInfo(handle); |
- |
- SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); |
- EXPECT_TRUE(ssl_socket->WasNpnNegotiated()); |
- std::string proto; |
- ssl_socket->GetNextProto(&proto); |
- EXPECT_EQ(GetParam(), SSLClientSocket::NextProtoFromString(proto)); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, SOCKSFail) { |
- StaticSocketDataProvider data; |
- data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED)); |
- socket_factory_.AddSocketDataProvider(&data); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_CONNECTION_FAILED, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- EXPECT_FALSE(handle.is_ssl_error()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, SOCKSFailAsync) { |
- StaticSocketDataProvider data; |
- data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_FAILED)); |
- socket_factory_.AddSocketDataProvider(&data); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- EXPECT_FALSE(handle.is_ssl_error()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, SOCKSBasic) { |
- StaticSocketDataProvider data; |
- data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(OK, rv); |
- EXPECT_TRUE(handle.is_initialized()); |
- EXPECT_TRUE(handle.socket()); |
- // SOCKS5 generally has no DNS times, but the mock SOCKS5 sockets used here |
- // don't go through the real logic, unlike in the HTTP proxy tests. |
- TestLoadTimingInfo(handle); |
-} |
- |
-// Make sure that SSLConnectJob passes on its priority to its |
-// transport socket on Init (for the SOCKS_PROXY case). |
-TEST_P(SSLClientSocketPoolTest, SetTransportPriorityOnInitSOCKS) { |
- StaticSocketDataProvider data; |
- data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = |
- SSLParams(ProxyServer::SCHEME_SOCKS5, false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- EXPECT_EQ(OK, handle.Init("a", params, HIGHEST, callback.callback(), |
- pool_.get(), BoundNetLog())); |
- EXPECT_EQ(HIGHEST, transport_socket_pool_.last_request_priority()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, SOCKSBasicAsync) { |
- StaticSocketDataProvider data; |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(OK, callback.WaitForResult()); |
- EXPECT_TRUE(handle.is_initialized()); |
- EXPECT_TRUE(handle.socket()); |
- // SOCKS5 generally has no DNS times, but the mock SOCKS5 sockets used here |
- // don't go through the real logic, unlike in the HTTP proxy tests. |
- TestLoadTimingInfo(handle); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, HttpProxyFail) { |
- StaticSocketDataProvider data; |
- data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED)); |
- socket_factory_.AddSocketDataProvider(&data); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- EXPECT_FALSE(handle.is_ssl_error()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, HttpProxyFailAsync) { |
- StaticSocketDataProvider data; |
- data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_FAILED)); |
- socket_factory_.AddSocketDataProvider(&data); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult()); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- EXPECT_FALSE(handle.is_ssl_error()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, HttpProxyBasic) { |
- MockWrite writes[] = { |
- MockWrite(SYNCHRONOUS, |
- "CONNECT host:80 HTTP/1.1\r\n" |
- "Host: host\r\n" |
- "Proxy-Connection: keep-alive\r\n" |
- "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
- }; |
- MockRead reads[] = { |
- MockRead(SYNCHRONOUS, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
- }; |
- StaticSocketDataProvider data(reads, arraysize(reads), writes, |
- arraysize(writes)); |
- data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
- socket_factory_.AddSocketDataProvider(&data); |
- AddAuthToCache(); |
- SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(OK, rv); |
- EXPECT_TRUE(handle.is_initialized()); |
- EXPECT_TRUE(handle.socket()); |
- TestLoadTimingInfoNoDns(handle); |
-} |
- |
-// Make sure that SSLConnectJob passes on its priority to its |
-// transport socket on Init (for the HTTP_PROXY case). |
-TEST_P(SSLClientSocketPoolTest, SetTransportPriorityOnInitHTTP) { |
- MockWrite writes[] = { |
- MockWrite(SYNCHRONOUS, |
- "CONNECT host:80 HTTP/1.1\r\n" |
- "Host: host\r\n" |
- "Proxy-Connection: keep-alive\r\n" |
- "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
- }; |
- MockRead reads[] = { |
- MockRead(SYNCHRONOUS, "HTTP/1.1 200 Connection Established\r\n\r\n"), |
- }; |
- StaticSocketDataProvider data(reads, arraysize(reads), writes, |
- arraysize(writes)); |
- data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); |
- socket_factory_.AddSocketDataProvider(&data); |
- AddAuthToCache(); |
- SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = |
- SSLParams(ProxyServer::SCHEME_HTTP, false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- EXPECT_EQ(OK, handle.Init("a", params, HIGHEST, callback.callback(), |
- pool_.get(), BoundNetLog())); |
- EXPECT_EQ(HIGHEST, transport_socket_pool_.last_request_priority()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, HttpProxyBasicAsync) { |
- MockWrite writes[] = { |
- MockWrite("CONNECT host:80 HTTP/1.1\r\n" |
- "Host: host\r\n" |
- "Proxy-Connection: keep-alive\r\n" |
- "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), |
- }; |
- MockRead reads[] = { |
- MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), |
- }; |
- StaticSocketDataProvider data(reads, arraysize(reads), writes, |
- arraysize(writes)); |
- socket_factory_.AddSocketDataProvider(&data); |
- AddAuthToCache(); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(OK, callback.WaitForResult()); |
- EXPECT_TRUE(handle.is_initialized()); |
- EXPECT_TRUE(handle.socket()); |
- TestLoadTimingInfoNoDns(handle); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, NeedProxyAuth) { |
- MockWrite writes[] = { |
- MockWrite("CONNECT host:80 HTTP/1.1\r\n" |
- "Host: host\r\n" |
- "Proxy-Connection: keep-alive\r\n\r\n"), |
- }; |
- MockRead reads[] = { |
- MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), |
- MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), |
- MockRead("Content-Length: 10\r\n\r\n"), |
- MockRead("0123456789"), |
- }; |
- StaticSocketDataProvider data(reads, arraysize(reads), writes, |
- arraysize(writes)); |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(false, true /* http proxy pool */, true /* socks pool */); |
- scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, |
- false); |
- |
- ClientSocketHandle handle; |
- TestCompletionCallback callback; |
- int rv = handle.Init( |
- "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); |
- EXPECT_EQ(ERR_IO_PENDING, rv); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- |
- EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); |
- EXPECT_FALSE(handle.is_initialized()); |
- EXPECT_FALSE(handle.socket()); |
- EXPECT_FALSE(handle.is_ssl_error()); |
- const HttpResponseInfo& tunnel_info = handle.ssl_error_response_info(); |
- EXPECT_EQ(tunnel_info.headers->response_code(), 407); |
- scoped_ptr<ClientSocketHandle> tunnel_handle( |
- handle.release_pending_http_proxy_connection()); |
- EXPECT_TRUE(tunnel_handle->socket()); |
- EXPECT_FALSE(tunnel_handle->socket()->IsConnected()); |
-} |
- |
-TEST_P(SSLClientSocketPoolTest, IPPooling) { |
- const int kTestPort = 80; |
- struct TestHosts { |
- std::string name; |
- std::string iplist; |
- SpdySessionKey key; |
- AddressList addresses; |
- } test_hosts[] = { |
- { "www.webkit.org", "192.0.2.33,192.168.0.1,192.168.0.5" }, |
- { "code.google.com", "192.168.0.2,192.168.0.3,192.168.0.5" }, |
- { "js.webkit.org", "192.168.0.4,192.168.0.1,192.0.2.33" }, |
- }; |
- |
- host_resolver_.set_synchronous_mode(true); |
- for (size_t i = 0; i < arraysize(test_hosts); i++) { |
- host_resolver_.rules()->AddIPLiteralRule( |
- test_hosts[i].name, test_hosts[i].iplist, std::string()); |
- |
- // This test requires that the HostResolver cache be populated. Normal |
- // code would have done this already, but we do it manually. |
- HostResolver::RequestInfo info(HostPortPair(test_hosts[i].name, kTestPort)); |
- host_resolver_.Resolve(info, |
- DEFAULT_PRIORITY, |
- &test_hosts[i].addresses, |
- CompletionCallback(), |
- NULL, |
- BoundNetLog()); |
- |
- // Setup a SpdySessionKey |
- test_hosts[i].key = SpdySessionKey( |
- HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(), |
- PRIVACY_MODE_DISABLED); |
- } |
- |
- MockRead reads[] = { |
- MockRead(ASYNC, ERR_IO_PENDING), |
- }; |
- StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
- socket_factory_.AddSocketDataProvider(&data); |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.cert = X509Certificate::CreateFromBytes( |
- reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); |
- ssl.SetNextProto(GetParam()); |
- socket_factory_.AddSSLSocketDataProvider(&ssl); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- base::WeakPtr<SpdySession> spdy_session = |
- CreateSecureSpdySession(session_, test_hosts[0].key, BoundNetLog()); |
- |
- EXPECT_TRUE( |
- HasSpdySession(session_->spdy_session_pool(), test_hosts[0].key)); |
- EXPECT_FALSE( |
- HasSpdySession(session_->spdy_session_pool(), test_hosts[1].key)); |
- EXPECT_TRUE( |
- HasSpdySession(session_->spdy_session_pool(), test_hosts[2].key)); |
- |
- session_->spdy_session_pool()->CloseAllSessions(); |
-} |
- |
-void SSLClientSocketPoolTest::TestIPPoolingDisabled( |
- SSLSocketDataProvider* ssl) { |
- const int kTestPort = 80; |
- struct TestHosts { |
- std::string name; |
- std::string iplist; |
- SpdySessionKey key; |
- AddressList addresses; |
- } test_hosts[] = { |
- { "www.webkit.org", "192.0.2.33,192.168.0.1,192.168.0.5" }, |
- { "js.webkit.com", "192.168.0.4,192.168.0.1,192.0.2.33" }, |
- }; |
- |
- TestCompletionCallback callback; |
- int rv; |
- for (size_t i = 0; i < arraysize(test_hosts); i++) { |
- host_resolver_.rules()->AddIPLiteralRule( |
- test_hosts[i].name, test_hosts[i].iplist, std::string()); |
- |
- // This test requires that the HostResolver cache be populated. Normal |
- // code would have done this already, but we do it manually. |
- HostResolver::RequestInfo info(HostPortPair(test_hosts[i].name, kTestPort)); |
- rv = host_resolver_.Resolve(info, |
- DEFAULT_PRIORITY, |
- &test_hosts[i].addresses, |
- callback.callback(), |
- NULL, |
- BoundNetLog()); |
- EXPECT_EQ(OK, callback.GetResult(rv)); |
- |
- // Setup a SpdySessionKey |
- test_hosts[i].key = SpdySessionKey( |
- HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(), |
- PRIVACY_MODE_DISABLED); |
- } |
- |
- MockRead reads[] = { |
- MockRead(ASYNC, ERR_IO_PENDING), |
- }; |
- StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
- socket_factory_.AddSocketDataProvider(&data); |
- socket_factory_.AddSSLSocketDataProvider(ssl); |
- |
- CreatePool(true /* tcp pool */, false, false); |
- base::WeakPtr<SpdySession> spdy_session = |
- CreateSecureSpdySession(session_, test_hosts[0].key, BoundNetLog()); |
- |
- EXPECT_TRUE( |
- HasSpdySession(session_->spdy_session_pool(), test_hosts[0].key)); |
- EXPECT_FALSE( |
- HasSpdySession(session_->spdy_session_pool(), test_hosts[1].key)); |
- |
- session_->spdy_session_pool()->CloseAllSessions(); |
-} |
- |
-// Verifies that an SSL connection with client authentication disables SPDY IP |
-// pooling. |
-TEST_P(SSLClientSocketPoolTest, IPPoolingClientCert) { |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.cert = X509Certificate::CreateFromBytes( |
- reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); |
- ssl.client_cert_sent = true; |
- ssl.SetNextProto(GetParam()); |
- TestIPPoolingDisabled(&ssl); |
-} |
- |
-// Verifies that an SSL connection with channel ID disables SPDY IP pooling. |
-TEST_P(SSLClientSocketPoolTest, IPPoolingChannelID) { |
- SSLSocketDataProvider ssl(ASYNC, OK); |
- ssl.channel_id_sent = true; |
- ssl.SetNextProto(GetParam()); |
- TestIPPoolingDisabled(&ssl); |
-} |
- |
-// It would be nice to also test the timeouts in SSLClientSocketPool. |
- |
-} // namespace |
- |
-} // namespace net |