Home | History | Annotate | Download | only in socket
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "net/http/http_proxy_client_socket_pool.h"
      6 
      7 #include "base/callback.h"
      8 #include "base/compiler_specific.h"
      9 #include "base/strings/string_util.h"
     10 #include "base/strings/utf_string_conversions.h"
     11 #include "base/time/time.h"
     12 #include "net/base/auth.h"
     13 #include "net/base/load_timing_info.h"
     14 #include "net/base/load_timing_info_test_util.h"
     15 #include "net/base/net_errors.h"
     16 #include "net/base/test_completion_callback.h"
     17 #include "net/cert/cert_verifier.h"
     18 #include "net/dns/mock_host_resolver.h"
     19 #include "net/http/http_auth_handler_factory.h"
     20 #include "net/http/http_network_session.h"
     21 #include "net/http/http_request_headers.h"
     22 #include "net/http/http_response_headers.h"
     23 #include "net/http/http_server_properties_impl.h"
     24 #include "net/proxy/proxy_service.h"
     25 #include "net/socket/client_socket_handle.h"
     26 #include "net/socket/client_socket_pool_histograms.h"
     27 #include "net/socket/next_proto.h"
     28 #include "net/socket/socket_test_util.h"
     29 #include "net/spdy/spdy_session.h"
     30 #include "net/spdy/spdy_session_pool.h"
     31 #include "net/spdy/spdy_test_util_common.h"
     32 #include "net/ssl/ssl_config_service_defaults.h"
     33 #include "net/test/test_certificate_data.h"
     34 #include "testing/gtest/include/gtest/gtest.h"
     35 
     36 namespace net {
     37 
     38 namespace {
     39 
     40 const int kMaxSockets = 32;
     41 const int kMaxSocketsPerGroup = 6;
     42 
     43 // Make sure |handle|'s load times are set correctly.  DNS and connect start
     44 // times comes from mock client sockets in these tests, so primarily serves to
     45 // check those times were copied, and ssl times / connect end are set correctly.
     46 void TestLoadTimingInfo(const ClientSocketHandle& handle) {
     47   LoadTimingInfo load_timing_info;
     48   EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
     49 
     50   EXPECT_FALSE(load_timing_info.socket_reused);
     51   // None of these tests use a NetLog.
     52   EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
     53 
     54   ExpectConnectTimingHasTimes(
     55       load_timing_info.connect_timing,
     56       CONNECT_TIMING_HAS_SSL_TIMES | CONNECT_TIMING_HAS_DNS_TIMES);
     57   ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
     58 }
     59 
     60 // Just like TestLoadTimingInfo, except DNS times are expected to be null, for
     61 // tests over proxies that do DNS lookups themselves.
     62 void TestLoadTimingInfoNoDns(const ClientSocketHandle& handle) {
     63   LoadTimingInfo load_timing_info;
     64   EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
     65 
     66   // None of these tests use a NetLog.
     67   EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
     68 
     69   EXPECT_FALSE(load_timing_info.socket_reused);
     70 
     71   ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
     72                               CONNECT_TIMING_HAS_SSL_TIMES);
     73   ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
     74 }
     75 
     76 class SSLClientSocketPoolTest
     77     : public testing::Test,
     78       public ::testing::WithParamInterface<NextProto> {
     79  protected:
     80   SSLClientSocketPoolTest()
     81       : proxy_service_(ProxyService::CreateDirect()),
     82         ssl_config_service_(new SSLConfigServiceDefaults),
     83         http_auth_handler_factory_(
     84             HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
     85         session_(CreateNetworkSession()),
     86         direct_transport_socket_params_(
     87             new TransportSocketParams(HostPortPair("host", 443),
     88                                       MEDIUM,
     89                                       false,
     90                                       false,
     91                                       OnHostResolutionCallback())),
     92         transport_histograms_("MockTCP"),
     93         transport_socket_pool_(kMaxSockets,
     94                                kMaxSocketsPerGroup,
     95                                &transport_histograms_,
     96                                &socket_factory_),
     97         proxy_transport_socket_params_(
     98             new TransportSocketParams(HostPortPair("proxy", 443),
     99                                       MEDIUM,
    100                                       false,
    101                                       false,
    102                                       OnHostResolutionCallback())),
    103         socks_socket_params_(
    104             new SOCKSSocketParams(proxy_transport_socket_params_,
    105                                   true,
    106                                   HostPortPair("sockshost", 443),
    107                                   MEDIUM)),
    108         socks_histograms_("MockSOCKS"),
    109         socks_socket_pool_(kMaxSockets,
    110                            kMaxSocketsPerGroup,
    111                            &socks_histograms_,
    112                            &transport_socket_pool_),
    113         http_proxy_socket_params_(
    114             new HttpProxySocketParams(proxy_transport_socket_params_,
    115                                       NULL,
    116                                       GURL("http://host"),
    117                                       std::string(),
    118                                       HostPortPair("host", 80),
    119                                       session_->http_auth_cache(),
    120                                       session_->http_auth_handler_factory(),
    121                                       session_->spdy_session_pool(),
    122                                       true)),
    123         http_proxy_histograms_("MockHttpProxy"),
    124         http_proxy_socket_pool_(kMaxSockets,
    125                                 kMaxSocketsPerGroup,
    126                                 &http_proxy_histograms_,
    127                                 &host_resolver_,
    128                                 &transport_socket_pool_,
    129                                 NULL,
    130                                 NULL) {
    131     scoped_refptr<SSLConfigService> ssl_config_service(
    132         new SSLConfigServiceDefaults);
    133     ssl_config_service->GetSSLConfig(&ssl_config_);
    134   }
    135 
    136   void CreatePool(bool transport_pool, bool http_proxy_pool, bool socks_pool) {
    137     ssl_histograms_.reset(new ClientSocketPoolHistograms("SSLUnitTest"));
    138     pool_.reset(new SSLClientSocketPool(
    139         kMaxSockets,
    140         kMaxSocketsPerGroup,
    141         ssl_histograms_.get(),
    142         NULL /* host_resolver */,
    143         NULL /* cert_verifier */,
    144         NULL /* server_bound_cert_service */,
    145         NULL /* transport_security_state */,
    146         std::string() /* ssl_session_cache_shard */,
    147         &socket_factory_,
    148         transport_pool ? &transport_socket_pool_ : NULL,
    149         socks_pool ? &socks_socket_pool_ : NULL,
    150         http_proxy_pool ? &http_proxy_socket_pool_ : NULL,
    151         NULL,
    152         NULL));
    153   }
    154 
    155   scoped_refptr<SSLSocketParams> SSLParams(ProxyServer::Scheme proxy,
    156                                            bool want_spdy_over_npn) {
    157     return make_scoped_refptr(new SSLSocketParams(
    158         proxy == ProxyServer::SCHEME_DIRECT ? direct_transport_socket_params_
    159                                             : NULL,
    160         proxy == ProxyServer::SCHEME_SOCKS5 ? socks_socket_params_ : NULL,
    161         proxy == ProxyServer::SCHEME_HTTP ? http_proxy_socket_params_ : NULL,
    162         proxy,
    163         HostPortPair("host", 443),
    164         ssl_config_,
    165         kPrivacyModeDisabled,
    166         0,
    167         false,
    168         want_spdy_over_npn));
    169   }
    170 
    171   void AddAuthToCache() {
    172     const base::string16 kFoo(ASCIIToUTF16("foo"));
    173     const base::string16 kBar(ASCIIToUTF16("bar"));
    174     session_->http_auth_cache()->Add(GURL("http://proxy:443/"),
    175                                      "MyRealm1",
    176                                      HttpAuth::AUTH_SCHEME_BASIC,
    177                                      "Basic realm=MyRealm1",
    178                                      AuthCredentials(kFoo, kBar),
    179                                      "/");
    180   }
    181 
    182   HttpNetworkSession* CreateNetworkSession() {
    183     HttpNetworkSession::Params params;
    184     params.host_resolver = &host_resolver_;
    185     params.cert_verifier = cert_verifier_.get();
    186     params.transport_security_state = transport_security_state_.get();
    187     params.proxy_service = proxy_service_.get();
    188     params.client_socket_factory = &socket_factory_;
    189     params.ssl_config_service = ssl_config_service_.get();
    190     params.http_auth_handler_factory = http_auth_handler_factory_.get();
    191     params.http_server_properties =
    192         http_server_properties_.GetWeakPtr();
    193     params.enable_spdy_compression = false;
    194     params.spdy_default_protocol = GetParam();
    195     return new HttpNetworkSession(params);
    196   }
    197 
    198   void TestIPPoolingDisabled(SSLSocketDataProvider* ssl);
    199 
    200   MockClientSocketFactory socket_factory_;
    201   MockCachingHostResolver host_resolver_;
    202   scoped_ptr<CertVerifier> cert_verifier_;
    203   scoped_ptr<TransportSecurityState> transport_security_state_;
    204   const scoped_ptr<ProxyService> proxy_service_;
    205   const scoped_refptr<SSLConfigService> ssl_config_service_;
    206   const scoped_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_;
    207   HttpServerPropertiesImpl http_server_properties_;
    208   const scoped_refptr<HttpNetworkSession> session_;
    209 
    210   scoped_refptr<TransportSocketParams> direct_transport_socket_params_;
    211   ClientSocketPoolHistograms transport_histograms_;
    212   MockTransportClientSocketPool transport_socket_pool_;
    213 
    214   scoped_refptr<TransportSocketParams> proxy_transport_socket_params_;
    215 
    216   scoped_refptr<SOCKSSocketParams> socks_socket_params_;
    217   ClientSocketPoolHistograms socks_histograms_;
    218   MockSOCKSClientSocketPool socks_socket_pool_;
    219 
    220   scoped_refptr<HttpProxySocketParams> http_proxy_socket_params_;
    221   ClientSocketPoolHistograms http_proxy_histograms_;
    222   HttpProxyClientSocketPool http_proxy_socket_pool_;
    223 
    224   SSLConfig ssl_config_;
    225   scoped_ptr<ClientSocketPoolHistograms> ssl_histograms_;
    226   scoped_ptr<SSLClientSocketPool> pool_;
    227 };
    228 
    229 INSTANTIATE_TEST_CASE_P(
    230     NextProto,
    231     SSLClientSocketPoolTest,
    232     testing::Values(kProtoSPDY2, kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2,
    233                     kProtoHTTP2Draft04));
    234 
    235 TEST_P(SSLClientSocketPoolTest, TCPFail) {
    236   StaticSocketDataProvider data;
    237   data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED));
    238   socket_factory_.AddSocketDataProvider(&data);
    239 
    240   CreatePool(true /* tcp pool */, false, false);
    241   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
    242                                                     false);
    243 
    244   ClientSocketHandle handle;
    245   int rv = handle.Init("a", params, MEDIUM, CompletionCallback(), pool_.get(),
    246                        BoundNetLog());
    247   EXPECT_EQ(ERR_CONNECTION_FAILED, rv);
    248   EXPECT_FALSE(handle.is_initialized());
    249   EXPECT_FALSE(handle.socket());
    250   EXPECT_FALSE(handle.is_ssl_error());
    251 }
    252 
    253 TEST_P(SSLClientSocketPoolTest, TCPFailAsync) {
    254   StaticSocketDataProvider data;
    255   data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_FAILED));
    256   socket_factory_.AddSocketDataProvider(&data);
    257 
    258   CreatePool(true /* tcp pool */, false, false);
    259   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
    260                                                     false);
    261 
    262   ClientSocketHandle handle;
    263   TestCompletionCallback callback;
    264   int rv = handle.Init(
    265       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    266   EXPECT_EQ(ERR_IO_PENDING, rv);
    267   EXPECT_FALSE(handle.is_initialized());
    268   EXPECT_FALSE(handle.socket());
    269 
    270   EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
    271   EXPECT_FALSE(handle.is_initialized());
    272   EXPECT_FALSE(handle.socket());
    273   EXPECT_FALSE(handle.is_ssl_error());
    274 }
    275 
    276 TEST_P(SSLClientSocketPoolTest, BasicDirect) {
    277   StaticSocketDataProvider data;
    278   data.set_connect_data(MockConnect(SYNCHRONOUS, OK));
    279   socket_factory_.AddSocketDataProvider(&data);
    280   SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
    281   socket_factory_.AddSSLSocketDataProvider(&ssl);
    282 
    283   CreatePool(true /* tcp pool */, false, false);
    284   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
    285                                                     false);
    286 
    287   ClientSocketHandle handle;
    288   TestCompletionCallback callback;
    289   int rv = handle.Init(
    290       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    291   EXPECT_EQ(OK, rv);
    292   EXPECT_TRUE(handle.is_initialized());
    293   EXPECT_TRUE(handle.socket());
    294   TestLoadTimingInfo(handle);
    295 }
    296 
    297 TEST_P(SSLClientSocketPoolTest, BasicDirectAsync) {
    298   StaticSocketDataProvider data;
    299   socket_factory_.AddSocketDataProvider(&data);
    300   SSLSocketDataProvider ssl(ASYNC, OK);
    301   socket_factory_.AddSSLSocketDataProvider(&ssl);
    302 
    303   CreatePool(true /* tcp pool */, false, false);
    304   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
    305                                                     false);
    306 
    307   ClientSocketHandle handle;
    308   TestCompletionCallback callback;
    309   int rv = handle.Init(
    310       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    311   EXPECT_EQ(ERR_IO_PENDING, rv);
    312   EXPECT_FALSE(handle.is_initialized());
    313   EXPECT_FALSE(handle.socket());
    314 
    315   EXPECT_EQ(OK, callback.WaitForResult());
    316   EXPECT_TRUE(handle.is_initialized());
    317   EXPECT_TRUE(handle.socket());
    318   TestLoadTimingInfo(handle);
    319 }
    320 
    321 TEST_P(SSLClientSocketPoolTest, DirectCertError) {
    322   StaticSocketDataProvider data;
    323   socket_factory_.AddSocketDataProvider(&data);
    324   SSLSocketDataProvider ssl(ASYNC, ERR_CERT_COMMON_NAME_INVALID);
    325   socket_factory_.AddSSLSocketDataProvider(&ssl);
    326 
    327   CreatePool(true /* tcp pool */, false, false);
    328   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
    329                                                     false);
    330 
    331   ClientSocketHandle handle;
    332   TestCompletionCallback callback;
    333   int rv = handle.Init(
    334       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    335   EXPECT_EQ(ERR_IO_PENDING, rv);
    336   EXPECT_FALSE(handle.is_initialized());
    337   EXPECT_FALSE(handle.socket());
    338 
    339   EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, callback.WaitForResult());
    340   EXPECT_TRUE(handle.is_initialized());
    341   EXPECT_TRUE(handle.socket());
    342   TestLoadTimingInfo(handle);
    343 }
    344 
    345 TEST_P(SSLClientSocketPoolTest, DirectSSLError) {
    346   StaticSocketDataProvider data;
    347   socket_factory_.AddSocketDataProvider(&data);
    348   SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR);
    349   socket_factory_.AddSSLSocketDataProvider(&ssl);
    350 
    351   CreatePool(true /* tcp pool */, false, false);
    352   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
    353                                                     false);
    354 
    355   ClientSocketHandle handle;
    356   TestCompletionCallback callback;
    357   int rv = handle.Init(
    358       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    359   EXPECT_EQ(ERR_IO_PENDING, rv);
    360   EXPECT_FALSE(handle.is_initialized());
    361   EXPECT_FALSE(handle.socket());
    362 
    363   EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, callback.WaitForResult());
    364   EXPECT_FALSE(handle.is_initialized());
    365   EXPECT_FALSE(handle.socket());
    366   EXPECT_TRUE(handle.is_ssl_error());
    367 }
    368 
    369 TEST_P(SSLClientSocketPoolTest, DirectWithNPN) {
    370   StaticSocketDataProvider data;
    371   socket_factory_.AddSocketDataProvider(&data);
    372   SSLSocketDataProvider ssl(ASYNC, OK);
    373   ssl.SetNextProto(kProtoHTTP11);
    374   socket_factory_.AddSSLSocketDataProvider(&ssl);
    375 
    376   CreatePool(true /* tcp pool */, false, false);
    377   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
    378                                                     false);
    379 
    380   ClientSocketHandle handle;
    381   TestCompletionCallback callback;
    382   int rv = handle.Init(
    383       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    384   EXPECT_EQ(ERR_IO_PENDING, rv);
    385   EXPECT_FALSE(handle.is_initialized());
    386   EXPECT_FALSE(handle.socket());
    387 
    388   EXPECT_EQ(OK, callback.WaitForResult());
    389   EXPECT_TRUE(handle.is_initialized());
    390   EXPECT_TRUE(handle.socket());
    391   TestLoadTimingInfo(handle);
    392   SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket());
    393   EXPECT_TRUE(ssl_socket->WasNpnNegotiated());
    394 }
    395 
    396 TEST_P(SSLClientSocketPoolTest, DirectNoSPDY) {
    397   StaticSocketDataProvider data;
    398   socket_factory_.AddSocketDataProvider(&data);
    399   SSLSocketDataProvider ssl(ASYNC, OK);
    400   ssl.SetNextProto(kProtoHTTP11);
    401   socket_factory_.AddSSLSocketDataProvider(&ssl);
    402 
    403   CreatePool(true /* tcp pool */, false, false);
    404   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
    405                                                     true);
    406 
    407   ClientSocketHandle handle;
    408   TestCompletionCallback callback;
    409   int rv = handle.Init(
    410       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    411   EXPECT_EQ(ERR_IO_PENDING, rv);
    412   EXPECT_FALSE(handle.is_initialized());
    413   EXPECT_FALSE(handle.socket());
    414 
    415   EXPECT_EQ(ERR_NPN_NEGOTIATION_FAILED, callback.WaitForResult());
    416   EXPECT_FALSE(handle.is_initialized());
    417   EXPECT_FALSE(handle.socket());
    418   EXPECT_TRUE(handle.is_ssl_error());
    419 }
    420 
    421 TEST_P(SSLClientSocketPoolTest, DirectGotSPDY) {
    422   StaticSocketDataProvider data;
    423   socket_factory_.AddSocketDataProvider(&data);
    424   SSLSocketDataProvider ssl(ASYNC, OK);
    425   ssl.SetNextProto(GetParam());
    426   socket_factory_.AddSSLSocketDataProvider(&ssl);
    427 
    428   CreatePool(true /* tcp pool */, false, false);
    429   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
    430                                                     true);
    431 
    432   ClientSocketHandle handle;
    433   TestCompletionCallback callback;
    434   int rv = handle.Init(
    435       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    436   EXPECT_EQ(ERR_IO_PENDING, rv);
    437   EXPECT_FALSE(handle.is_initialized());
    438   EXPECT_FALSE(handle.socket());
    439 
    440   EXPECT_EQ(OK, callback.WaitForResult());
    441   EXPECT_TRUE(handle.is_initialized());
    442   EXPECT_TRUE(handle.socket());
    443   TestLoadTimingInfo(handle);
    444 
    445   SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket());
    446   EXPECT_TRUE(ssl_socket->WasNpnNegotiated());
    447   std::string proto;
    448   std::string server_protos;
    449   ssl_socket->GetNextProto(&proto, &server_protos);
    450   EXPECT_EQ(GetParam(), SSLClientSocket::NextProtoFromString(proto));
    451 }
    452 
    453 TEST_P(SSLClientSocketPoolTest, DirectGotBonusSPDY) {
    454   StaticSocketDataProvider data;
    455   socket_factory_.AddSocketDataProvider(&data);
    456   SSLSocketDataProvider ssl(ASYNC, OK);
    457   ssl.SetNextProto(GetParam());
    458   socket_factory_.AddSSLSocketDataProvider(&ssl);
    459 
    460   CreatePool(true /* tcp pool */, false, false);
    461   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
    462                                                     true);
    463 
    464   ClientSocketHandle handle;
    465   TestCompletionCallback callback;
    466   int rv = handle.Init(
    467       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    468   EXPECT_EQ(ERR_IO_PENDING, rv);
    469   EXPECT_FALSE(handle.is_initialized());
    470   EXPECT_FALSE(handle.socket());
    471 
    472   EXPECT_EQ(OK, callback.WaitForResult());
    473   EXPECT_TRUE(handle.is_initialized());
    474   EXPECT_TRUE(handle.socket());
    475   TestLoadTimingInfo(handle);
    476 
    477   SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket());
    478   EXPECT_TRUE(ssl_socket->WasNpnNegotiated());
    479   std::string proto;
    480   std::string server_protos;
    481   ssl_socket->GetNextProto(&proto, &server_protos);
    482   EXPECT_EQ(GetParam(), SSLClientSocket::NextProtoFromString(proto));
    483 }
    484 
    485 TEST_P(SSLClientSocketPoolTest, SOCKSFail) {
    486   StaticSocketDataProvider data;
    487   data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED));
    488   socket_factory_.AddSocketDataProvider(&data);
    489 
    490   CreatePool(false, true /* http proxy pool */, true /* socks pool */);
    491   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
    492                                                     false);
    493 
    494   ClientSocketHandle handle;
    495   TestCompletionCallback callback;
    496   int rv = handle.Init(
    497       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    498   EXPECT_EQ(ERR_CONNECTION_FAILED, rv);
    499   EXPECT_FALSE(handle.is_initialized());
    500   EXPECT_FALSE(handle.socket());
    501   EXPECT_FALSE(handle.is_ssl_error());
    502 }
    503 
    504 TEST_P(SSLClientSocketPoolTest, SOCKSFailAsync) {
    505   StaticSocketDataProvider data;
    506   data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_FAILED));
    507   socket_factory_.AddSocketDataProvider(&data);
    508 
    509   CreatePool(false, true /* http proxy pool */, true /* socks pool */);
    510   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
    511                                                     false);
    512 
    513   ClientSocketHandle handle;
    514   TestCompletionCallback callback;
    515   int rv = handle.Init(
    516       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    517   EXPECT_EQ(ERR_IO_PENDING, rv);
    518   EXPECT_FALSE(handle.is_initialized());
    519   EXPECT_FALSE(handle.socket());
    520 
    521   EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
    522   EXPECT_FALSE(handle.is_initialized());
    523   EXPECT_FALSE(handle.socket());
    524   EXPECT_FALSE(handle.is_ssl_error());
    525 }
    526 
    527 TEST_P(SSLClientSocketPoolTest, SOCKSBasic) {
    528   StaticSocketDataProvider data;
    529   data.set_connect_data(MockConnect(SYNCHRONOUS, OK));
    530   socket_factory_.AddSocketDataProvider(&data);
    531   SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
    532   socket_factory_.AddSSLSocketDataProvider(&ssl);
    533 
    534   CreatePool(false, true /* http proxy pool */, true /* socks pool */);
    535   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
    536                                                     false);
    537 
    538   ClientSocketHandle handle;
    539   TestCompletionCallback callback;
    540   int rv = handle.Init(
    541       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    542   EXPECT_EQ(OK, rv);
    543   EXPECT_TRUE(handle.is_initialized());
    544   EXPECT_TRUE(handle.socket());
    545   // SOCKS5 generally has no DNS times, but the mock SOCKS5 sockets used here
    546   // don't go through the real logic, unlike in the HTTP proxy tests.
    547   TestLoadTimingInfo(handle);
    548 }
    549 
    550 TEST_P(SSLClientSocketPoolTest, SOCKSBasicAsync) {
    551   StaticSocketDataProvider data;
    552   socket_factory_.AddSocketDataProvider(&data);
    553   SSLSocketDataProvider ssl(ASYNC, OK);
    554   socket_factory_.AddSSLSocketDataProvider(&ssl);
    555 
    556   CreatePool(false, true /* http proxy pool */, true /* socks pool */);
    557   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
    558                                                     false);
    559 
    560   ClientSocketHandle handle;
    561   TestCompletionCallback callback;
    562   int rv = handle.Init(
    563       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    564   EXPECT_EQ(ERR_IO_PENDING, rv);
    565   EXPECT_FALSE(handle.is_initialized());
    566   EXPECT_FALSE(handle.socket());
    567 
    568   EXPECT_EQ(OK, callback.WaitForResult());
    569   EXPECT_TRUE(handle.is_initialized());
    570   EXPECT_TRUE(handle.socket());
    571   // SOCKS5 generally has no DNS times, but the mock SOCKS5 sockets used here
    572   // don't go through the real logic, unlike in the HTTP proxy tests.
    573   TestLoadTimingInfo(handle);
    574 }
    575 
    576 TEST_P(SSLClientSocketPoolTest, HttpProxyFail) {
    577   StaticSocketDataProvider data;
    578   data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED));
    579   socket_factory_.AddSocketDataProvider(&data);
    580 
    581   CreatePool(false, true /* http proxy pool */, true /* socks pool */);
    582   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
    583                                                     false);
    584 
    585   ClientSocketHandle handle;
    586   TestCompletionCallback callback;
    587   int rv = handle.Init(
    588       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    589   EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv);
    590   EXPECT_FALSE(handle.is_initialized());
    591   EXPECT_FALSE(handle.socket());
    592   EXPECT_FALSE(handle.is_ssl_error());
    593 }
    594 
    595 TEST_P(SSLClientSocketPoolTest, HttpProxyFailAsync) {
    596   StaticSocketDataProvider data;
    597   data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_FAILED));
    598   socket_factory_.AddSocketDataProvider(&data);
    599 
    600   CreatePool(false, true /* http proxy pool */, true /* socks pool */);
    601   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
    602                                                     false);
    603 
    604   ClientSocketHandle handle;
    605   TestCompletionCallback callback;
    606   int rv = handle.Init(
    607       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    608   EXPECT_EQ(ERR_IO_PENDING, rv);
    609   EXPECT_FALSE(handle.is_initialized());
    610   EXPECT_FALSE(handle.socket());
    611 
    612   EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult());
    613   EXPECT_FALSE(handle.is_initialized());
    614   EXPECT_FALSE(handle.socket());
    615   EXPECT_FALSE(handle.is_ssl_error());
    616 }
    617 
    618 TEST_P(SSLClientSocketPoolTest, HttpProxyBasic) {
    619   MockWrite writes[] = {
    620       MockWrite(SYNCHRONOUS,
    621                 "CONNECT host:80 HTTP/1.1\r\n"
    622                 "Host: host\r\n"
    623                 "Proxy-Connection: keep-alive\r\n"
    624                 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
    625   };
    626   MockRead reads[] = {
    627       MockRead(SYNCHRONOUS, "HTTP/1.1 200 Connection Established\r\n\r\n"),
    628   };
    629   StaticSocketDataProvider data(reads, arraysize(reads), writes,
    630                                 arraysize(writes));
    631   data.set_connect_data(MockConnect(SYNCHRONOUS, OK));
    632   socket_factory_.AddSocketDataProvider(&data);
    633   AddAuthToCache();
    634   SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
    635   socket_factory_.AddSSLSocketDataProvider(&ssl);
    636 
    637   CreatePool(false, true /* http proxy pool */, true /* socks pool */);
    638   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
    639                                                     false);
    640 
    641   ClientSocketHandle handle;
    642   TestCompletionCallback callback;
    643   int rv = handle.Init(
    644       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    645   EXPECT_EQ(OK, rv);
    646   EXPECT_TRUE(handle.is_initialized());
    647   EXPECT_TRUE(handle.socket());
    648   TestLoadTimingInfoNoDns(handle);
    649 }
    650 
    651 TEST_P(SSLClientSocketPoolTest, HttpProxyBasicAsync) {
    652   MockWrite writes[] = {
    653       MockWrite("CONNECT host:80 HTTP/1.1\r\n"
    654                 "Host: host\r\n"
    655                 "Proxy-Connection: keep-alive\r\n"
    656                 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"),
    657   };
    658   MockRead reads[] = {
    659       MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
    660   };
    661   StaticSocketDataProvider data(reads, arraysize(reads), writes,
    662                                 arraysize(writes));
    663   socket_factory_.AddSocketDataProvider(&data);
    664   AddAuthToCache();
    665   SSLSocketDataProvider ssl(ASYNC, OK);
    666   socket_factory_.AddSSLSocketDataProvider(&ssl);
    667 
    668   CreatePool(false, true /* http proxy pool */, true /* socks pool */);
    669   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
    670                                                     false);
    671 
    672   ClientSocketHandle handle;
    673   TestCompletionCallback callback;
    674   int rv = handle.Init(
    675       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    676   EXPECT_EQ(ERR_IO_PENDING, rv);
    677   EXPECT_FALSE(handle.is_initialized());
    678   EXPECT_FALSE(handle.socket());
    679 
    680   EXPECT_EQ(OK, callback.WaitForResult());
    681   EXPECT_TRUE(handle.is_initialized());
    682   EXPECT_TRUE(handle.socket());
    683   TestLoadTimingInfoNoDns(handle);
    684 }
    685 
    686 TEST_P(SSLClientSocketPoolTest, NeedProxyAuth) {
    687   MockWrite writes[] = {
    688       MockWrite("CONNECT host:80 HTTP/1.1\r\n"
    689                 "Host: host\r\n"
    690                 "Proxy-Connection: keep-alive\r\n\r\n"),
    691   };
    692   MockRead reads[] = {
    693       MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"),
    694       MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"),
    695       MockRead("Content-Length: 10\r\n\r\n"),
    696       MockRead("0123456789"),
    697   };
    698   StaticSocketDataProvider data(reads, arraysize(reads), writes,
    699                                 arraysize(writes));
    700   socket_factory_.AddSocketDataProvider(&data);
    701   SSLSocketDataProvider ssl(ASYNC, OK);
    702   socket_factory_.AddSSLSocketDataProvider(&ssl);
    703 
    704   CreatePool(false, true /* http proxy pool */, true /* socks pool */);
    705   scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
    706                                                     false);
    707 
    708   ClientSocketHandle handle;
    709   TestCompletionCallback callback;
    710   int rv = handle.Init(
    711       "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog());
    712   EXPECT_EQ(ERR_IO_PENDING, rv);
    713   EXPECT_FALSE(handle.is_initialized());
    714   EXPECT_FALSE(handle.socket());
    715 
    716   EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
    717   EXPECT_FALSE(handle.is_initialized());
    718   EXPECT_FALSE(handle.socket());
    719   EXPECT_FALSE(handle.is_ssl_error());
    720   const HttpResponseInfo& tunnel_info = handle.ssl_error_response_info();
    721   EXPECT_EQ(tunnel_info.headers->response_code(), 407);
    722   scoped_ptr<ClientSocketHandle> tunnel_handle(
    723       handle.release_pending_http_proxy_connection());
    724   EXPECT_TRUE(tunnel_handle->socket());
    725   EXPECT_FALSE(tunnel_handle->socket()->IsConnected());
    726 }
    727 
    728 TEST_P(SSLClientSocketPoolTest, IPPooling) {
    729   const int kTestPort = 80;
    730   struct TestHosts {
    731     std::string name;
    732     std::string iplist;
    733     SpdySessionKey key;
    734     AddressList addresses;
    735   } test_hosts[] = {
    736     { "www.webkit.org",    "192.0.2.33,192.168.0.1,192.168.0.5" },
    737     { "code.google.com",   "192.168.0.2,192.168.0.3,192.168.0.5" },
    738     { "js.webkit.org",     "192.168.0.4,192.168.0.1,192.0.2.33" },
    739   };
    740 
    741   host_resolver_.set_synchronous_mode(true);
    742   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_hosts); i++) {
    743     host_resolver_.rules()->AddIPLiteralRule(
    744         test_hosts[i].name, test_hosts[i].iplist, std::string());
    745 
    746     // This test requires that the HostResolver cache be populated.  Normal
    747     // code would have done this already, but we do it manually.
    748     HostResolver::RequestInfo info(HostPortPair(test_hosts[i].name, kTestPort));
    749     host_resolver_.Resolve(info, &test_hosts[i].addresses, CompletionCallback(),
    750                            NULL, BoundNetLog());
    751 
    752     // Setup a SpdySessionKey
    753     test_hosts[i].key = SpdySessionKey(
    754         HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(),
    755         kPrivacyModeDisabled);
    756   }
    757 
    758   MockRead reads[] = {
    759       MockRead(ASYNC, ERR_IO_PENDING),
    760   };
    761   StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0);
    762   socket_factory_.AddSocketDataProvider(&data);
    763   SSLSocketDataProvider ssl(ASYNC, OK);
    764   ssl.cert = X509Certificate::CreateFromBytes(
    765       reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der));
    766   ssl.SetNextProto(GetParam());
    767   socket_factory_.AddSSLSocketDataProvider(&ssl);
    768 
    769   CreatePool(true /* tcp pool */, false, false);
    770   base::WeakPtr<SpdySession> spdy_session =
    771       CreateSecureSpdySession(session_, test_hosts[0].key, BoundNetLog());
    772 
    773   EXPECT_TRUE(
    774       HasSpdySession(session_->spdy_session_pool(), test_hosts[0].key));
    775   EXPECT_FALSE(
    776       HasSpdySession(session_->spdy_session_pool(), test_hosts[1].key));
    777   EXPECT_TRUE(
    778       HasSpdySession(session_->spdy_session_pool(), test_hosts[2].key));
    779 
    780   session_->spdy_session_pool()->CloseAllSessions();
    781 }
    782 
    783 void SSLClientSocketPoolTest::TestIPPoolingDisabled(
    784     SSLSocketDataProvider* ssl) {
    785   const int kTestPort = 80;
    786   struct TestHosts {
    787     std::string name;
    788     std::string iplist;
    789     SpdySessionKey key;
    790     AddressList addresses;
    791   } test_hosts[] = {
    792     { "www.webkit.org",    "192.0.2.33,192.168.0.1,192.168.0.5" },
    793     { "js.webkit.com",     "192.168.0.4,192.168.0.1,192.0.2.33" },
    794   };
    795 
    796   TestCompletionCallback callback;
    797   int rv;
    798   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_hosts); i++) {
    799     host_resolver_.rules()->AddIPLiteralRule(
    800         test_hosts[i].name, test_hosts[i].iplist, std::string());
    801 
    802     // This test requires that the HostResolver cache be populated.  Normal
    803     // code would have done this already, but we do it manually.
    804     HostResolver::RequestInfo info(HostPortPair(test_hosts[i].name, kTestPort));
    805     rv = host_resolver_.Resolve(info, &test_hosts[i].addresses,
    806                                 callback.callback(), NULL, BoundNetLog());
    807     EXPECT_EQ(OK, callback.GetResult(rv));
    808 
    809     // Setup a SpdySessionKey
    810     test_hosts[i].key = SpdySessionKey(
    811         HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(),
    812         kPrivacyModeDisabled);
    813   }
    814 
    815   MockRead reads[] = {
    816       MockRead(ASYNC, ERR_IO_PENDING),
    817   };
    818   StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0);
    819   socket_factory_.AddSocketDataProvider(&data);
    820   socket_factory_.AddSSLSocketDataProvider(ssl);
    821 
    822   CreatePool(true /* tcp pool */, false, false);
    823   base::WeakPtr<SpdySession> spdy_session =
    824       CreateSecureSpdySession(session_, test_hosts[0].key, BoundNetLog());
    825 
    826   EXPECT_TRUE(
    827       HasSpdySession(session_->spdy_session_pool(), test_hosts[0].key));
    828   EXPECT_FALSE(
    829       HasSpdySession(session_->spdy_session_pool(), test_hosts[1].key));
    830 
    831   session_->spdy_session_pool()->CloseAllSessions();
    832 }
    833 
    834 // Verifies that an SSL connection with client authentication disables SPDY IP
    835 // pooling.
    836 TEST_P(SSLClientSocketPoolTest, IPPoolingClientCert) {
    837   SSLSocketDataProvider ssl(ASYNC, OK);
    838   ssl.cert = X509Certificate::CreateFromBytes(
    839       reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der));
    840   ssl.client_cert_sent = true;
    841   ssl.SetNextProto(GetParam());
    842   TestIPPoolingDisabled(&ssl);
    843 }
    844 
    845 // Verifies that an SSL connection with channel ID disables SPDY IP pooling.
    846 TEST_P(SSLClientSocketPoolTest, IPPoolingChannelID) {
    847   SSLSocketDataProvider ssl(ASYNC, OK);
    848   ssl.channel_id_sent = true;
    849   ssl.SetNextProto(GetParam());
    850   TestIPPoolingDisabled(&ssl);
    851 }
    852 
    853 // It would be nice to also test the timeouts in SSLClientSocketPool.
    854 
    855 }  // namespace
    856 
    857 }  // namespace net
    858