| OLD | NEW |
| (Empty) |
| 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/run_loop.h" | |
| 10 #include "base/strings/string_util.h" | |
| 11 #include "base/strings/utf_string_conversions.h" | |
| 12 #include "base/time/time.h" | |
| 13 #include "net/base/auth.h" | |
| 14 #include "net/base/load_timing_info.h" | |
| 15 #include "net/base/load_timing_info_test_util.h" | |
| 16 #include "net/base/net_errors.h" | |
| 17 #include "net/base/test_completion_callback.h" | |
| 18 #include "net/cert/cert_verifier.h" | |
| 19 #include "net/dns/mock_host_resolver.h" | |
| 20 #include "net/http/http_auth_handler_factory.h" | |
| 21 #include "net/http/http_network_session.h" | |
| 22 #include "net/http/http_request_headers.h" | |
| 23 #include "net/http/http_response_headers.h" | |
| 24 #include "net/http/http_server_properties_impl.h" | |
| 25 #include "net/http/transport_security_state.h" | |
| 26 #include "net/proxy/proxy_service.h" | |
| 27 #include "net/socket/client_socket_handle.h" | |
| 28 #include "net/socket/client_socket_pool_histograms.h" | |
| 29 #include "net/socket/next_proto.h" | |
| 30 #include "net/socket/socket_test_util.h" | |
| 31 #include "net/spdy/spdy_session.h" | |
| 32 #include "net/spdy/spdy_session_pool.h" | |
| 33 #include "net/spdy/spdy_test_util_common.h" | |
| 34 #include "net/ssl/ssl_config_service_defaults.h" | |
| 35 #include "net/test/test_certificate_data.h" | |
| 36 #include "testing/gtest/include/gtest/gtest.h" | |
| 37 | |
| 38 namespace net { | |
| 39 | |
| 40 namespace { | |
| 41 | |
| 42 const int kMaxSockets = 32; | |
| 43 const int kMaxSocketsPerGroup = 6; | |
| 44 | |
| 45 // Make sure |handle|'s load times are set correctly. DNS and connect start | |
| 46 // times comes from mock client sockets in these tests, so primarily serves to | |
| 47 // check those times were copied, and ssl times / connect end are set correctly. | |
| 48 void TestLoadTimingInfo(const ClientSocketHandle& handle) { | |
| 49 LoadTimingInfo load_timing_info; | |
| 50 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info)); | |
| 51 | |
| 52 EXPECT_FALSE(load_timing_info.socket_reused); | |
| 53 // None of these tests use a NetLog. | |
| 54 EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); | |
| 55 | |
| 56 ExpectConnectTimingHasTimes( | |
| 57 load_timing_info.connect_timing, | |
| 58 CONNECT_TIMING_HAS_SSL_TIMES | CONNECT_TIMING_HAS_DNS_TIMES); | |
| 59 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); | |
| 60 } | |
| 61 | |
| 62 // Just like TestLoadTimingInfo, except DNS times are expected to be null, for | |
| 63 // tests over proxies that do DNS lookups themselves. | |
| 64 void TestLoadTimingInfoNoDns(const ClientSocketHandle& handle) { | |
| 65 LoadTimingInfo load_timing_info; | |
| 66 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info)); | |
| 67 | |
| 68 // None of these tests use a NetLog. | |
| 69 EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); | |
| 70 | |
| 71 EXPECT_FALSE(load_timing_info.socket_reused); | |
| 72 | |
| 73 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, | |
| 74 CONNECT_TIMING_HAS_SSL_TIMES); | |
| 75 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); | |
| 76 } | |
| 77 | |
| 78 class SSLClientSocketPoolTest | |
| 79 : public testing::Test, | |
| 80 public ::testing::WithParamInterface<NextProto> { | |
| 81 protected: | |
| 82 SSLClientSocketPoolTest() | |
| 83 : transport_security_state_(new TransportSecurityState), | |
| 84 proxy_service_(ProxyService::CreateDirect()), | |
| 85 ssl_config_service_(new SSLConfigServiceDefaults), | |
| 86 http_auth_handler_factory_( | |
| 87 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), | |
| 88 session_(CreateNetworkSession()), | |
| 89 direct_transport_socket_params_( | |
| 90 new TransportSocketParams( | |
| 91 HostPortPair("host", 443), | |
| 92 false, | |
| 93 false, | |
| 94 OnHostResolutionCallback(), | |
| 95 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)), | |
| 96 transport_histograms_("MockTCP"), | |
| 97 transport_socket_pool_(kMaxSockets, | |
| 98 kMaxSocketsPerGroup, | |
| 99 &transport_histograms_, | |
| 100 &socket_factory_), | |
| 101 proxy_transport_socket_params_( | |
| 102 new TransportSocketParams( | |
| 103 HostPortPair("proxy", 443), | |
| 104 false, | |
| 105 false, | |
| 106 OnHostResolutionCallback(), | |
| 107 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)), | |
| 108 socks_socket_params_( | |
| 109 new SOCKSSocketParams(proxy_transport_socket_params_, | |
| 110 true, | |
| 111 HostPortPair("sockshost", 443))), | |
| 112 socks_histograms_("MockSOCKS"), | |
| 113 socks_socket_pool_(kMaxSockets, | |
| 114 kMaxSocketsPerGroup, | |
| 115 &socks_histograms_, | |
| 116 &transport_socket_pool_), | |
| 117 http_proxy_socket_params_( | |
| 118 new HttpProxySocketParams(proxy_transport_socket_params_, | |
| 119 NULL, | |
| 120 GURL("http://host"), | |
| 121 std::string(), | |
| 122 HostPortPair("host", 80), | |
| 123 session_->http_auth_cache(), | |
| 124 session_->http_auth_handler_factory(), | |
| 125 session_->spdy_session_pool(), | |
| 126 true, | |
| 127 NULL)), | |
| 128 http_proxy_histograms_("MockHttpProxy"), | |
| 129 http_proxy_socket_pool_(kMaxSockets, | |
| 130 kMaxSocketsPerGroup, | |
| 131 &http_proxy_histograms_, | |
| 132 &transport_socket_pool_, | |
| 133 NULL, | |
| 134 NULL), | |
| 135 enable_ssl_connect_job_waiting_(false) { | |
| 136 scoped_refptr<SSLConfigService> ssl_config_service( | |
| 137 new SSLConfigServiceDefaults); | |
| 138 ssl_config_service->GetSSLConfig(&ssl_config_); | |
| 139 } | |
| 140 | |
| 141 void CreatePool(bool transport_pool, bool http_proxy_pool, bool socks_pool) { | |
| 142 ssl_histograms_.reset(new ClientSocketPoolHistograms("SSLUnitTest")); | |
| 143 pool_.reset(new SSLClientSocketPool( | |
| 144 kMaxSockets, kMaxSocketsPerGroup, ssl_histograms_.get(), | |
| 145 NULL /* cert_verifier */, NULL /* channel_id_service */, | |
| 146 NULL /* transport_security_state */, | |
| 147 NULL /* cert_transparency_verifier */, NULL /* cert_policy_enforcer */, | |
| 148 std::string() /* ssl_session_cache_shard */, &socket_factory_, | |
| 149 transport_pool ? &transport_socket_pool_ : NULL, | |
| 150 socks_pool ? &socks_socket_pool_ : NULL, | |
| 151 http_proxy_pool ? &http_proxy_socket_pool_ : NULL, NULL, | |
| 152 enable_ssl_connect_job_waiting_, 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 HostPortPair("host", 443), | |
| 163 ssl_config_, | |
| 164 PRIVACY_MODE_DISABLED, | |
| 165 0, | |
| 166 false, | |
| 167 want_spdy_over_npn)); | |
| 168 } | |
| 169 | |
| 170 void AddAuthToCache() { | |
| 171 const base::string16 kFoo(base::ASCIIToUTF16("foo")); | |
| 172 const base::string16 kBar(base::ASCIIToUTF16("bar")); | |
| 173 session_->http_auth_cache()->Add(GURL("http://proxy:443/"), | |
| 174 "MyRealm1", | |
| 175 HttpAuth::AUTH_SCHEME_BASIC, | |
| 176 "Basic realm=MyRealm1", | |
| 177 AuthCredentials(kFoo, kBar), | |
| 178 "/"); | |
| 179 } | |
| 180 | |
| 181 HttpNetworkSession* CreateNetworkSession() { | |
| 182 HttpNetworkSession::Params params; | |
| 183 params.host_resolver = &host_resolver_; | |
| 184 params.cert_verifier = cert_verifier_.get(); | |
| 185 params.transport_security_state = transport_security_state_.get(); | |
| 186 params.proxy_service = proxy_service_.get(); | |
| 187 params.client_socket_factory = &socket_factory_; | |
| 188 params.ssl_config_service = ssl_config_service_.get(); | |
| 189 params.http_auth_handler_factory = http_auth_handler_factory_.get(); | |
| 190 params.http_server_properties = | |
| 191 http_server_properties_.GetWeakPtr(); | |
| 192 params.enable_spdy_compression = false; | |
| 193 params.spdy_default_protocol = GetParam(); | |
| 194 return new HttpNetworkSession(params); | |
| 195 } | |
| 196 | |
| 197 void TestIPPoolingDisabled(SSLSocketDataProvider* ssl); | |
| 198 | |
| 199 MockClientSocketFactory socket_factory_; | |
| 200 MockCachingHostResolver host_resolver_; | |
| 201 scoped_ptr<CertVerifier> cert_verifier_; | |
| 202 scoped_ptr<TransportSecurityState> transport_security_state_; | |
| 203 const scoped_ptr<ProxyService> proxy_service_; | |
| 204 const scoped_refptr<SSLConfigService> ssl_config_service_; | |
| 205 const scoped_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_; | |
| 206 HttpServerPropertiesImpl http_server_properties_; | |
| 207 const scoped_refptr<HttpNetworkSession> session_; | |
| 208 | |
| 209 scoped_refptr<TransportSocketParams> direct_transport_socket_params_; | |
| 210 ClientSocketPoolHistograms transport_histograms_; | |
| 211 MockTransportClientSocketPool transport_socket_pool_; | |
| 212 | |
| 213 scoped_refptr<TransportSocketParams> proxy_transport_socket_params_; | |
| 214 | |
| 215 scoped_refptr<SOCKSSocketParams> socks_socket_params_; | |
| 216 ClientSocketPoolHistograms socks_histograms_; | |
| 217 MockSOCKSClientSocketPool socks_socket_pool_; | |
| 218 | |
| 219 scoped_refptr<HttpProxySocketParams> http_proxy_socket_params_; | |
| 220 ClientSocketPoolHistograms http_proxy_histograms_; | |
| 221 HttpProxyClientSocketPool http_proxy_socket_pool_; | |
| 222 | |
| 223 SSLConfig ssl_config_; | |
| 224 scoped_ptr<ClientSocketPoolHistograms> ssl_histograms_; | |
| 225 scoped_ptr<SSLClientSocketPool> pool_; | |
| 226 | |
| 227 bool enable_ssl_connect_job_waiting_; | |
| 228 }; | |
| 229 | |
| 230 INSTANTIATE_TEST_CASE_P( | |
| 231 NextProto, | |
| 232 SSLClientSocketPoolTest, | |
| 233 testing::Values(kProtoSPDY31, kProtoSPDY4_14, kProtoSPDY4_15)); | |
| 234 | |
| 235 // Tests that the final socket will connect even if all sockets | |
| 236 // prior to it fail. | |
| 237 // | |
| 238 // All sockets should wait for the first socket to attempt to | |
| 239 // connect. Once it fails to connect, all other sockets should | |
| 240 // attempt to connect. All should fail, except the final socket. | |
| 241 TEST_P(SSLClientSocketPoolTest, AllSocketsFailButLast) { | |
| 242 // Although we request four sockets, the first three socket connect | |
| 243 // failures cause the socket pool to create three more sockets because | |
| 244 // there are pending requests. | |
| 245 StaticSocketDataProvider data1; | |
| 246 StaticSocketDataProvider data2; | |
| 247 StaticSocketDataProvider data3; | |
| 248 StaticSocketDataProvider data4; | |
| 249 StaticSocketDataProvider data5; | |
| 250 StaticSocketDataProvider data6; | |
| 251 StaticSocketDataProvider data7; | |
| 252 socket_factory_.AddSocketDataProvider(&data1); | |
| 253 socket_factory_.AddSocketDataProvider(&data2); | |
| 254 socket_factory_.AddSocketDataProvider(&data3); | |
| 255 socket_factory_.AddSocketDataProvider(&data4); | |
| 256 socket_factory_.AddSocketDataProvider(&data5); | |
| 257 socket_factory_.AddSocketDataProvider(&data6); | |
| 258 socket_factory_.AddSocketDataProvider(&data7); | |
| 259 SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR); | |
| 260 ssl.is_in_session_cache = false; | |
| 261 SSLSocketDataProvider ssl2(ASYNC, ERR_SSL_PROTOCOL_ERROR); | |
| 262 ssl2.is_in_session_cache = false; | |
| 263 SSLSocketDataProvider ssl3(ASYNC, ERR_SSL_PROTOCOL_ERROR); | |
| 264 ssl3.is_in_session_cache = false; | |
| 265 SSLSocketDataProvider ssl4(ASYNC, OK); | |
| 266 ssl4.is_in_session_cache = false; | |
| 267 SSLSocketDataProvider ssl5(ASYNC, OK); | |
| 268 ssl5.is_in_session_cache = false; | |
| 269 SSLSocketDataProvider ssl6(ASYNC, OK); | |
| 270 ssl6.is_in_session_cache = false; | |
| 271 SSLSocketDataProvider ssl7(ASYNC, OK); | |
| 272 ssl7.is_in_session_cache = false; | |
| 273 | |
| 274 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 275 socket_factory_.AddSSLSocketDataProvider(&ssl2); | |
| 276 socket_factory_.AddSSLSocketDataProvider(&ssl3); | |
| 277 socket_factory_.AddSSLSocketDataProvider(&ssl4); | |
| 278 socket_factory_.AddSSLSocketDataProvider(&ssl5); | |
| 279 socket_factory_.AddSSLSocketDataProvider(&ssl6); | |
| 280 socket_factory_.AddSSLSocketDataProvider(&ssl7); | |
| 281 | |
| 282 enable_ssl_connect_job_waiting_ = true; | |
| 283 CreatePool(true, false, false); | |
| 284 | |
| 285 scoped_refptr<SSLSocketParams> params1 = | |
| 286 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 287 scoped_refptr<SSLSocketParams> params2 = | |
| 288 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 289 scoped_refptr<SSLSocketParams> params3 = | |
| 290 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 291 scoped_refptr<SSLSocketParams> params4 = | |
| 292 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 293 ClientSocketHandle handle1; | |
| 294 ClientSocketHandle handle2; | |
| 295 ClientSocketHandle handle3; | |
| 296 ClientSocketHandle handle4; | |
| 297 TestCompletionCallback callback1; | |
| 298 TestCompletionCallback callback2; | |
| 299 TestCompletionCallback callback3; | |
| 300 TestCompletionCallback callback4; | |
| 301 | |
| 302 handle1.Init( | |
| 303 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); | |
| 304 handle2.Init( | |
| 305 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); | |
| 306 handle3.Init( | |
| 307 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); | |
| 308 handle4.Init( | |
| 309 "b", params4, MEDIUM, callback4.callback(), pool_.get(), BoundNetLog()); | |
| 310 | |
| 311 base::RunLoop().RunUntilIdle(); | |
| 312 | |
| 313 // Only the last socket should have connected. | |
| 314 EXPECT_FALSE(handle1.socket()); | |
| 315 EXPECT_FALSE(handle2.socket()); | |
| 316 EXPECT_FALSE(handle3.socket()); | |
| 317 EXPECT_TRUE(handle4.socket()->IsConnected()); | |
| 318 } | |
| 319 | |
| 320 // Tests that sockets will still connect in parallel if the | |
| 321 // EnableSSLConnectJobWaiting flag is not enabled. | |
| 322 TEST_P(SSLClientSocketPoolTest, SocketsConnectWithoutFlag) { | |
| 323 StaticSocketDataProvider data1; | |
| 324 StaticSocketDataProvider data2; | |
| 325 StaticSocketDataProvider data3; | |
| 326 socket_factory_.AddSocketDataProvider(&data1); | |
| 327 socket_factory_.AddSocketDataProvider(&data2); | |
| 328 socket_factory_.AddSocketDataProvider(&data3); | |
| 329 | |
| 330 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 331 ssl.is_in_session_cache = false; | |
| 332 ssl.should_pause_on_connect = true; | |
| 333 SSLSocketDataProvider ssl2(ASYNC, OK); | |
| 334 ssl2.is_in_session_cache = false; | |
| 335 ssl2.should_pause_on_connect = true; | |
| 336 SSLSocketDataProvider ssl3(ASYNC, OK); | |
| 337 ssl3.is_in_session_cache = false; | |
| 338 ssl3.should_pause_on_connect = true; | |
| 339 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 340 socket_factory_.AddSSLSocketDataProvider(&ssl2); | |
| 341 socket_factory_.AddSSLSocketDataProvider(&ssl3); | |
| 342 | |
| 343 CreatePool(true, false, false); | |
| 344 | |
| 345 scoped_refptr<SSLSocketParams> params1 = | |
| 346 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 347 scoped_refptr<SSLSocketParams> params2 = | |
| 348 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 349 scoped_refptr<SSLSocketParams> params3 = | |
| 350 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 351 ClientSocketHandle handle1; | |
| 352 ClientSocketHandle handle2; | |
| 353 ClientSocketHandle handle3; | |
| 354 TestCompletionCallback callback1; | |
| 355 TestCompletionCallback callback2; | |
| 356 TestCompletionCallback callback3; | |
| 357 | |
| 358 handle1.Init( | |
| 359 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); | |
| 360 handle2.Init( | |
| 361 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); | |
| 362 handle3.Init( | |
| 363 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); | |
| 364 | |
| 365 base::RunLoop().RunUntilIdle(); | |
| 366 | |
| 367 std::vector<MockSSLClientSocket*> sockets = | |
| 368 socket_factory_.ssl_client_sockets(); | |
| 369 | |
| 370 // All sockets should have started their connections. | |
| 371 for (std::vector<MockSSLClientSocket*>::iterator it = sockets.begin(); | |
| 372 it != sockets.end(); | |
| 373 ++it) { | |
| 374 EXPECT_TRUE((*it)->reached_connect()); | |
| 375 } | |
| 376 | |
| 377 // Resume connecting all of the sockets. | |
| 378 for (std::vector<MockSSLClientSocket*>::iterator it = sockets.begin(); | |
| 379 it != sockets.end(); | |
| 380 ++it) { | |
| 381 (*it)->RestartPausedConnect(); | |
| 382 } | |
| 383 | |
| 384 callback1.WaitForResult(); | |
| 385 callback2.WaitForResult(); | |
| 386 callback3.WaitForResult(); | |
| 387 | |
| 388 EXPECT_TRUE(handle1.socket()->IsConnected()); | |
| 389 EXPECT_TRUE(handle2.socket()->IsConnected()); | |
| 390 EXPECT_TRUE(handle3.socket()->IsConnected()); | |
| 391 } | |
| 392 | |
| 393 // Tests that the pool deleting an SSLConnectJob will not cause a crash, | |
| 394 // or prevent pending sockets from connecting. | |
| 395 TEST_P(SSLClientSocketPoolTest, DeletedSSLConnectJob) { | |
| 396 StaticSocketDataProvider data1; | |
| 397 StaticSocketDataProvider data2; | |
| 398 StaticSocketDataProvider data3; | |
| 399 socket_factory_.AddSocketDataProvider(&data1); | |
| 400 socket_factory_.AddSocketDataProvider(&data2); | |
| 401 socket_factory_.AddSocketDataProvider(&data3); | |
| 402 | |
| 403 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 404 ssl.is_in_session_cache = false; | |
| 405 ssl.should_pause_on_connect = true; | |
| 406 SSLSocketDataProvider ssl2(ASYNC, OK); | |
| 407 ssl2.is_in_session_cache = false; | |
| 408 SSLSocketDataProvider ssl3(ASYNC, OK); | |
| 409 ssl3.is_in_session_cache = false; | |
| 410 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 411 socket_factory_.AddSSLSocketDataProvider(&ssl2); | |
| 412 socket_factory_.AddSSLSocketDataProvider(&ssl3); | |
| 413 | |
| 414 enable_ssl_connect_job_waiting_ = true; | |
| 415 CreatePool(true, false, false); | |
| 416 | |
| 417 scoped_refptr<SSLSocketParams> params1 = | |
| 418 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 419 scoped_refptr<SSLSocketParams> params2 = | |
| 420 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 421 scoped_refptr<SSLSocketParams> params3 = | |
| 422 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 423 ClientSocketHandle handle1; | |
| 424 ClientSocketHandle handle2; | |
| 425 ClientSocketHandle handle3; | |
| 426 TestCompletionCallback callback1; | |
| 427 TestCompletionCallback callback2; | |
| 428 TestCompletionCallback callback3; | |
| 429 | |
| 430 handle1.Init( | |
| 431 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); | |
| 432 handle2.Init( | |
| 433 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); | |
| 434 handle3.Init( | |
| 435 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); | |
| 436 | |
| 437 // Allow the connections to proceed until the first socket has started | |
| 438 // connecting. | |
| 439 base::RunLoop().RunUntilIdle(); | |
| 440 | |
| 441 std::vector<MockSSLClientSocket*> sockets = | |
| 442 socket_factory_.ssl_client_sockets(); | |
| 443 | |
| 444 pool_->CancelRequest("b", &handle2); | |
| 445 | |
| 446 sockets[0]->RestartPausedConnect(); | |
| 447 | |
| 448 callback1.WaitForResult(); | |
| 449 callback3.WaitForResult(); | |
| 450 | |
| 451 EXPECT_TRUE(handle1.socket()->IsConnected()); | |
| 452 EXPECT_FALSE(handle2.socket()); | |
| 453 EXPECT_TRUE(handle3.socket()->IsConnected()); | |
| 454 } | |
| 455 | |
| 456 // Tests that all pending sockets still connect when the pool deletes a pending | |
| 457 // SSLConnectJob which immediately followed a failed leading connection. | |
| 458 TEST_P(SSLClientSocketPoolTest, DeletedSocketAfterFail) { | |
| 459 StaticSocketDataProvider data1; | |
| 460 StaticSocketDataProvider data2; | |
| 461 StaticSocketDataProvider data3; | |
| 462 StaticSocketDataProvider data4; | |
| 463 socket_factory_.AddSocketDataProvider(&data1); | |
| 464 socket_factory_.AddSocketDataProvider(&data2); | |
| 465 socket_factory_.AddSocketDataProvider(&data3); | |
| 466 socket_factory_.AddSocketDataProvider(&data4); | |
| 467 | |
| 468 SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR); | |
| 469 ssl.is_in_session_cache = false; | |
| 470 ssl.should_pause_on_connect = true; | |
| 471 SSLSocketDataProvider ssl2(ASYNC, OK); | |
| 472 ssl2.is_in_session_cache = false; | |
| 473 SSLSocketDataProvider ssl3(ASYNC, OK); | |
| 474 ssl3.is_in_session_cache = false; | |
| 475 SSLSocketDataProvider ssl4(ASYNC, OK); | |
| 476 ssl4.is_in_session_cache = false; | |
| 477 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 478 socket_factory_.AddSSLSocketDataProvider(&ssl2); | |
| 479 socket_factory_.AddSSLSocketDataProvider(&ssl3); | |
| 480 socket_factory_.AddSSLSocketDataProvider(&ssl4); | |
| 481 | |
| 482 enable_ssl_connect_job_waiting_ = true; | |
| 483 CreatePool(true, false, false); | |
| 484 | |
| 485 scoped_refptr<SSLSocketParams> params1 = | |
| 486 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 487 scoped_refptr<SSLSocketParams> params2 = | |
| 488 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 489 scoped_refptr<SSLSocketParams> params3 = | |
| 490 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 491 ClientSocketHandle handle1; | |
| 492 ClientSocketHandle handle2; | |
| 493 ClientSocketHandle handle3; | |
| 494 TestCompletionCallback callback1; | |
| 495 TestCompletionCallback callback2; | |
| 496 TestCompletionCallback callback3; | |
| 497 | |
| 498 handle1.Init( | |
| 499 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); | |
| 500 handle2.Init( | |
| 501 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); | |
| 502 handle3.Init( | |
| 503 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); | |
| 504 | |
| 505 // Allow the connections to proceed until the first socket has started | |
| 506 // connecting. | |
| 507 base::RunLoop().RunUntilIdle(); | |
| 508 | |
| 509 std::vector<MockSSLClientSocket*> sockets = | |
| 510 socket_factory_.ssl_client_sockets(); | |
| 511 | |
| 512 EXPECT_EQ(3u, sockets.size()); | |
| 513 EXPECT_TRUE(sockets[0]->reached_connect()); | |
| 514 EXPECT_FALSE(handle1.socket()); | |
| 515 | |
| 516 pool_->CancelRequest("b", &handle2); | |
| 517 | |
| 518 sockets[0]->RestartPausedConnect(); | |
| 519 | |
| 520 callback1.WaitForResult(); | |
| 521 callback3.WaitForResult(); | |
| 522 | |
| 523 EXPECT_FALSE(handle1.socket()); | |
| 524 EXPECT_FALSE(handle2.socket()); | |
| 525 EXPECT_TRUE(handle3.socket()->IsConnected()); | |
| 526 } | |
| 527 | |
| 528 // Make sure that sockets still connect after the leader socket's | |
| 529 // connection fails. | |
| 530 TEST_P(SSLClientSocketPoolTest, SimultaneousConnectJobsFail) { | |
| 531 StaticSocketDataProvider data1; | |
| 532 StaticSocketDataProvider data2; | |
| 533 StaticSocketDataProvider data3; | |
| 534 StaticSocketDataProvider data4; | |
| 535 StaticSocketDataProvider data5; | |
| 536 socket_factory_.AddSocketDataProvider(&data1); | |
| 537 socket_factory_.AddSocketDataProvider(&data2); | |
| 538 socket_factory_.AddSocketDataProvider(&data3); | |
| 539 socket_factory_.AddSocketDataProvider(&data4); | |
| 540 socket_factory_.AddSocketDataProvider(&data5); | |
| 541 SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR); | |
| 542 ssl.is_in_session_cache = false; | |
| 543 ssl.should_pause_on_connect = true; | |
| 544 SSLSocketDataProvider ssl2(ASYNC, OK); | |
| 545 ssl2.is_in_session_cache = false; | |
| 546 ssl2.should_pause_on_connect = true; | |
| 547 SSLSocketDataProvider ssl3(ASYNC, OK); | |
| 548 ssl3.is_in_session_cache = false; | |
| 549 SSLSocketDataProvider ssl4(ASYNC, OK); | |
| 550 ssl4.is_in_session_cache = false; | |
| 551 SSLSocketDataProvider ssl5(ASYNC, OK); | |
| 552 ssl5.is_in_session_cache = false; | |
| 553 | |
| 554 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 555 socket_factory_.AddSSLSocketDataProvider(&ssl2); | |
| 556 socket_factory_.AddSSLSocketDataProvider(&ssl3); | |
| 557 socket_factory_.AddSSLSocketDataProvider(&ssl4); | |
| 558 socket_factory_.AddSSLSocketDataProvider(&ssl5); | |
| 559 | |
| 560 enable_ssl_connect_job_waiting_ = true; | |
| 561 CreatePool(true, false, false); | |
| 562 scoped_refptr<SSLSocketParams> params1 = | |
| 563 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 564 scoped_refptr<SSLSocketParams> params2 = | |
| 565 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 566 scoped_refptr<SSLSocketParams> params3 = | |
| 567 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 568 scoped_refptr<SSLSocketParams> params4 = | |
| 569 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 570 ClientSocketHandle handle1; | |
| 571 ClientSocketHandle handle2; | |
| 572 ClientSocketHandle handle3; | |
| 573 ClientSocketHandle handle4; | |
| 574 TestCompletionCallback callback1; | |
| 575 TestCompletionCallback callback2; | |
| 576 TestCompletionCallback callback3; | |
| 577 TestCompletionCallback callback4; | |
| 578 handle1.Init( | |
| 579 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); | |
| 580 handle2.Init( | |
| 581 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); | |
| 582 handle3.Init( | |
| 583 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); | |
| 584 handle4.Init( | |
| 585 "b", params4, MEDIUM, callback4.callback(), pool_.get(), BoundNetLog()); | |
| 586 | |
| 587 base::RunLoop().RunUntilIdle(); | |
| 588 | |
| 589 std::vector<MockSSLClientSocket*> sockets = | |
| 590 socket_factory_.ssl_client_sockets(); | |
| 591 | |
| 592 std::vector<MockSSLClientSocket*>::const_iterator it = sockets.begin(); | |
| 593 | |
| 594 // The first socket should have had Connect called on it. | |
| 595 EXPECT_TRUE((*it)->reached_connect()); | |
| 596 ++it; | |
| 597 | |
| 598 // No other socket should have reached connect yet. | |
| 599 for (; it != sockets.end(); ++it) | |
| 600 EXPECT_FALSE((*it)->reached_connect()); | |
| 601 | |
| 602 // Allow the first socket to resume it's connection process. | |
| 603 sockets[0]->RestartPausedConnect(); | |
| 604 | |
| 605 base::RunLoop().RunUntilIdle(); | |
| 606 | |
| 607 // The second socket should have reached connect. | |
| 608 EXPECT_TRUE(sockets[1]->reached_connect()); | |
| 609 | |
| 610 // Allow the second socket to continue its connection. | |
| 611 sockets[1]->RestartPausedConnect(); | |
| 612 | |
| 613 base::RunLoop().RunUntilIdle(); | |
| 614 | |
| 615 EXPECT_FALSE(handle1.socket()); | |
| 616 EXPECT_TRUE(handle2.socket()->IsConnected()); | |
| 617 EXPECT_TRUE(handle3.socket()->IsConnected()); | |
| 618 EXPECT_TRUE(handle4.socket()->IsConnected()); | |
| 619 } | |
| 620 | |
| 621 // Make sure that no sockets connect before the "leader" socket, | |
| 622 // given that the leader has a successful connection. | |
| 623 TEST_P(SSLClientSocketPoolTest, SimultaneousConnectJobsSuccess) { | |
| 624 StaticSocketDataProvider data1; | |
| 625 StaticSocketDataProvider data2; | |
| 626 StaticSocketDataProvider data3; | |
| 627 socket_factory_.AddSocketDataProvider(&data1); | |
| 628 socket_factory_.AddSocketDataProvider(&data2); | |
| 629 socket_factory_.AddSocketDataProvider(&data3); | |
| 630 | |
| 631 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 632 ssl.is_in_session_cache = false; | |
| 633 ssl.should_pause_on_connect = true; | |
| 634 SSLSocketDataProvider ssl2(ASYNC, OK); | |
| 635 ssl2.is_in_session_cache = false; | |
| 636 SSLSocketDataProvider ssl3(ASYNC, OK); | |
| 637 ssl3.is_in_session_cache = false; | |
| 638 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 639 socket_factory_.AddSSLSocketDataProvider(&ssl2); | |
| 640 socket_factory_.AddSSLSocketDataProvider(&ssl3); | |
| 641 | |
| 642 enable_ssl_connect_job_waiting_ = true; | |
| 643 CreatePool(true, false, false); | |
| 644 | |
| 645 scoped_refptr<SSLSocketParams> params1 = | |
| 646 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 647 scoped_refptr<SSLSocketParams> params2 = | |
| 648 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 649 scoped_refptr<SSLSocketParams> params3 = | |
| 650 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 651 ClientSocketHandle handle1; | |
| 652 ClientSocketHandle handle2; | |
| 653 ClientSocketHandle handle3; | |
| 654 TestCompletionCallback callback1; | |
| 655 TestCompletionCallback callback2; | |
| 656 TestCompletionCallback callback3; | |
| 657 | |
| 658 handle1.Init( | |
| 659 "b", params1, MEDIUM, callback1.callback(), pool_.get(), BoundNetLog()); | |
| 660 handle2.Init( | |
| 661 "b", params2, MEDIUM, callback2.callback(), pool_.get(), BoundNetLog()); | |
| 662 handle3.Init( | |
| 663 "b", params3, MEDIUM, callback3.callback(), pool_.get(), BoundNetLog()); | |
| 664 | |
| 665 // Allow the connections to proceed until the first socket has finished | |
| 666 // connecting. | |
| 667 base::RunLoop().RunUntilIdle(); | |
| 668 | |
| 669 std::vector<MockSSLClientSocket*> sockets = | |
| 670 socket_factory_.ssl_client_sockets(); | |
| 671 | |
| 672 std::vector<MockSSLClientSocket*>::const_iterator it = sockets.begin(); | |
| 673 // The first socket should have reached connect. | |
| 674 EXPECT_TRUE((*it)->reached_connect()); | |
| 675 ++it; | |
| 676 // No other socket should have reached connect yet. | |
| 677 for (; it != sockets.end(); ++it) | |
| 678 EXPECT_FALSE((*it)->reached_connect()); | |
| 679 | |
| 680 sockets[0]->RestartPausedConnect(); | |
| 681 | |
| 682 callback1.WaitForResult(); | |
| 683 callback2.WaitForResult(); | |
| 684 callback3.WaitForResult(); | |
| 685 | |
| 686 EXPECT_TRUE(handle1.socket()->IsConnected()); | |
| 687 EXPECT_TRUE(handle2.socket()->IsConnected()); | |
| 688 EXPECT_TRUE(handle3.socket()->IsConnected()); | |
| 689 } | |
| 690 | |
| 691 TEST_P(SSLClientSocketPoolTest, TCPFail) { | |
| 692 StaticSocketDataProvider data; | |
| 693 data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED)); | |
| 694 socket_factory_.AddSocketDataProvider(&data); | |
| 695 | |
| 696 CreatePool(true /* tcp pool */, false, false); | |
| 697 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | |
| 698 false); | |
| 699 | |
| 700 ClientSocketHandle handle; | |
| 701 int rv = handle.Init("a", params, MEDIUM, CompletionCallback(), pool_.get(), | |
| 702 BoundNetLog()); | |
| 703 EXPECT_EQ(ERR_CONNECTION_FAILED, rv); | |
| 704 EXPECT_FALSE(handle.is_initialized()); | |
| 705 EXPECT_FALSE(handle.socket()); | |
| 706 EXPECT_FALSE(handle.is_ssl_error()); | |
| 707 } | |
| 708 | |
| 709 TEST_P(SSLClientSocketPoolTest, TCPFailAsync) { | |
| 710 StaticSocketDataProvider data; | |
| 711 data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_FAILED)); | |
| 712 socket_factory_.AddSocketDataProvider(&data); | |
| 713 | |
| 714 CreatePool(true /* tcp pool */, false, false); | |
| 715 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | |
| 716 false); | |
| 717 | |
| 718 ClientSocketHandle handle; | |
| 719 TestCompletionCallback callback; | |
| 720 int rv = handle.Init( | |
| 721 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 722 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 723 EXPECT_FALSE(handle.is_initialized()); | |
| 724 EXPECT_FALSE(handle.socket()); | |
| 725 | |
| 726 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | |
| 727 EXPECT_FALSE(handle.is_initialized()); | |
| 728 EXPECT_FALSE(handle.socket()); | |
| 729 EXPECT_FALSE(handle.is_ssl_error()); | |
| 730 } | |
| 731 | |
| 732 TEST_P(SSLClientSocketPoolTest, BasicDirect) { | |
| 733 StaticSocketDataProvider data; | |
| 734 data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | |
| 735 socket_factory_.AddSocketDataProvider(&data); | |
| 736 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | |
| 737 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 738 | |
| 739 CreatePool(true /* tcp pool */, false, false); | |
| 740 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | |
| 741 false); | |
| 742 | |
| 743 ClientSocketHandle handle; | |
| 744 TestCompletionCallback callback; | |
| 745 int rv = handle.Init( | |
| 746 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 747 EXPECT_EQ(OK, rv); | |
| 748 EXPECT_TRUE(handle.is_initialized()); | |
| 749 EXPECT_TRUE(handle.socket()); | |
| 750 TestLoadTimingInfo(handle); | |
| 751 } | |
| 752 | |
| 753 // Make sure that SSLConnectJob passes on its priority to its | |
| 754 // socket request on Init (for the DIRECT case). | |
| 755 TEST_P(SSLClientSocketPoolTest, SetSocketRequestPriorityOnInitDirect) { | |
| 756 CreatePool(true /* tcp pool */, false, false); | |
| 757 scoped_refptr<SSLSocketParams> params = | |
| 758 SSLParams(ProxyServer::SCHEME_DIRECT, false); | |
| 759 | |
| 760 for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { | |
| 761 RequestPriority priority = static_cast<RequestPriority>(i); | |
| 762 StaticSocketDataProvider data; | |
| 763 data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | |
| 764 socket_factory_.AddSocketDataProvider(&data); | |
| 765 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | |
| 766 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 767 | |
| 768 ClientSocketHandle handle; | |
| 769 TestCompletionCallback callback; | |
| 770 EXPECT_EQ(OK, handle.Init("a", params, priority, callback.callback(), | |
| 771 pool_.get(), BoundNetLog())); | |
| 772 EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); | |
| 773 handle.socket()->Disconnect(); | |
| 774 } | |
| 775 } | |
| 776 | |
| 777 TEST_P(SSLClientSocketPoolTest, BasicDirectAsync) { | |
| 778 StaticSocketDataProvider data; | |
| 779 socket_factory_.AddSocketDataProvider(&data); | |
| 780 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 781 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 782 | |
| 783 CreatePool(true /* tcp pool */, false, false); | |
| 784 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | |
| 785 false); | |
| 786 | |
| 787 ClientSocketHandle handle; | |
| 788 TestCompletionCallback callback; | |
| 789 int rv = handle.Init( | |
| 790 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 791 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 792 EXPECT_FALSE(handle.is_initialized()); | |
| 793 EXPECT_FALSE(handle.socket()); | |
| 794 | |
| 795 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 796 EXPECT_TRUE(handle.is_initialized()); | |
| 797 EXPECT_TRUE(handle.socket()); | |
| 798 TestLoadTimingInfo(handle); | |
| 799 } | |
| 800 | |
| 801 TEST_P(SSLClientSocketPoolTest, DirectCertError) { | |
| 802 StaticSocketDataProvider data; | |
| 803 socket_factory_.AddSocketDataProvider(&data); | |
| 804 SSLSocketDataProvider ssl(ASYNC, ERR_CERT_COMMON_NAME_INVALID); | |
| 805 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 806 | |
| 807 CreatePool(true /* tcp pool */, false, false); | |
| 808 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | |
| 809 false); | |
| 810 | |
| 811 ClientSocketHandle handle; | |
| 812 TestCompletionCallback callback; | |
| 813 int rv = handle.Init( | |
| 814 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 815 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 816 EXPECT_FALSE(handle.is_initialized()); | |
| 817 EXPECT_FALSE(handle.socket()); | |
| 818 | |
| 819 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, callback.WaitForResult()); | |
| 820 EXPECT_TRUE(handle.is_initialized()); | |
| 821 EXPECT_TRUE(handle.socket()); | |
| 822 TestLoadTimingInfo(handle); | |
| 823 } | |
| 824 | |
| 825 TEST_P(SSLClientSocketPoolTest, DirectSSLError) { | |
| 826 StaticSocketDataProvider data; | |
| 827 socket_factory_.AddSocketDataProvider(&data); | |
| 828 SSLSocketDataProvider ssl(ASYNC, ERR_SSL_PROTOCOL_ERROR); | |
| 829 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 830 | |
| 831 CreatePool(true /* tcp pool */, false, false); | |
| 832 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | |
| 833 false); | |
| 834 | |
| 835 ClientSocketHandle handle; | |
| 836 TestCompletionCallback callback; | |
| 837 int rv = handle.Init( | |
| 838 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 839 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 840 EXPECT_FALSE(handle.is_initialized()); | |
| 841 EXPECT_FALSE(handle.socket()); | |
| 842 | |
| 843 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, callback.WaitForResult()); | |
| 844 EXPECT_FALSE(handle.is_initialized()); | |
| 845 EXPECT_FALSE(handle.socket()); | |
| 846 EXPECT_TRUE(handle.is_ssl_error()); | |
| 847 } | |
| 848 | |
| 849 TEST_P(SSLClientSocketPoolTest, DirectWithNPN) { | |
| 850 StaticSocketDataProvider data; | |
| 851 socket_factory_.AddSocketDataProvider(&data); | |
| 852 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 853 ssl.SetNextProto(kProtoHTTP11); | |
| 854 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 855 | |
| 856 CreatePool(true /* tcp pool */, false, false); | |
| 857 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | |
| 858 false); | |
| 859 | |
| 860 ClientSocketHandle handle; | |
| 861 TestCompletionCallback callback; | |
| 862 int rv = handle.Init( | |
| 863 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 864 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 865 EXPECT_FALSE(handle.is_initialized()); | |
| 866 EXPECT_FALSE(handle.socket()); | |
| 867 | |
| 868 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 869 EXPECT_TRUE(handle.is_initialized()); | |
| 870 EXPECT_TRUE(handle.socket()); | |
| 871 TestLoadTimingInfo(handle); | |
| 872 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); | |
| 873 EXPECT_TRUE(ssl_socket->WasNpnNegotiated()); | |
| 874 } | |
| 875 | |
| 876 TEST_P(SSLClientSocketPoolTest, DirectNoSPDY) { | |
| 877 StaticSocketDataProvider data; | |
| 878 socket_factory_.AddSocketDataProvider(&data); | |
| 879 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 880 ssl.SetNextProto(kProtoHTTP11); | |
| 881 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 882 | |
| 883 CreatePool(true /* tcp pool */, false, false); | |
| 884 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | |
| 885 true); | |
| 886 | |
| 887 ClientSocketHandle handle; | |
| 888 TestCompletionCallback callback; | |
| 889 int rv = handle.Init( | |
| 890 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 891 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 892 EXPECT_FALSE(handle.is_initialized()); | |
| 893 EXPECT_FALSE(handle.socket()); | |
| 894 | |
| 895 EXPECT_EQ(ERR_NPN_NEGOTIATION_FAILED, callback.WaitForResult()); | |
| 896 EXPECT_FALSE(handle.is_initialized()); | |
| 897 EXPECT_FALSE(handle.socket()); | |
| 898 EXPECT_TRUE(handle.is_ssl_error()); | |
| 899 } | |
| 900 | |
| 901 TEST_P(SSLClientSocketPoolTest, DirectGotSPDY) { | |
| 902 StaticSocketDataProvider data; | |
| 903 socket_factory_.AddSocketDataProvider(&data); | |
| 904 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 905 ssl.SetNextProto(GetParam()); | |
| 906 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 907 | |
| 908 CreatePool(true /* tcp pool */, false, false); | |
| 909 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | |
| 910 true); | |
| 911 | |
| 912 ClientSocketHandle handle; | |
| 913 TestCompletionCallback callback; | |
| 914 int rv = handle.Init( | |
| 915 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 916 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 917 EXPECT_FALSE(handle.is_initialized()); | |
| 918 EXPECT_FALSE(handle.socket()); | |
| 919 | |
| 920 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 921 EXPECT_TRUE(handle.is_initialized()); | |
| 922 EXPECT_TRUE(handle.socket()); | |
| 923 TestLoadTimingInfo(handle); | |
| 924 | |
| 925 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); | |
| 926 EXPECT_TRUE(ssl_socket->WasNpnNegotiated()); | |
| 927 std::string proto; | |
| 928 ssl_socket->GetNextProto(&proto); | |
| 929 EXPECT_EQ(GetParam(), SSLClientSocket::NextProtoFromString(proto)); | |
| 930 } | |
| 931 | |
| 932 TEST_P(SSLClientSocketPoolTest, DirectGotBonusSPDY) { | |
| 933 StaticSocketDataProvider data; | |
| 934 socket_factory_.AddSocketDataProvider(&data); | |
| 935 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 936 ssl.SetNextProto(GetParam()); | |
| 937 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 938 | |
| 939 CreatePool(true /* tcp pool */, false, false); | |
| 940 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT, | |
| 941 true); | |
| 942 | |
| 943 ClientSocketHandle handle; | |
| 944 TestCompletionCallback callback; | |
| 945 int rv = handle.Init( | |
| 946 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 947 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 948 EXPECT_FALSE(handle.is_initialized()); | |
| 949 EXPECT_FALSE(handle.socket()); | |
| 950 | |
| 951 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 952 EXPECT_TRUE(handle.is_initialized()); | |
| 953 EXPECT_TRUE(handle.socket()); | |
| 954 TestLoadTimingInfo(handle); | |
| 955 | |
| 956 SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket()); | |
| 957 EXPECT_TRUE(ssl_socket->WasNpnNegotiated()); | |
| 958 std::string proto; | |
| 959 ssl_socket->GetNextProto(&proto); | |
| 960 EXPECT_EQ(GetParam(), SSLClientSocket::NextProtoFromString(proto)); | |
| 961 } | |
| 962 | |
| 963 TEST_P(SSLClientSocketPoolTest, SOCKSFail) { | |
| 964 StaticSocketDataProvider data; | |
| 965 data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED)); | |
| 966 socket_factory_.AddSocketDataProvider(&data); | |
| 967 | |
| 968 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 969 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, | |
| 970 false); | |
| 971 | |
| 972 ClientSocketHandle handle; | |
| 973 TestCompletionCallback callback; | |
| 974 int rv = handle.Init( | |
| 975 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 976 EXPECT_EQ(ERR_CONNECTION_FAILED, rv); | |
| 977 EXPECT_FALSE(handle.is_initialized()); | |
| 978 EXPECT_FALSE(handle.socket()); | |
| 979 EXPECT_FALSE(handle.is_ssl_error()); | |
| 980 } | |
| 981 | |
| 982 TEST_P(SSLClientSocketPoolTest, SOCKSFailAsync) { | |
| 983 StaticSocketDataProvider data; | |
| 984 data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_FAILED)); | |
| 985 socket_factory_.AddSocketDataProvider(&data); | |
| 986 | |
| 987 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 988 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, | |
| 989 false); | |
| 990 | |
| 991 ClientSocketHandle handle; | |
| 992 TestCompletionCallback callback; | |
| 993 int rv = handle.Init( | |
| 994 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 995 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 996 EXPECT_FALSE(handle.is_initialized()); | |
| 997 EXPECT_FALSE(handle.socket()); | |
| 998 | |
| 999 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | |
| 1000 EXPECT_FALSE(handle.is_initialized()); | |
| 1001 EXPECT_FALSE(handle.socket()); | |
| 1002 EXPECT_FALSE(handle.is_ssl_error()); | |
| 1003 } | |
| 1004 | |
| 1005 TEST_P(SSLClientSocketPoolTest, SOCKSBasic) { | |
| 1006 StaticSocketDataProvider data; | |
| 1007 data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | |
| 1008 socket_factory_.AddSocketDataProvider(&data); | |
| 1009 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | |
| 1010 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 1011 | |
| 1012 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 1013 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, | |
| 1014 false); | |
| 1015 | |
| 1016 ClientSocketHandle handle; | |
| 1017 TestCompletionCallback callback; | |
| 1018 int rv = handle.Init( | |
| 1019 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 1020 EXPECT_EQ(OK, rv); | |
| 1021 EXPECT_TRUE(handle.is_initialized()); | |
| 1022 EXPECT_TRUE(handle.socket()); | |
| 1023 // SOCKS5 generally has no DNS times, but the mock SOCKS5 sockets used here | |
| 1024 // don't go through the real logic, unlike in the HTTP proxy tests. | |
| 1025 TestLoadTimingInfo(handle); | |
| 1026 } | |
| 1027 | |
| 1028 // Make sure that SSLConnectJob passes on its priority to its | |
| 1029 // transport socket on Init (for the SOCKS_PROXY case). | |
| 1030 TEST_P(SSLClientSocketPoolTest, SetTransportPriorityOnInitSOCKS) { | |
| 1031 StaticSocketDataProvider data; | |
| 1032 data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | |
| 1033 socket_factory_.AddSocketDataProvider(&data); | |
| 1034 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | |
| 1035 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 1036 | |
| 1037 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 1038 scoped_refptr<SSLSocketParams> params = | |
| 1039 SSLParams(ProxyServer::SCHEME_SOCKS5, false); | |
| 1040 | |
| 1041 ClientSocketHandle handle; | |
| 1042 TestCompletionCallback callback; | |
| 1043 EXPECT_EQ(OK, handle.Init("a", params, HIGHEST, callback.callback(), | |
| 1044 pool_.get(), BoundNetLog())); | |
| 1045 EXPECT_EQ(HIGHEST, transport_socket_pool_.last_request_priority()); | |
| 1046 } | |
| 1047 | |
| 1048 TEST_P(SSLClientSocketPoolTest, SOCKSBasicAsync) { | |
| 1049 StaticSocketDataProvider data; | |
| 1050 socket_factory_.AddSocketDataProvider(&data); | |
| 1051 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 1052 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 1053 | |
| 1054 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 1055 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5, | |
| 1056 false); | |
| 1057 | |
| 1058 ClientSocketHandle handle; | |
| 1059 TestCompletionCallback callback; | |
| 1060 int rv = handle.Init( | |
| 1061 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 1062 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1063 EXPECT_FALSE(handle.is_initialized()); | |
| 1064 EXPECT_FALSE(handle.socket()); | |
| 1065 | |
| 1066 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 1067 EXPECT_TRUE(handle.is_initialized()); | |
| 1068 EXPECT_TRUE(handle.socket()); | |
| 1069 // SOCKS5 generally has no DNS times, but the mock SOCKS5 sockets used here | |
| 1070 // don't go through the real logic, unlike in the HTTP proxy tests. | |
| 1071 TestLoadTimingInfo(handle); | |
| 1072 } | |
| 1073 | |
| 1074 TEST_P(SSLClientSocketPoolTest, HttpProxyFail) { | |
| 1075 StaticSocketDataProvider data; | |
| 1076 data.set_connect_data(MockConnect(SYNCHRONOUS, ERR_CONNECTION_FAILED)); | |
| 1077 socket_factory_.AddSocketDataProvider(&data); | |
| 1078 | |
| 1079 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 1080 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, | |
| 1081 false); | |
| 1082 | |
| 1083 ClientSocketHandle handle; | |
| 1084 TestCompletionCallback callback; | |
| 1085 int rv = handle.Init( | |
| 1086 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 1087 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); | |
| 1088 EXPECT_FALSE(handle.is_initialized()); | |
| 1089 EXPECT_FALSE(handle.socket()); | |
| 1090 EXPECT_FALSE(handle.is_ssl_error()); | |
| 1091 } | |
| 1092 | |
| 1093 TEST_P(SSLClientSocketPoolTest, HttpProxyFailAsync) { | |
| 1094 StaticSocketDataProvider data; | |
| 1095 data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_FAILED)); | |
| 1096 socket_factory_.AddSocketDataProvider(&data); | |
| 1097 | |
| 1098 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 1099 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, | |
| 1100 false); | |
| 1101 | |
| 1102 ClientSocketHandle handle; | |
| 1103 TestCompletionCallback callback; | |
| 1104 int rv = handle.Init( | |
| 1105 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 1106 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1107 EXPECT_FALSE(handle.is_initialized()); | |
| 1108 EXPECT_FALSE(handle.socket()); | |
| 1109 | |
| 1110 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult()); | |
| 1111 EXPECT_FALSE(handle.is_initialized()); | |
| 1112 EXPECT_FALSE(handle.socket()); | |
| 1113 EXPECT_FALSE(handle.is_ssl_error()); | |
| 1114 } | |
| 1115 | |
| 1116 TEST_P(SSLClientSocketPoolTest, HttpProxyBasic) { | |
| 1117 MockWrite writes[] = { | |
| 1118 MockWrite(SYNCHRONOUS, | |
| 1119 "CONNECT host:80 HTTP/1.1\r\n" | |
| 1120 "Host: host\r\n" | |
| 1121 "Proxy-Connection: keep-alive\r\n" | |
| 1122 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | |
| 1123 }; | |
| 1124 MockRead reads[] = { | |
| 1125 MockRead(SYNCHRONOUS, "HTTP/1.1 200 Connection Established\r\n\r\n"), | |
| 1126 }; | |
| 1127 StaticSocketDataProvider data(reads, arraysize(reads), writes, | |
| 1128 arraysize(writes)); | |
| 1129 data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | |
| 1130 socket_factory_.AddSocketDataProvider(&data); | |
| 1131 AddAuthToCache(); | |
| 1132 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | |
| 1133 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 1134 | |
| 1135 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 1136 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, | |
| 1137 false); | |
| 1138 | |
| 1139 ClientSocketHandle handle; | |
| 1140 TestCompletionCallback callback; | |
| 1141 int rv = handle.Init( | |
| 1142 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 1143 EXPECT_EQ(OK, rv); | |
| 1144 EXPECT_TRUE(handle.is_initialized()); | |
| 1145 EXPECT_TRUE(handle.socket()); | |
| 1146 TestLoadTimingInfoNoDns(handle); | |
| 1147 } | |
| 1148 | |
| 1149 // Make sure that SSLConnectJob passes on its priority to its | |
| 1150 // transport socket on Init (for the HTTP_PROXY case). | |
| 1151 TEST_P(SSLClientSocketPoolTest, SetTransportPriorityOnInitHTTP) { | |
| 1152 MockWrite writes[] = { | |
| 1153 MockWrite(SYNCHRONOUS, | |
| 1154 "CONNECT host:80 HTTP/1.1\r\n" | |
| 1155 "Host: host\r\n" | |
| 1156 "Proxy-Connection: keep-alive\r\n" | |
| 1157 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | |
| 1158 }; | |
| 1159 MockRead reads[] = { | |
| 1160 MockRead(SYNCHRONOUS, "HTTP/1.1 200 Connection Established\r\n\r\n"), | |
| 1161 }; | |
| 1162 StaticSocketDataProvider data(reads, arraysize(reads), writes, | |
| 1163 arraysize(writes)); | |
| 1164 data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); | |
| 1165 socket_factory_.AddSocketDataProvider(&data); | |
| 1166 AddAuthToCache(); | |
| 1167 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | |
| 1168 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 1169 | |
| 1170 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 1171 scoped_refptr<SSLSocketParams> params = | |
| 1172 SSLParams(ProxyServer::SCHEME_HTTP, false); | |
| 1173 | |
| 1174 ClientSocketHandle handle; | |
| 1175 TestCompletionCallback callback; | |
| 1176 EXPECT_EQ(OK, handle.Init("a", params, HIGHEST, callback.callback(), | |
| 1177 pool_.get(), BoundNetLog())); | |
| 1178 EXPECT_EQ(HIGHEST, transport_socket_pool_.last_request_priority()); | |
| 1179 } | |
| 1180 | |
| 1181 TEST_P(SSLClientSocketPoolTest, HttpProxyBasicAsync) { | |
| 1182 MockWrite writes[] = { | |
| 1183 MockWrite("CONNECT host:80 HTTP/1.1\r\n" | |
| 1184 "Host: host\r\n" | |
| 1185 "Proxy-Connection: keep-alive\r\n" | |
| 1186 "Proxy-Authorization: Basic Zm9vOmJhcg==\r\n\r\n"), | |
| 1187 }; | |
| 1188 MockRead reads[] = { | |
| 1189 MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"), | |
| 1190 }; | |
| 1191 StaticSocketDataProvider data(reads, arraysize(reads), writes, | |
| 1192 arraysize(writes)); | |
| 1193 socket_factory_.AddSocketDataProvider(&data); | |
| 1194 AddAuthToCache(); | |
| 1195 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 1196 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 1197 | |
| 1198 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 1199 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, | |
| 1200 false); | |
| 1201 | |
| 1202 ClientSocketHandle handle; | |
| 1203 TestCompletionCallback callback; | |
| 1204 int rv = handle.Init( | |
| 1205 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 1206 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1207 EXPECT_FALSE(handle.is_initialized()); | |
| 1208 EXPECT_FALSE(handle.socket()); | |
| 1209 | |
| 1210 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 1211 EXPECT_TRUE(handle.is_initialized()); | |
| 1212 EXPECT_TRUE(handle.socket()); | |
| 1213 TestLoadTimingInfoNoDns(handle); | |
| 1214 } | |
| 1215 | |
| 1216 TEST_P(SSLClientSocketPoolTest, NeedProxyAuth) { | |
| 1217 MockWrite writes[] = { | |
| 1218 MockWrite("CONNECT host:80 HTTP/1.1\r\n" | |
| 1219 "Host: host\r\n" | |
| 1220 "Proxy-Connection: keep-alive\r\n\r\n"), | |
| 1221 }; | |
| 1222 MockRead reads[] = { | |
| 1223 MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"), | |
| 1224 MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"), | |
| 1225 MockRead("Content-Length: 10\r\n\r\n"), | |
| 1226 MockRead("0123456789"), | |
| 1227 }; | |
| 1228 StaticSocketDataProvider data(reads, arraysize(reads), writes, | |
| 1229 arraysize(writes)); | |
| 1230 socket_factory_.AddSocketDataProvider(&data); | |
| 1231 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 1232 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 1233 | |
| 1234 CreatePool(false, true /* http proxy pool */, true /* socks pool */); | |
| 1235 scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP, | |
| 1236 false); | |
| 1237 | |
| 1238 ClientSocketHandle handle; | |
| 1239 TestCompletionCallback callback; | |
| 1240 int rv = handle.Init( | |
| 1241 "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); | |
| 1242 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1243 EXPECT_FALSE(handle.is_initialized()); | |
| 1244 EXPECT_FALSE(handle.socket()); | |
| 1245 | |
| 1246 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); | |
| 1247 EXPECT_FALSE(handle.is_initialized()); | |
| 1248 EXPECT_FALSE(handle.socket()); | |
| 1249 EXPECT_FALSE(handle.is_ssl_error()); | |
| 1250 const HttpResponseInfo& tunnel_info = handle.ssl_error_response_info(); | |
| 1251 EXPECT_EQ(tunnel_info.headers->response_code(), 407); | |
| 1252 scoped_ptr<ClientSocketHandle> tunnel_handle( | |
| 1253 handle.release_pending_http_proxy_connection()); | |
| 1254 EXPECT_TRUE(tunnel_handle->socket()); | |
| 1255 EXPECT_FALSE(tunnel_handle->socket()->IsConnected()); | |
| 1256 } | |
| 1257 | |
| 1258 TEST_P(SSLClientSocketPoolTest, IPPooling) { | |
| 1259 const int kTestPort = 80; | |
| 1260 struct TestHosts { | |
| 1261 std::string name; | |
| 1262 std::string iplist; | |
| 1263 SpdySessionKey key; | |
| 1264 AddressList addresses; | |
| 1265 } test_hosts[] = { | |
| 1266 { "www.webkit.org", "192.0.2.33,192.168.0.1,192.168.0.5" }, | |
| 1267 { "code.google.com", "192.168.0.2,192.168.0.3,192.168.0.5" }, | |
| 1268 { "js.webkit.org", "192.168.0.4,192.168.0.1,192.0.2.33" }, | |
| 1269 }; | |
| 1270 | |
| 1271 host_resolver_.set_synchronous_mode(true); | |
| 1272 for (size_t i = 0; i < arraysize(test_hosts); i++) { | |
| 1273 host_resolver_.rules()->AddIPLiteralRule( | |
| 1274 test_hosts[i].name, test_hosts[i].iplist, std::string()); | |
| 1275 | |
| 1276 // This test requires that the HostResolver cache be populated. Normal | |
| 1277 // code would have done this already, but we do it manually. | |
| 1278 HostResolver::RequestInfo info(HostPortPair(test_hosts[i].name, kTestPort)); | |
| 1279 host_resolver_.Resolve(info, | |
| 1280 DEFAULT_PRIORITY, | |
| 1281 &test_hosts[i].addresses, | |
| 1282 CompletionCallback(), | |
| 1283 NULL, | |
| 1284 BoundNetLog()); | |
| 1285 | |
| 1286 // Setup a SpdySessionKey | |
| 1287 test_hosts[i].key = SpdySessionKey( | |
| 1288 HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(), | |
| 1289 PRIVACY_MODE_DISABLED); | |
| 1290 } | |
| 1291 | |
| 1292 MockRead reads[] = { | |
| 1293 MockRead(ASYNC, ERR_IO_PENDING), | |
| 1294 }; | |
| 1295 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | |
| 1296 socket_factory_.AddSocketDataProvider(&data); | |
| 1297 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 1298 ssl.cert = X509Certificate::CreateFromBytes( | |
| 1299 reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); | |
| 1300 ssl.SetNextProto(GetParam()); | |
| 1301 socket_factory_.AddSSLSocketDataProvider(&ssl); | |
| 1302 | |
| 1303 CreatePool(true /* tcp pool */, false, false); | |
| 1304 base::WeakPtr<SpdySession> spdy_session = | |
| 1305 CreateSecureSpdySession(session_, test_hosts[0].key, BoundNetLog()); | |
| 1306 | |
| 1307 EXPECT_TRUE( | |
| 1308 HasSpdySession(session_->spdy_session_pool(), test_hosts[0].key)); | |
| 1309 EXPECT_FALSE( | |
| 1310 HasSpdySession(session_->spdy_session_pool(), test_hosts[1].key)); | |
| 1311 EXPECT_TRUE( | |
| 1312 HasSpdySession(session_->spdy_session_pool(), test_hosts[2].key)); | |
| 1313 | |
| 1314 session_->spdy_session_pool()->CloseAllSessions(); | |
| 1315 } | |
| 1316 | |
| 1317 void SSLClientSocketPoolTest::TestIPPoolingDisabled( | |
| 1318 SSLSocketDataProvider* ssl) { | |
| 1319 const int kTestPort = 80; | |
| 1320 struct TestHosts { | |
| 1321 std::string name; | |
| 1322 std::string iplist; | |
| 1323 SpdySessionKey key; | |
| 1324 AddressList addresses; | |
| 1325 } test_hosts[] = { | |
| 1326 { "www.webkit.org", "192.0.2.33,192.168.0.1,192.168.0.5" }, | |
| 1327 { "js.webkit.com", "192.168.0.4,192.168.0.1,192.0.2.33" }, | |
| 1328 }; | |
| 1329 | |
| 1330 TestCompletionCallback callback; | |
| 1331 int rv; | |
| 1332 for (size_t i = 0; i < arraysize(test_hosts); i++) { | |
| 1333 host_resolver_.rules()->AddIPLiteralRule( | |
| 1334 test_hosts[i].name, test_hosts[i].iplist, std::string()); | |
| 1335 | |
| 1336 // This test requires that the HostResolver cache be populated. Normal | |
| 1337 // code would have done this already, but we do it manually. | |
| 1338 HostResolver::RequestInfo info(HostPortPair(test_hosts[i].name, kTestPort)); | |
| 1339 rv = host_resolver_.Resolve(info, | |
| 1340 DEFAULT_PRIORITY, | |
| 1341 &test_hosts[i].addresses, | |
| 1342 callback.callback(), | |
| 1343 NULL, | |
| 1344 BoundNetLog()); | |
| 1345 EXPECT_EQ(OK, callback.GetResult(rv)); | |
| 1346 | |
| 1347 // Setup a SpdySessionKey | |
| 1348 test_hosts[i].key = SpdySessionKey( | |
| 1349 HostPortPair(test_hosts[i].name, kTestPort), ProxyServer::Direct(), | |
| 1350 PRIVACY_MODE_DISABLED); | |
| 1351 } | |
| 1352 | |
| 1353 MockRead reads[] = { | |
| 1354 MockRead(ASYNC, ERR_IO_PENDING), | |
| 1355 }; | |
| 1356 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | |
| 1357 socket_factory_.AddSocketDataProvider(&data); | |
| 1358 socket_factory_.AddSSLSocketDataProvider(ssl); | |
| 1359 | |
| 1360 CreatePool(true /* tcp pool */, false, false); | |
| 1361 base::WeakPtr<SpdySession> spdy_session = | |
| 1362 CreateSecureSpdySession(session_, test_hosts[0].key, BoundNetLog()); | |
| 1363 | |
| 1364 EXPECT_TRUE( | |
| 1365 HasSpdySession(session_->spdy_session_pool(), test_hosts[0].key)); | |
| 1366 EXPECT_FALSE( | |
| 1367 HasSpdySession(session_->spdy_session_pool(), test_hosts[1].key)); | |
| 1368 | |
| 1369 session_->spdy_session_pool()->CloseAllSessions(); | |
| 1370 } | |
| 1371 | |
| 1372 // Verifies that an SSL connection with client authentication disables SPDY IP | |
| 1373 // pooling. | |
| 1374 TEST_P(SSLClientSocketPoolTest, IPPoolingClientCert) { | |
| 1375 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 1376 ssl.cert = X509Certificate::CreateFromBytes( | |
| 1377 reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); | |
| 1378 ssl.client_cert_sent = true; | |
| 1379 ssl.SetNextProto(GetParam()); | |
| 1380 TestIPPoolingDisabled(&ssl); | |
| 1381 } | |
| 1382 | |
| 1383 // Verifies that an SSL connection with channel ID disables SPDY IP pooling. | |
| 1384 TEST_P(SSLClientSocketPoolTest, IPPoolingChannelID) { | |
| 1385 SSLSocketDataProvider ssl(ASYNC, OK); | |
| 1386 ssl.channel_id_sent = true; | |
| 1387 ssl.SetNextProto(GetParam()); | |
| 1388 TestIPPoolingDisabled(&ssl); | |
| 1389 } | |
| 1390 | |
| 1391 // It would be nice to also test the timeouts in SSLClientSocketPool. | |
| 1392 | |
| 1393 } // namespace | |
| 1394 | |
| 1395 } // namespace net | |
| OLD | NEW |