1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_proxy_client_socket_pool.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/auth.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/cert_verifier.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/mock_host_resolver.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/ssl_config_service_defaults.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/base/test_certificate_data.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/base/test_completion_callback.h" 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/http/http_auth_handler_factory.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_network_session.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_request_headers.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_response_headers.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/proxy/proxy_service.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/client_socket_handle.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/client_socket_pool_histograms.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/socket_test_util.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/spdy/spdy_session.h" 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/spdy/spdy_session_pool.h" 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net { 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kMaxSockets = 32; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kMaxSocketsPerGroup = 6; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SSLClientSocketPoolTest : public testing::Test { 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLClientSocketPoolTest() 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : proxy_service_(ProxyService::CreateDirect()), 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ssl_config_service_(new SSLConfigServiceDefaults), 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick http_auth_handler_factory_(HttpAuthHandlerFactory::CreateDefault( 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &host_resolver_)), 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session_(CreateNetworkSession()), 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen direct_transport_socket_params_(new TransportSocketParams( 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HostPortPair("host", 443), MEDIUM, GURL(), false, false)), 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_histograms_("MockTCP"), 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_socket_pool_( 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kMaxSockets, 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kMaxSocketsPerGroup, 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &transport_histograms_, 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &socket_factory_), 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen proxy_transport_socket_params_(new TransportSocketParams( 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HostPortPair("proxy", 443), MEDIUM, GURL(), false, false)), 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socks_socket_params_(new SOCKSSocketParams( 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen proxy_transport_socket_params_, true, 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HostPortPair("sockshost", 443), MEDIUM, GURL())), 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick socks_histograms_("MockSOCKS"), 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick socks_socket_pool_( 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kMaxSockets, 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kMaxSocketsPerGroup, 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &socks_histograms_, 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &transport_socket_pool_), 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick http_proxy_socket_params_(new HttpProxySocketParams( 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen proxy_transport_socket_params_, NULL, GURL("http://host"), "", 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HostPortPair("host", 80), 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen session_->http_auth_cache(), 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick session_->http_auth_handler_factory(), 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick session_->spdy_session_pool(), 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick true)), 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick http_proxy_histograms_("MockHttpProxy"), 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick http_proxy_socket_pool_( 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kMaxSockets, 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kMaxSocketsPerGroup, 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &http_proxy_histograms_, 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &host_resolver_, 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &transport_socket_pool_, 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL, 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL) { 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLConfigService> ssl_config_service( 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new SSLConfigServiceDefaults); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl_config_service->GetSSLConfig(&ssl_config_); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void CreatePool(bool transport_pool, bool http_proxy_pool, bool socks_pool) { 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ssl_histograms_.reset(new ClientSocketPoolHistograms("SSLUnitTest")); 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick pool_.reset(new SSLClientSocketPool( 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kMaxSockets, 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kMaxSocketsPerGroup, 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ssl_histograms_.get(), 9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NULL /* host_resolver */, 9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NULL /* cert_verifier */, 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NULL /* dnsrr_resolver */, 95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch NULL /* dns_cert_checker */, 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NULL /* ssl_host_info_factory */, 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &socket_factory_, 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_pool ? &transport_socket_pool_ : NULL, 993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick socks_pool ? &socks_socket_pool_ : NULL, 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick http_proxy_pool ? &http_proxy_socket_pool_ : NULL, 1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL, 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL)); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_refptr<SSLSocketParams> SSLParams(ProxyServer::Scheme proxy, 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool want_spdy_over_npn) { 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return make_scoped_refptr(new SSLSocketParams( 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen proxy == ProxyServer::SCHEME_DIRECT ? 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen direct_transport_socket_params_ : NULL, 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch proxy == ProxyServer::SCHEME_SOCKS5 ? socks_socket_params_ : NULL, 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick proxy == ProxyServer::SCHEME_HTTP ? http_proxy_socket_params_ : NULL, 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch proxy, 1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch HostPortPair("host", 443), 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl_config_, 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0, 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false, 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick want_spdy_over_npn)); 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void AddAuthToCache() { 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16 kFoo(ASCIIToUTF16("foo")); 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const string16 kBar(ASCIIToUTF16("bar")); 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen session_->http_auth_cache()->Add(GURL("http://proxy:443/"), 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen "MyRealm1", 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen HttpAuth::AUTH_SCHEME_BASIC, 126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen "Basic realm=MyRealm1", 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen kFoo, 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen kBar, 129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen "/"); 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpNetworkSession* CreateNetworkSession() { 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpNetworkSession::Params params; 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen params.host_resolver = &host_resolver_; 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen params.cert_verifier = &cert_verifier_; 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen params.proxy_service = proxy_service_; 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen params.client_socket_factory = &socket_factory_; 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen params.ssl_config_service = ssl_config_service_; 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen params.http_auth_handler_factory = http_auth_handler_factory_.get(); 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return new HttpNetworkSession(params); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockClientSocketFactory socket_factory_; 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockCachingHostResolver host_resolver_; 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CertVerifier cert_verifier_; 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const scoped_refptr<ProxyService> proxy_service_; 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const scoped_refptr<SSLConfigService> ssl_config_service_; 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const scoped_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_; 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const scoped_refptr<HttpNetworkSession> session_; 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<TransportSocketParams> direct_transport_socket_params_; 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ClientSocketPoolHistograms transport_histograms_; 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockTransportClientSocketPool transport_socket_pool_; 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<TransportSocketParams> proxy_transport_socket_params_; 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SOCKSSocketParams> socks_socket_params_; 1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ClientSocketPoolHistograms socks_histograms_; 1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick MockSOCKSClientSocketPool socks_socket_pool_; 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_refptr<HttpProxySocketParams> http_proxy_socket_params_; 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ClientSocketPoolHistograms http_proxy_histograms_; 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HttpProxyClientSocketPool http_proxy_socket_pool_; 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLConfig ssl_config_; 1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<ClientSocketPoolHistograms> ssl_histograms_; 1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<SSLClientSocketPool> pool_; 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, TCPFail) { 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED)); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(true /* tcp pool */, false, false); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init("a", params, MEDIUM, NULL, pool_.get(), BoundNetLog()); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_CONNECTION_FAILED, rv); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_ssl_error()); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, TCPFailAsync) { 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.set_connect_data(MockConnect(true, ERR_CONNECTION_FAILED)); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(true /* tcp pool */, false, false); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_ssl_error()); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, BasicDirect) { 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.set_connect_data(MockConnect(false, OK)); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(false, OK); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(true /* tcp pool */, false, false); 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, rv); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, BasicDirectAsync) { 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(true, OK); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(true /* tcp pool */, false, false); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, callback.WaitForResult()); 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, DirectCertError) { 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(true, ERR_CERT_COMMON_NAME_INVALID); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(true /* tcp pool */, false, false); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, callback.WaitForResult()); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, DirectSSLError) { 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(true, ERR_SSL_PROTOCOL_ERROR); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(true /* tcp pool */, false, false); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, callback.WaitForResult()); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_ssl_error()); 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, DirectWithNPN) { 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(true, OK); 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl.next_proto = "http/1.1"; 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(true /* tcp pool */, false, false); 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, callback.WaitForResult()); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); 3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(ssl_socket->was_npn_negotiated()); 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, DirectNoSPDY) { 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(true, OK); 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl.next_proto = "http/1.1"; 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(true /* tcp pool */, false, false); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick true); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_NPN_NEGOTIATION_FAILED, callback.WaitForResult()); 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_ssl_error()); 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, DirectGotSPDY) { 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(true, OK); 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; 3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ssl.next_proto = "spdy/2"; 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(true /* tcp pool */, false, false); 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick true); 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, callback.WaitForResult()); 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); 3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(ssl_socket->was_npn_negotiated()); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string proto; 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl_socket->GetNextProto(&proto); 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), 3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SSLClientSocket::kProtoSPDY2); 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, DirectGotBonusSPDY) { 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(true, OK); 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; 3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ssl.next_proto = "spdy/2"; 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(true /* tcp pool */, false, false); 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick true); 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, callback.WaitForResult()); 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); 4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(ssl_socket->was_npn_negotiated()); 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string proto; 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ssl_socket->GetNextProto(&proto); 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), 4143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SSLClientSocket::kProtoSPDY2); 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, SOCKSFail) { 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED)); 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(false, true /* http proxy pool */, true /* socks pool */); 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, 4243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 4283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 4293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_CONNECTION_FAILED, rv); 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_ssl_error()); 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, SOCKSFailAsync) { 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.set_connect_data(MockConnect(true, ERR_CONNECTION_FAILED)); 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(false, true /* http proxy pool */, true /* socks pool */); 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, 4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_ssl_error()); 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, SOCKSBasic) { 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.set_connect_data(MockConnect(false, OK)); 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(false, OK); 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(false, true /* http proxy pool */, true /* socks pool */); 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, 4683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, rv); 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, SOCKSBasicAsync) { 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(true, OK); 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(false, true /* http proxy pool */, true /* socks pool */); 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, 4873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, callback.WaitForResult()); 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, HttpProxyFail) { 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED)); 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(false, true /* http proxy pool */, true /* socks pool */); 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, 5093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_ssl_error()); 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, HttpProxyFailAsync) { 522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data; 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.set_connect_data(MockConnect(true, ERR_CONNECTION_FAILED)); 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(false, true /* http proxy pool */, true /* socks pool */); 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, 5283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick false); 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 5323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 5333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult()); 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_ssl_error()); 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, HttpProxyBasic) { 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockWrite writes[] = { 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockWrite(false, 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "CONNECT host:80 HTTP/1.1\r\n" 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Host: host\r\n" 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Proxy-Connection: keep-alive\r\n" 5503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead reads[] = { 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead(false, "HTTP/1.1 200 Connection Established\r\n\r\n"), 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data(reads, arraysize(reads), writes, 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch arraysize(writes)); 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.set_connect_data(MockConnect(false, OK)); 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddAuthToCache(); 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(false, OK); 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(false, true /* http proxy pool */, true /* socks pool */); 564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, 565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch false); 566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 5693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 5703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, rv); 572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, HttpProxyBasicAsync) { 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockWrite writes[] = { 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockWrite("CONNECT host:80 HTTP/1.1\r\n" 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Host: host\r\n" 580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Proxy-Connection: keep-alive\r\n" 5813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), 582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead reads[] = { 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), 585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data(reads, arraysize(reads), writes, 587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch arraysize(writes)); 588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 5893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddAuthToCache(); 590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(true, OK); 591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(false, true /* http proxy pool */, true /* socks pool */); 594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, 595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch false); 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 6003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, callback.WaitForResult()); 606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SSLClientSocketPoolTest, NeedProxyAuth) { 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockWrite writes[] = { 612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockWrite("CONNECT host:80 HTTP/1.1\r\n" 613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Host: host\r\n" 614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Proxy-Connection: keep-alive\r\n\r\n"), 615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead reads[] = { 617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead("Content-Length: 10\r\n\r\n"), 620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead("0123456789"), 621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StaticSocketDataProvider data(reads, arraysize(reads), writes, 623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch arraysize(writes)); 624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSocketDataProvider(&data); 625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SSLSocketDataProvider ssl(true, OK); 626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_factory_.AddSSLSocketDataProvider(&ssl); 627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreatePool(false, true /* http proxy pool */, true /* socks pool */); 629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, 630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch false); 631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 6343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init( 6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_ssl_error()); 644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const HttpResponseInfo& tunnel_info = handle.ssl_error_response_info(); 645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(tunnel_info.headers->response_code(), 407); 6463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<ClientSocketHandle> tunnel_handle( 6473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick handle.release_pending_http_proxy_connection()); 6483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(tunnel_handle->socket()); 6493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(tunnel_handle->socket()->IsConnected()); 650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 652ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SSLClientSocketPoolTest, IPPooling) { 653ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const int kTestPort = 80; 654ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen struct TestHosts { 655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string name; 656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string iplist; 657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HostPortProxyPair pair; 658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } test_hosts[] = { 659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { "www.webkit.org", "192.168.0.1,192.168.0.5" }, 660ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { "code.google.com", "192.168.0.2,192.168.0.3,192.168.0.5" }, 661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen { "js.webkit.org", "192.168.0.4,192.168.0.5" }, 662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 664ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_resolver_.set_synchronous_mode(true); 665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_hosts); i++) { 666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_resolver_.rules()->AddIPLiteralRule(test_hosts[i].name, 667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_hosts[i].iplist, ""); 668ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // This test requires that the HostResolver cache be populated. Normal 670ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // code would have done this already, but we do it manually. 671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HostResolver::RequestInfo info(HostPortPair(test_hosts[i].name, kTestPort)); 672ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddressList result; 673ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen host_resolver_.Resolve(info, &result, NULL, NULL, BoundNetLog()); 674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Setup a HostPortProxyPair 676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_hosts[i].pair = HostPortProxyPair( 677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct()); 678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockRead reads[] = { 681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockRead(true, ERR_IO_PENDING), 682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); 684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen socket_factory_.AddSocketDataProvider(&data); 685ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SSLSocketDataProvider ssl(true, OK); 686ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ssl.cert_ = X509Certificate::CreateFromBytes( 687ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); 688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; 689ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ssl.next_proto = "spdy/2"; 690ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen socket_factory_.AddSSLSocketDataProvider(&ssl); 691ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreatePool(true /* tcp pool */, false, false); 693ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, 694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen true); 695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<ClientSocketHandle> handle(new ClientSocketHandle()); 697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TestCompletionCallback callback; 698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int rv = handle->Init( 699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "a", params, MEDIUM, &callback, pool_.get(), BoundNetLog()); 700ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(ERR_IO_PENDING, rv); 701ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(handle->is_initialized()); 702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(handle->socket()); 703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(OK, callback.WaitForResult()); 705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(handle->is_initialized()); 706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(handle->socket()); 707ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 708ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle->socket()); 709ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(ssl_socket->was_npn_negotiated()); 710ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string proto; 711ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ssl_socket->GetNextProto(&proto); 712ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto), 713ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SSLClientSocket::kProtoSPDY2); 714ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 715ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<SpdySession> spdy_session; 716ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen rv = session_->spdy_session_pool()->GetSpdySessionFromSocket( 717ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_hosts[0].pair, handle.release(), BoundNetLog(), 0, 718ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &spdy_session, true); 719ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, rv); 720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 721ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(session_->spdy_session_pool()->HasSession(test_hosts[0].pair)); 722ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(session_->spdy_session_pool()->HasSession(test_hosts[1].pair)); 723ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(session_->spdy_session_pool()->HasSession(test_hosts[2].pair)); 724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen session_->spdy_session_pool()->CloseAllSessions(); 726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 727ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// It would be nice to also test the timeouts in SSLClientSocketPool. 729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace net 733