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