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/socket/client_socket_pool_base.h" 6 7 #include <vector> 8 9 #include "base/bind.h" 10 #include "base/bind_helpers.h" 11 #include "base/callback.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/memory/scoped_vector.h" 14 #include "base/memory/weak_ptr.h" 15 #include "base/message_loop/message_loop.h" 16 #include "base/run_loop.h" 17 #include "base/strings/string_number_conversions.h" 18 #include "base/strings/stringprintf.h" 19 #include "base/threading/platform_thread.h" 20 #include "base/values.h" 21 #include "net/base/load_timing_info.h" 22 #include "net/base/load_timing_info_test_util.h" 23 #include "net/base/net_errors.h" 24 #include "net/base/net_log.h" 25 #include "net/base/net_log_unittest.h" 26 #include "net/base/request_priority.h" 27 #include "net/base/test_completion_callback.h" 28 #include "net/http/http_response_headers.h" 29 #include "net/socket/client_socket_factory.h" 30 #include "net/socket/client_socket_handle.h" 31 #include "net/socket/client_socket_pool_histograms.h" 32 #include "net/socket/socket_test_util.h" 33 #include "net/socket/ssl_client_socket.h" 34 #include "net/socket/stream_socket.h" 35 #include "net/udp/datagram_client_socket.h" 36 #include "testing/gmock/include/gmock/gmock.h" 37 #include "testing/gtest/include/gtest/gtest.h" 38 39 using ::testing::Invoke; 40 using ::testing::Return; 41 42 namespace net { 43 44 namespace { 45 46 const int kDefaultMaxSockets = 4; 47 const int kDefaultMaxSocketsPerGroup = 2; 48 49 // Make sure |handle| sets load times correctly when it has been assigned a 50 // reused socket. 51 void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) { 52 LoadTimingInfo load_timing_info; 53 // Only pass true in as |is_reused|, as in general, HttpStream types should 54 // have stricter concepts of reuse than socket pools. 55 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info)); 56 57 EXPECT_EQ(true, load_timing_info.socket_reused); 58 EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 59 60 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 61 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); 62 } 63 64 // Make sure |handle| sets load times correctly when it has been assigned a 65 // fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner 66 // of a connection where |is_reused| is false may consider the connection 67 // reused. 68 void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) { 69 EXPECT_FALSE(handle.is_reused()); 70 71 LoadTimingInfo load_timing_info; 72 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info)); 73 74 EXPECT_FALSE(load_timing_info.socket_reused); 75 EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 76 77 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 78 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); 79 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); 80 81 TestLoadTimingInfoConnectedReused(handle); 82 } 83 84 // Make sure |handle| sets load times correctly, in the case that it does not 85 // currently have a socket. 86 void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) { 87 // Should only be set to true once a socket is assigned, if at all. 88 EXPECT_FALSE(handle.is_reused()); 89 90 LoadTimingInfo load_timing_info; 91 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info)); 92 93 EXPECT_FALSE(load_timing_info.socket_reused); 94 EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 95 96 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 97 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); 98 } 99 100 class TestSocketParams : public base::RefCounted<TestSocketParams> { 101 public: 102 explicit TestSocketParams(bool ignore_limits) 103 : ignore_limits_(ignore_limits) {} 104 105 bool ignore_limits() { return ignore_limits_; } 106 107 private: 108 friend class base::RefCounted<TestSocketParams>; 109 ~TestSocketParams() {} 110 111 const bool ignore_limits_; 112 }; 113 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase; 114 115 class MockClientSocket : public StreamSocket { 116 public: 117 explicit MockClientSocket(net::NetLog* net_log) 118 : connected_(false), 119 has_unread_data_(false), 120 net_log_(BoundNetLog::Make(net_log, net::NetLog::SOURCE_SOCKET)), 121 was_used_to_convey_data_(false) { 122 } 123 124 // Sets whether the socket has unread data. If true, the next call to Read() 125 // will return 1 byte and IsConnectedAndIdle() will return false. 126 void set_has_unread_data(bool has_unread_data) { 127 has_unread_data_ = has_unread_data; 128 } 129 130 // Socket implementation. 131 virtual int Read( 132 IOBuffer* /* buf */, int len, 133 const CompletionCallback& /* callback */) OVERRIDE { 134 if (has_unread_data_ && len > 0) { 135 has_unread_data_ = false; 136 was_used_to_convey_data_ = true; 137 return 1; 138 } 139 return ERR_UNEXPECTED; 140 } 141 142 virtual int Write( 143 IOBuffer* /* buf */, int len, 144 const CompletionCallback& /* callback */) OVERRIDE { 145 was_used_to_convey_data_ = true; 146 return len; 147 } 148 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { return OK; } 149 virtual int SetSendBufferSize(int32 size) OVERRIDE { return OK; } 150 151 // StreamSocket implementation. 152 virtual int Connect(const CompletionCallback& callback) OVERRIDE { 153 connected_ = true; 154 return OK; 155 } 156 157 virtual void Disconnect() OVERRIDE { connected_ = false; } 158 virtual bool IsConnected() const OVERRIDE { return connected_; } 159 virtual bool IsConnectedAndIdle() const OVERRIDE { 160 return connected_ && !has_unread_data_; 161 } 162 163 virtual int GetPeerAddress(IPEndPoint* /* address */) const OVERRIDE { 164 return ERR_UNEXPECTED; 165 } 166 167 virtual int GetLocalAddress(IPEndPoint* /* address */) const OVERRIDE { 168 return ERR_UNEXPECTED; 169 } 170 171 virtual const BoundNetLog& NetLog() const OVERRIDE { 172 return net_log_; 173 } 174 175 virtual void SetSubresourceSpeculation() OVERRIDE {} 176 virtual void SetOmniboxSpeculation() OVERRIDE {} 177 virtual bool WasEverUsed() const OVERRIDE { 178 return was_used_to_convey_data_; 179 } 180 virtual bool UsingTCPFastOpen() const OVERRIDE { return false; } 181 virtual bool WasNpnNegotiated() const OVERRIDE { 182 return false; 183 } 184 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { 185 return kProtoUnknown; 186 } 187 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { 188 return false; 189 } 190 191 private: 192 bool connected_; 193 bool has_unread_data_; 194 BoundNetLog net_log_; 195 bool was_used_to_convey_data_; 196 197 DISALLOW_COPY_AND_ASSIGN(MockClientSocket); 198 }; 199 200 class TestConnectJob; 201 202 class MockClientSocketFactory : public ClientSocketFactory { 203 public: 204 MockClientSocketFactory() : allocation_count_(0) {} 205 206 virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket( 207 DatagramSocket::BindType bind_type, 208 const RandIntCallback& rand_int_cb, 209 NetLog* net_log, 210 const NetLog::Source& source) OVERRIDE { 211 NOTREACHED(); 212 return scoped_ptr<DatagramClientSocket>(); 213 } 214 215 virtual scoped_ptr<StreamSocket> CreateTransportClientSocket( 216 const AddressList& addresses, 217 NetLog* /* net_log */, 218 const NetLog::Source& /*source*/) OVERRIDE { 219 allocation_count_++; 220 return scoped_ptr<StreamSocket>(); 221 } 222 223 virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket( 224 scoped_ptr<ClientSocketHandle> transport_socket, 225 const HostPortPair& host_and_port, 226 const SSLConfig& ssl_config, 227 const SSLClientSocketContext& context) OVERRIDE { 228 NOTIMPLEMENTED(); 229 return scoped_ptr<SSLClientSocket>(); 230 } 231 232 virtual void ClearSSLSessionCache() OVERRIDE { 233 NOTIMPLEMENTED(); 234 } 235 236 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } 237 238 void SignalJobs(); 239 240 void SignalJob(size_t job); 241 242 void SetJobLoadState(size_t job, LoadState load_state); 243 244 int allocation_count() const { return allocation_count_; } 245 246 private: 247 int allocation_count_; 248 std::vector<TestConnectJob*> waiting_jobs_; 249 }; 250 251 class TestConnectJob : public ConnectJob { 252 public: 253 enum JobType { 254 kMockJob, 255 kMockFailingJob, 256 kMockPendingJob, 257 kMockPendingFailingJob, 258 kMockWaitingJob, 259 kMockRecoverableJob, 260 kMockPendingRecoverableJob, 261 kMockAdditionalErrorStateJob, 262 kMockPendingAdditionalErrorStateJob, 263 kMockUnreadDataJob, 264 }; 265 266 // The kMockPendingJob uses a slight delay before allowing the connect 267 // to complete. 268 static const int kPendingConnectDelay = 2; 269 270 TestConnectJob(JobType job_type, 271 const std::string& group_name, 272 const TestClientSocketPoolBase::Request& request, 273 base::TimeDelta timeout_duration, 274 ConnectJob::Delegate* delegate, 275 MockClientSocketFactory* client_socket_factory, 276 NetLog* net_log) 277 : ConnectJob(group_name, timeout_duration, request.priority(), delegate, 278 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), 279 job_type_(job_type), 280 client_socket_factory_(client_socket_factory), 281 load_state_(LOAD_STATE_IDLE), 282 store_additional_error_state_(false), 283 weak_factory_(this) { 284 } 285 286 void Signal() { 287 DoConnect(waiting_success_, true /* async */, false /* recoverable */); 288 } 289 290 void set_load_state(LoadState load_state) { load_state_ = load_state; } 291 292 // From ConnectJob: 293 294 virtual LoadState GetLoadState() const OVERRIDE { return load_state_; } 295 296 virtual void GetAdditionalErrorState(ClientSocketHandle* handle) OVERRIDE { 297 if (store_additional_error_state_) { 298 // Set all of the additional error state fields in some way. 299 handle->set_is_ssl_error(true); 300 HttpResponseInfo info; 301 info.headers = new HttpResponseHeaders(std::string()); 302 handle->set_ssl_error_response_info(info); 303 } 304 } 305 306 private: 307 // From ConnectJob: 308 309 virtual int ConnectInternal() OVERRIDE { 310 AddressList ignored; 311 client_socket_factory_->CreateTransportClientSocket( 312 ignored, NULL, net::NetLog::Source()); 313 SetSocket( 314 scoped_ptr<StreamSocket>(new MockClientSocket(net_log().net_log()))); 315 switch (job_type_) { 316 case kMockJob: 317 return DoConnect(true /* successful */, false /* sync */, 318 false /* recoverable */); 319 case kMockFailingJob: 320 return DoConnect(false /* error */, false /* sync */, 321 false /* recoverable */); 322 case kMockPendingJob: 323 set_load_state(LOAD_STATE_CONNECTING); 324 325 // Depending on execution timings, posting a delayed task can result 326 // in the task getting executed the at the earliest possible 327 // opportunity or only after returning once from the message loop and 328 // then a second call into the message loop. In order to make behavior 329 // more deterministic, we change the default delay to 2ms. This should 330 // always require us to wait for the second call into the message loop. 331 // 332 // N.B. The correct fix for this and similar timing problems is to 333 // abstract time for the purpose of unittests. Unfortunately, we have 334 // a lot of third-party components that directly call the various 335 // time functions, so this change would be rather invasive. 336 base::MessageLoop::current()->PostDelayedTask( 337 FROM_HERE, 338 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), 339 weak_factory_.GetWeakPtr(), 340 true /* successful */, 341 true /* async */, 342 false /* recoverable */), 343 base::TimeDelta::FromMilliseconds(kPendingConnectDelay)); 344 return ERR_IO_PENDING; 345 case kMockPendingFailingJob: 346 set_load_state(LOAD_STATE_CONNECTING); 347 base::MessageLoop::current()->PostDelayedTask( 348 FROM_HERE, 349 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), 350 weak_factory_.GetWeakPtr(), 351 false /* error */, 352 true /* async */, 353 false /* recoverable */), 354 base::TimeDelta::FromMilliseconds(2)); 355 return ERR_IO_PENDING; 356 case kMockWaitingJob: 357 set_load_state(LOAD_STATE_CONNECTING); 358 client_socket_factory_->WaitForSignal(this); 359 waiting_success_ = true; 360 return ERR_IO_PENDING; 361 case kMockRecoverableJob: 362 return DoConnect(false /* error */, false /* sync */, 363 true /* recoverable */); 364 case kMockPendingRecoverableJob: 365 set_load_state(LOAD_STATE_CONNECTING); 366 base::MessageLoop::current()->PostDelayedTask( 367 FROM_HERE, 368 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), 369 weak_factory_.GetWeakPtr(), 370 false /* error */, 371 true /* async */, 372 true /* recoverable */), 373 base::TimeDelta::FromMilliseconds(2)); 374 return ERR_IO_PENDING; 375 case kMockAdditionalErrorStateJob: 376 store_additional_error_state_ = true; 377 return DoConnect(false /* error */, false /* sync */, 378 false /* recoverable */); 379 case kMockPendingAdditionalErrorStateJob: 380 set_load_state(LOAD_STATE_CONNECTING); 381 store_additional_error_state_ = true; 382 base::MessageLoop::current()->PostDelayedTask( 383 FROM_HERE, 384 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect), 385 weak_factory_.GetWeakPtr(), 386 false /* error */, 387 true /* async */, 388 false /* recoverable */), 389 base::TimeDelta::FromMilliseconds(2)); 390 return ERR_IO_PENDING; 391 case kMockUnreadDataJob: { 392 int ret = DoConnect(true /* successful */, false /* sync */, 393 false /* recoverable */); 394 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true); 395 return ret; 396 } 397 default: 398 NOTREACHED(); 399 SetSocket(scoped_ptr<StreamSocket>()); 400 return ERR_FAILED; 401 } 402 } 403 404 int DoConnect(bool succeed, bool was_async, bool recoverable) { 405 int result = OK; 406 if (succeed) { 407 socket()->Connect(CompletionCallback()); 408 } else if (recoverable) { 409 result = ERR_PROXY_AUTH_REQUESTED; 410 } else { 411 result = ERR_CONNECTION_FAILED; 412 SetSocket(scoped_ptr<StreamSocket>()); 413 } 414 415 if (was_async) 416 NotifyDelegateOfCompletion(result); 417 return result; 418 } 419 420 bool waiting_success_; 421 const JobType job_type_; 422 MockClientSocketFactory* const client_socket_factory_; 423 LoadState load_state_; 424 bool store_additional_error_state_; 425 426 base::WeakPtrFactory<TestConnectJob> weak_factory_; 427 428 DISALLOW_COPY_AND_ASSIGN(TestConnectJob); 429 }; 430 431 class TestConnectJobFactory 432 : public TestClientSocketPoolBase::ConnectJobFactory { 433 public: 434 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory, 435 NetLog* net_log) 436 : job_type_(TestConnectJob::kMockJob), 437 job_types_(NULL), 438 client_socket_factory_(client_socket_factory), 439 net_log_(net_log) { 440 } 441 442 virtual ~TestConnectJobFactory() {} 443 444 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; } 445 446 void set_job_types(std::list<TestConnectJob::JobType>* job_types) { 447 job_types_ = job_types; 448 CHECK(!job_types_->empty()); 449 } 450 451 void set_timeout_duration(base::TimeDelta timeout_duration) { 452 timeout_duration_ = timeout_duration; 453 } 454 455 // ConnectJobFactory implementation. 456 457 virtual scoped_ptr<ConnectJob> NewConnectJob( 458 const std::string& group_name, 459 const TestClientSocketPoolBase::Request& request, 460 ConnectJob::Delegate* delegate) const OVERRIDE { 461 EXPECT_TRUE(!job_types_ || !job_types_->empty()); 462 TestConnectJob::JobType job_type = job_type_; 463 if (job_types_ && !job_types_->empty()) { 464 job_type = job_types_->front(); 465 job_types_->pop_front(); 466 } 467 return scoped_ptr<ConnectJob>(new TestConnectJob(job_type, 468 group_name, 469 request, 470 timeout_duration_, 471 delegate, 472 client_socket_factory_, 473 net_log_)); 474 } 475 476 virtual base::TimeDelta ConnectionTimeout() const OVERRIDE { 477 return timeout_duration_; 478 } 479 480 private: 481 TestConnectJob::JobType job_type_; 482 std::list<TestConnectJob::JobType>* job_types_; 483 base::TimeDelta timeout_duration_; 484 MockClientSocketFactory* const client_socket_factory_; 485 NetLog* net_log_; 486 487 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory); 488 }; 489 490 class TestClientSocketPool : public ClientSocketPool { 491 public: 492 typedef TestSocketParams SocketParams; 493 494 TestClientSocketPool( 495 int max_sockets, 496 int max_sockets_per_group, 497 ClientSocketPoolHistograms* histograms, 498 base::TimeDelta unused_idle_socket_timeout, 499 base::TimeDelta used_idle_socket_timeout, 500 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) 501 : base_(NULL, max_sockets, max_sockets_per_group, histograms, 502 unused_idle_socket_timeout, used_idle_socket_timeout, 503 connect_job_factory) {} 504 505 virtual ~TestClientSocketPool() {} 506 507 virtual int RequestSocket( 508 const std::string& group_name, 509 const void* params, 510 net::RequestPriority priority, 511 ClientSocketHandle* handle, 512 const CompletionCallback& callback, 513 const BoundNetLog& net_log) OVERRIDE { 514 const scoped_refptr<TestSocketParams>* casted_socket_params = 515 static_cast<const scoped_refptr<TestSocketParams>*>(params); 516 return base_.RequestSocket(group_name, *casted_socket_params, priority, 517 handle, callback, net_log); 518 } 519 520 virtual void RequestSockets(const std::string& group_name, 521 const void* params, 522 int num_sockets, 523 const BoundNetLog& net_log) OVERRIDE { 524 const scoped_refptr<TestSocketParams>* casted_params = 525 static_cast<const scoped_refptr<TestSocketParams>*>(params); 526 527 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log); 528 } 529 530 virtual void CancelRequest( 531 const std::string& group_name, 532 ClientSocketHandle* handle) OVERRIDE { 533 base_.CancelRequest(group_name, handle); 534 } 535 536 virtual void ReleaseSocket( 537 const std::string& group_name, 538 scoped_ptr<StreamSocket> socket, 539 int id) OVERRIDE { 540 base_.ReleaseSocket(group_name, socket.Pass(), id); 541 } 542 543 virtual void FlushWithError(int error) OVERRIDE { 544 base_.FlushWithError(error); 545 } 546 547 virtual bool IsStalled() const OVERRIDE { 548 return base_.IsStalled(); 549 } 550 551 virtual void CloseIdleSockets() OVERRIDE { 552 base_.CloseIdleSockets(); 553 } 554 555 virtual int IdleSocketCount() const OVERRIDE { 556 return base_.idle_socket_count(); 557 } 558 559 virtual int IdleSocketCountInGroup( 560 const std::string& group_name) const OVERRIDE { 561 return base_.IdleSocketCountInGroup(group_name); 562 } 563 564 virtual LoadState GetLoadState( 565 const std::string& group_name, 566 const ClientSocketHandle* handle) const OVERRIDE { 567 return base_.GetLoadState(group_name, handle); 568 } 569 570 virtual void AddHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE { 571 base_.AddHigherLayeredPool(higher_pool); 572 } 573 574 virtual void RemoveHigherLayeredPool( 575 HigherLayeredPool* higher_pool) OVERRIDE { 576 base_.RemoveHigherLayeredPool(higher_pool); 577 } 578 579 virtual base::DictionaryValue* GetInfoAsValue( 580 const std::string& name, 581 const std::string& type, 582 bool include_nested_pools) const OVERRIDE { 583 return base_.GetInfoAsValue(name, type); 584 } 585 586 virtual base::TimeDelta ConnectionTimeout() const OVERRIDE { 587 return base_.ConnectionTimeout(); 588 } 589 590 virtual ClientSocketPoolHistograms* histograms() const OVERRIDE { 591 return base_.histograms(); 592 } 593 594 const TestClientSocketPoolBase* base() const { return &base_; } 595 596 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const { 597 return base_.NumUnassignedConnectJobsInGroup(group_name); 598 } 599 600 int NumConnectJobsInGroup(const std::string& group_name) const { 601 return base_.NumConnectJobsInGroup(group_name); 602 } 603 604 int NumActiveSocketsInGroup(const std::string& group_name) const { 605 return base_.NumActiveSocketsInGroup(group_name); 606 } 607 608 bool HasGroup(const std::string& group_name) const { 609 return base_.HasGroup(group_name); 610 } 611 612 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); } 613 614 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); } 615 616 bool CloseOneIdleConnectionInHigherLayeredPool() { 617 return base_.CloseOneIdleConnectionInHigherLayeredPool(); 618 } 619 620 private: 621 TestClientSocketPoolBase base_; 622 623 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); 624 }; 625 626 } // namespace 627 628 namespace { 629 630 void MockClientSocketFactory::SignalJobs() { 631 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); 632 it != waiting_jobs_.end(); ++it) { 633 (*it)->Signal(); 634 } 635 waiting_jobs_.clear(); 636 } 637 638 void MockClientSocketFactory::SignalJob(size_t job) { 639 ASSERT_LT(job, waiting_jobs_.size()); 640 waiting_jobs_[job]->Signal(); 641 waiting_jobs_.erase(waiting_jobs_.begin() + job); 642 } 643 644 void MockClientSocketFactory::SetJobLoadState(size_t job, 645 LoadState load_state) { 646 ASSERT_LT(job, waiting_jobs_.size()); 647 waiting_jobs_[job]->set_load_state(load_state); 648 } 649 650 class TestConnectJobDelegate : public ConnectJob::Delegate { 651 public: 652 TestConnectJobDelegate() 653 : have_result_(false), waiting_for_result_(false), result_(OK) {} 654 virtual ~TestConnectJobDelegate() {} 655 656 virtual void OnConnectJobComplete(int result, ConnectJob* job) OVERRIDE { 657 result_ = result; 658 scoped_ptr<ConnectJob> owned_job(job); 659 scoped_ptr<StreamSocket> socket = owned_job->PassSocket(); 660 // socket.get() should be NULL iff result != OK 661 EXPECT_EQ(socket == NULL, result != OK); 662 have_result_ = true; 663 if (waiting_for_result_) 664 base::MessageLoop::current()->Quit(); 665 } 666 667 int WaitForResult() { 668 DCHECK(!waiting_for_result_); 669 while (!have_result_) { 670 waiting_for_result_ = true; 671 base::MessageLoop::current()->Run(); 672 waiting_for_result_ = false; 673 } 674 have_result_ = false; // auto-reset for next callback 675 return result_; 676 } 677 678 private: 679 bool have_result_; 680 bool waiting_for_result_; 681 int result_; 682 }; 683 684 class ClientSocketPoolBaseTest : public testing::Test { 685 protected: 686 ClientSocketPoolBaseTest() 687 : params_(new TestSocketParams(false /* ignore_limits */)), 688 histograms_("ClientSocketPoolTest") { 689 connect_backup_jobs_enabled_ = 690 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled(); 691 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true); 692 cleanup_timer_enabled_ = 693 internal::ClientSocketPoolBaseHelper::cleanup_timer_enabled(); 694 } 695 696 virtual ~ClientSocketPoolBaseTest() { 697 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( 698 connect_backup_jobs_enabled_); 699 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled( 700 cleanup_timer_enabled_); 701 } 702 703 void CreatePool(int max_sockets, int max_sockets_per_group) { 704 CreatePoolWithIdleTimeouts( 705 max_sockets, 706 max_sockets_per_group, 707 ClientSocketPool::unused_idle_socket_timeout(), 708 ClientSocketPool::used_idle_socket_timeout()); 709 } 710 711 void CreatePoolWithIdleTimeouts( 712 int max_sockets, int max_sockets_per_group, 713 base::TimeDelta unused_idle_socket_timeout, 714 base::TimeDelta used_idle_socket_timeout) { 715 DCHECK(!pool_.get()); 716 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_, 717 &net_log_); 718 pool_.reset(new TestClientSocketPool(max_sockets, 719 max_sockets_per_group, 720 &histograms_, 721 unused_idle_socket_timeout, 722 used_idle_socket_timeout, 723 connect_job_factory_)); 724 } 725 726 int StartRequestWithParams( 727 const std::string& group_name, 728 RequestPriority priority, 729 const scoped_refptr<TestSocketParams>& params) { 730 return test_base_.StartRequestUsingPool( 731 pool_.get(), group_name, priority, params); 732 } 733 734 int StartRequest(const std::string& group_name, RequestPriority priority) { 735 return StartRequestWithParams(group_name, priority, params_); 736 } 737 738 int GetOrderOfRequest(size_t index) const { 739 return test_base_.GetOrderOfRequest(index); 740 } 741 742 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) { 743 return test_base_.ReleaseOneConnection(keep_alive); 744 } 745 746 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) { 747 test_base_.ReleaseAllConnections(keep_alive); 748 } 749 750 TestSocketRequest* request(int i) { return test_base_.request(i); } 751 size_t requests_size() const { return test_base_.requests_size(); } 752 ScopedVector<TestSocketRequest>* requests() { return test_base_.requests(); } 753 size_t completion_count() const { return test_base_.completion_count(); } 754 755 CapturingNetLog net_log_; 756 bool connect_backup_jobs_enabled_; 757 bool cleanup_timer_enabled_; 758 MockClientSocketFactory client_socket_factory_; 759 TestConnectJobFactory* connect_job_factory_; 760 scoped_refptr<TestSocketParams> params_; 761 ClientSocketPoolHistograms histograms_; 762 scoped_ptr<TestClientSocketPool> pool_; 763 ClientSocketPoolTest test_base_; 764 }; 765 766 // Even though a timeout is specified, it doesn't time out on a synchronous 767 // completion. 768 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { 769 TestConnectJobDelegate delegate; 770 ClientSocketHandle ignored; 771 TestClientSocketPoolBase::Request request( 772 &ignored, CompletionCallback(), DEFAULT_PRIORITY, 773 internal::ClientSocketPoolBaseHelper::NORMAL, 774 false, params_, BoundNetLog()); 775 scoped_ptr<TestConnectJob> job( 776 new TestConnectJob(TestConnectJob::kMockJob, 777 "a", 778 request, 779 base::TimeDelta::FromMicroseconds(1), 780 &delegate, 781 &client_socket_factory_, 782 NULL)); 783 EXPECT_EQ(OK, job->Connect()); 784 } 785 786 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { 787 TestConnectJobDelegate delegate; 788 ClientSocketHandle ignored; 789 CapturingNetLog log; 790 791 TestClientSocketPoolBase::Request request( 792 &ignored, CompletionCallback(), DEFAULT_PRIORITY, 793 internal::ClientSocketPoolBaseHelper::NORMAL, 794 false, params_, BoundNetLog()); 795 // Deleted by TestConnectJobDelegate. 796 TestConnectJob* job = 797 new TestConnectJob(TestConnectJob::kMockPendingJob, 798 "a", 799 request, 800 base::TimeDelta::FromMicroseconds(1), 801 &delegate, 802 &client_socket_factory_, 803 &log); 804 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); 805 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1)); 806 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult()); 807 808 CapturingNetLog::CapturedEntryList entries; 809 log.GetEntries(&entries); 810 811 EXPECT_EQ(6u, entries.size()); 812 EXPECT_TRUE(LogContainsBeginEvent( 813 entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 814 EXPECT_TRUE(LogContainsBeginEvent( 815 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); 816 EXPECT_TRUE(LogContainsEvent( 817 entries, 2, NetLog::TYPE_CONNECT_JOB_SET_SOCKET, 818 NetLog::PHASE_NONE)); 819 EXPECT_TRUE(LogContainsEvent( 820 entries, 3, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT, 821 NetLog::PHASE_NONE)); 822 EXPECT_TRUE(LogContainsEndEvent( 823 entries, 4, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); 824 EXPECT_TRUE(LogContainsEndEvent( 825 entries, 5, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 826 } 827 828 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { 829 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 830 831 TestCompletionCallback callback; 832 ClientSocketHandle handle; 833 CapturingBoundNetLog log; 834 TestLoadTimingInfoNotConnected(handle); 835 836 EXPECT_EQ(OK, 837 handle.Init("a", 838 params_, 839 DEFAULT_PRIORITY, 840 callback.callback(), 841 pool_.get(), 842 log.bound())); 843 EXPECT_TRUE(handle.is_initialized()); 844 EXPECT_TRUE(handle.socket()); 845 TestLoadTimingInfoConnectedNotReused(handle); 846 847 handle.Reset(); 848 TestLoadTimingInfoNotConnected(handle); 849 850 CapturingNetLog::CapturedEntryList entries; 851 log.GetEntries(&entries); 852 853 EXPECT_EQ(4u, entries.size()); 854 EXPECT_TRUE(LogContainsBeginEvent( 855 entries, 0, NetLog::TYPE_SOCKET_POOL)); 856 EXPECT_TRUE(LogContainsEvent( 857 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 858 NetLog::PHASE_NONE)); 859 EXPECT_TRUE(LogContainsEvent( 860 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, 861 NetLog::PHASE_NONE)); 862 EXPECT_TRUE(LogContainsEndEvent( 863 entries, 3, NetLog::TYPE_SOCKET_POOL)); 864 } 865 866 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { 867 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 868 869 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 870 CapturingBoundNetLog log; 871 872 ClientSocketHandle handle; 873 TestCompletionCallback callback; 874 // Set the additional error state members to ensure that they get cleared. 875 handle.set_is_ssl_error(true); 876 HttpResponseInfo info; 877 info.headers = new HttpResponseHeaders(std::string()); 878 handle.set_ssl_error_response_info(info); 879 EXPECT_EQ(ERR_CONNECTION_FAILED, 880 handle.Init("a", 881 params_, 882 DEFAULT_PRIORITY, 883 callback.callback(), 884 pool_.get(), 885 log.bound())); 886 EXPECT_FALSE(handle.socket()); 887 EXPECT_FALSE(handle.is_ssl_error()); 888 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); 889 TestLoadTimingInfoNotConnected(handle); 890 891 CapturingNetLog::CapturedEntryList entries; 892 log.GetEntries(&entries); 893 894 EXPECT_EQ(3u, entries.size()); 895 EXPECT_TRUE(LogContainsBeginEvent( 896 entries, 0, NetLog::TYPE_SOCKET_POOL)); 897 EXPECT_TRUE(LogContainsEvent( 898 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 899 NetLog::PHASE_NONE)); 900 EXPECT_TRUE(LogContainsEndEvent( 901 entries, 2, NetLog::TYPE_SOCKET_POOL)); 902 } 903 904 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { 905 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 906 907 // TODO(eroman): Check that the NetLog contains this event. 908 909 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 910 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); 911 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY)); 912 EXPECT_EQ(OK, StartRequest("d", DEFAULT_PRIORITY)); 913 914 EXPECT_EQ(static_cast<int>(requests_size()), 915 client_socket_factory_.allocation_count()); 916 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 917 918 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", DEFAULT_PRIORITY)); 919 EXPECT_EQ(ERR_IO_PENDING, StartRequest("f", DEFAULT_PRIORITY)); 920 EXPECT_EQ(ERR_IO_PENDING, StartRequest("g", DEFAULT_PRIORITY)); 921 922 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 923 924 EXPECT_EQ(static_cast<int>(requests_size()), 925 client_socket_factory_.allocation_count()); 926 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 927 928 EXPECT_EQ(1, GetOrderOfRequest(1)); 929 EXPECT_EQ(2, GetOrderOfRequest(2)); 930 EXPECT_EQ(3, GetOrderOfRequest(3)); 931 EXPECT_EQ(4, GetOrderOfRequest(4)); 932 EXPECT_EQ(5, GetOrderOfRequest(5)); 933 EXPECT_EQ(6, GetOrderOfRequest(6)); 934 EXPECT_EQ(7, GetOrderOfRequest(7)); 935 936 // Make sure we test order of all requests made. 937 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); 938 } 939 940 TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) { 941 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 942 943 // TODO(eroman): Check that the NetLog contains this event. 944 945 // Reach all limits: max total sockets, and max sockets per group. 946 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 947 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 948 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); 949 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); 950 951 EXPECT_EQ(static_cast<int>(requests_size()), 952 client_socket_factory_.allocation_count()); 953 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 954 955 // Now create a new group and verify that we don't starve it. 956 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", DEFAULT_PRIORITY)); 957 958 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 959 960 EXPECT_EQ(static_cast<int>(requests_size()), 961 client_socket_factory_.allocation_count()); 962 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 963 964 EXPECT_EQ(1, GetOrderOfRequest(1)); 965 EXPECT_EQ(2, GetOrderOfRequest(2)); 966 EXPECT_EQ(3, GetOrderOfRequest(3)); 967 EXPECT_EQ(4, GetOrderOfRequest(4)); 968 EXPECT_EQ(5, GetOrderOfRequest(5)); 969 970 // Make sure we test order of all requests made. 971 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6)); 972 } 973 974 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) { 975 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 976 977 EXPECT_EQ(OK, StartRequest("b", LOWEST)); 978 EXPECT_EQ(OK, StartRequest("a", MEDIUM)); 979 EXPECT_EQ(OK, StartRequest("b", HIGHEST)); 980 EXPECT_EQ(OK, StartRequest("a", LOWEST)); 981 982 EXPECT_EQ(static_cast<int>(requests_size()), 983 client_socket_factory_.allocation_count()); 984 985 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", LOWEST)); 986 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 987 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", HIGHEST)); 988 989 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 990 991 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 992 993 // First 4 requests don't have to wait, and finish in order. 994 EXPECT_EQ(1, GetOrderOfRequest(1)); 995 EXPECT_EQ(2, GetOrderOfRequest(2)); 996 EXPECT_EQ(3, GetOrderOfRequest(3)); 997 EXPECT_EQ(4, GetOrderOfRequest(4)); 998 999 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM), 1000 // and then ("c", LOWEST). 1001 EXPECT_EQ(7, GetOrderOfRequest(5)); 1002 EXPECT_EQ(6, GetOrderOfRequest(6)); 1003 EXPECT_EQ(5, GetOrderOfRequest(7)); 1004 1005 // Make sure we test order of all requests made. 1006 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9)); 1007 } 1008 1009 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) { 1010 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1011 1012 EXPECT_EQ(OK, StartRequest("a", LOWEST)); 1013 EXPECT_EQ(OK, StartRequest("a", LOW)); 1014 EXPECT_EQ(OK, StartRequest("b", HIGHEST)); 1015 EXPECT_EQ(OK, StartRequest("b", MEDIUM)); 1016 1017 EXPECT_EQ(static_cast<int>(requests_size()), 1018 client_socket_factory_.allocation_count()); 1019 1020 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", MEDIUM)); 1021 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1022 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", HIGHEST)); 1023 1024 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 1025 1026 EXPECT_EQ(static_cast<int>(requests_size()), 1027 client_socket_factory_.allocation_count()); 1028 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 1029 1030 // First 4 requests don't have to wait, and finish in order. 1031 EXPECT_EQ(1, GetOrderOfRequest(1)); 1032 EXPECT_EQ(2, GetOrderOfRequest(2)); 1033 EXPECT_EQ(3, GetOrderOfRequest(3)); 1034 EXPECT_EQ(4, GetOrderOfRequest(4)); 1035 1036 // Request ("b", 7) has the highest priority, but we can't make new socket for 1037 // group "b", because it has reached the per-group limit. Then we make 1038 // socket for ("c", 6), because it has higher priority than ("a", 4), 1039 // and we still can't make a socket for group "b". 1040 EXPECT_EQ(5, GetOrderOfRequest(5)); 1041 EXPECT_EQ(6, GetOrderOfRequest(6)); 1042 EXPECT_EQ(7, GetOrderOfRequest(7)); 1043 1044 // Make sure we test order of all requests made. 1045 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); 1046 } 1047 1048 // Make sure that we count connecting sockets against the total limit. 1049 TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) { 1050 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1051 1052 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1053 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); 1054 EXPECT_EQ(OK, StartRequest("c", DEFAULT_PRIORITY)); 1055 1056 // Create one asynchronous request. 1057 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1058 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", DEFAULT_PRIORITY)); 1059 1060 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 1061 // actually become pending until 2ms after they have been created. In order 1062 // to flush all tasks, we need to wait so that we know there are no 1063 // soon-to-be-pending tasks waiting. 1064 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); 1065 base::MessageLoop::current()->RunUntilIdle(); 1066 1067 // The next synchronous request should wait for its turn. 1068 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1069 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", DEFAULT_PRIORITY)); 1070 1071 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 1072 1073 EXPECT_EQ(static_cast<int>(requests_size()), 1074 client_socket_factory_.allocation_count()); 1075 1076 EXPECT_EQ(1, GetOrderOfRequest(1)); 1077 EXPECT_EQ(2, GetOrderOfRequest(2)); 1078 EXPECT_EQ(3, GetOrderOfRequest(3)); 1079 EXPECT_EQ(4, GetOrderOfRequest(4)); 1080 EXPECT_EQ(5, GetOrderOfRequest(5)); 1081 1082 // Make sure we test order of all requests made. 1083 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6)); 1084 } 1085 1086 TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) { 1087 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 1088 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1089 1090 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1091 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1092 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1093 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1094 1095 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1096 1097 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1098 1099 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", DEFAULT_PRIORITY)); 1100 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", DEFAULT_PRIORITY)); 1101 1102 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1103 1104 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1105 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); 1106 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1107 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); 1108 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1109 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1110 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); 1111 } 1112 1113 TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) { 1114 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 1115 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1116 1117 ClientSocketHandle handle; 1118 TestCompletionCallback callback; 1119 EXPECT_EQ(ERR_IO_PENDING, 1120 handle.Init("a", 1121 params_, 1122 DEFAULT_PRIORITY, 1123 callback.callback(), 1124 pool_.get(), 1125 BoundNetLog())); 1126 1127 ClientSocketHandle handles[4]; 1128 for (size_t i = 0; i < arraysize(handles); ++i) { 1129 TestCompletionCallback callback; 1130 EXPECT_EQ(ERR_IO_PENDING, 1131 handles[i].Init("b", 1132 params_, 1133 DEFAULT_PRIORITY, 1134 callback.callback(), 1135 pool_.get(), 1136 BoundNetLog())); 1137 } 1138 1139 // One will be stalled, cancel all the handles now. 1140 // This should hit the OnAvailableSocketSlot() code where we previously had 1141 // stalled groups, but no longer have any. 1142 for (size_t i = 0; i < arraysize(handles); ++i) 1143 handles[i].Reset(); 1144 } 1145 1146 TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) { 1147 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1148 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1149 1150 { 1151 ClientSocketHandle handles[kDefaultMaxSockets]; 1152 TestCompletionCallback callbacks[kDefaultMaxSockets]; 1153 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1154 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), 1155 params_, 1156 DEFAULT_PRIORITY, 1157 callbacks[i].callback(), 1158 pool_.get(), 1159 BoundNetLog())); 1160 } 1161 1162 // Force a stalled group. 1163 ClientSocketHandle stalled_handle; 1164 TestCompletionCallback callback; 1165 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1166 params_, 1167 DEFAULT_PRIORITY, 1168 callback.callback(), 1169 pool_.get(), 1170 BoundNetLog())); 1171 1172 // Cancel the stalled request. 1173 stalled_handle.Reset(); 1174 1175 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1176 EXPECT_EQ(0, pool_->IdleSocketCount()); 1177 1178 // Dropping out of scope will close all handles and return them to idle. 1179 } 1180 1181 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1182 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount()); 1183 } 1184 1185 TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) { 1186 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1187 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1188 1189 { 1190 ClientSocketHandle handles[kDefaultMaxSockets]; 1191 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1192 TestCompletionCallback callback; 1193 EXPECT_EQ(ERR_IO_PENDING, handles[i].Init(base::IntToString(i), 1194 params_, 1195 DEFAULT_PRIORITY, 1196 callback.callback(), 1197 pool_.get(), 1198 BoundNetLog())); 1199 } 1200 1201 // Force a stalled group. 1202 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1203 ClientSocketHandle stalled_handle; 1204 TestCompletionCallback callback; 1205 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1206 params_, 1207 DEFAULT_PRIORITY, 1208 callback.callback(), 1209 pool_.get(), 1210 BoundNetLog())); 1211 1212 // Since it is stalled, it should have no connect jobs. 1213 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); 1214 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); 1215 1216 // Cancel the stalled request. 1217 handles[0].Reset(); 1218 1219 // Now we should have a connect job. 1220 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo")); 1221 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); 1222 1223 // The stalled socket should connect. 1224 EXPECT_EQ(OK, callback.WaitForResult()); 1225 1226 EXPECT_EQ(kDefaultMaxSockets + 1, 1227 client_socket_factory_.allocation_count()); 1228 EXPECT_EQ(0, pool_->IdleSocketCount()); 1229 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); 1230 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); 1231 1232 // Dropping out of scope will close all handles and return them to idle. 1233 } 1234 1235 EXPECT_EQ(1, pool_->IdleSocketCount()); 1236 } 1237 1238 TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) { 1239 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1240 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1241 1242 ClientSocketHandle stalled_handle; 1243 TestCompletionCallback callback; 1244 { 1245 EXPECT_FALSE(pool_->IsStalled()); 1246 ClientSocketHandle handles[kDefaultMaxSockets]; 1247 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1248 TestCompletionCallback callback; 1249 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf( 1250 "Take 2: %d", i), 1251 params_, 1252 DEFAULT_PRIORITY, 1253 callback.callback(), 1254 pool_.get(), 1255 BoundNetLog())); 1256 } 1257 1258 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1259 EXPECT_EQ(0, pool_->IdleSocketCount()); 1260 EXPECT_FALSE(pool_->IsStalled()); 1261 1262 // Now we will hit the socket limit. 1263 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1264 params_, 1265 DEFAULT_PRIORITY, 1266 callback.callback(), 1267 pool_.get(), 1268 BoundNetLog())); 1269 EXPECT_TRUE(pool_->IsStalled()); 1270 1271 // Dropping out of scope will close all handles and return them to idle. 1272 } 1273 1274 // But if we wait for it, the released idle sockets will be closed in 1275 // preference of the waiting request. 1276 EXPECT_EQ(OK, callback.WaitForResult()); 1277 1278 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); 1279 EXPECT_EQ(3, pool_->IdleSocketCount()); 1280 } 1281 1282 // Regression test for http://crbug.com/40952. 1283 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) { 1284 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1285 pool_->EnableConnectBackupJobs(); 1286 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1287 1288 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1289 ClientSocketHandle handle; 1290 TestCompletionCallback callback; 1291 EXPECT_EQ(OK, handle.Init(base::IntToString(i), 1292 params_, 1293 DEFAULT_PRIORITY, 1294 callback.callback(), 1295 pool_.get(), 1296 BoundNetLog())); 1297 } 1298 1299 // Flush all the DoReleaseSocket tasks. 1300 base::MessageLoop::current()->RunUntilIdle(); 1301 1302 // Stall a group. Set a pending job so it'll trigger a backup job if we don't 1303 // reuse a socket. 1304 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1305 ClientSocketHandle handle; 1306 TestCompletionCallback callback; 1307 1308 // "0" is special here, since it should be the first entry in the sorted map, 1309 // which is the one which we would close an idle socket for. We shouldn't 1310 // close an idle socket though, since we should reuse the idle socket. 1311 EXPECT_EQ(OK, handle.Init("0", 1312 params_, 1313 DEFAULT_PRIORITY, 1314 callback.callback(), 1315 pool_.get(), 1316 BoundNetLog())); 1317 1318 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1319 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); 1320 } 1321 1322 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { 1323 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1324 1325 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1326 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1327 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", IDLE)); 1328 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1329 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1330 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1331 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1332 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1333 1334 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); 1335 1336 EXPECT_EQ(kDefaultMaxSocketsPerGroup, 1337 client_socket_factory_.allocation_count()); 1338 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, 1339 completion_count()); 1340 1341 EXPECT_EQ(1, GetOrderOfRequest(1)); 1342 EXPECT_EQ(2, GetOrderOfRequest(2)); 1343 EXPECT_EQ(8, GetOrderOfRequest(3)); 1344 EXPECT_EQ(6, GetOrderOfRequest(4)); 1345 EXPECT_EQ(4, GetOrderOfRequest(5)); 1346 EXPECT_EQ(3, GetOrderOfRequest(6)); 1347 EXPECT_EQ(5, GetOrderOfRequest(7)); 1348 EXPECT_EQ(7, GetOrderOfRequest(8)); 1349 1350 // Make sure we test order of all requests made. 1351 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9)); 1352 } 1353 1354 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) { 1355 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1356 1357 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1358 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1359 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1360 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1361 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1362 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1363 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1364 1365 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 1366 1367 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) 1368 EXPECT_EQ(OK, request(i)->WaitForResult()); 1369 1370 EXPECT_EQ(static_cast<int>(requests_size()), 1371 client_socket_factory_.allocation_count()); 1372 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, 1373 completion_count()); 1374 } 1375 1376 // This test will start up a RequestSocket() and then immediately Cancel() it. 1377 // The pending connect job will be cancelled and should not call back into 1378 // ClientSocketPoolBase. 1379 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { 1380 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1381 1382 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1383 ClientSocketHandle handle; 1384 TestCompletionCallback callback; 1385 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1386 params_, 1387 DEFAULT_PRIORITY, 1388 callback.callback(), 1389 pool_.get(), 1390 BoundNetLog())); 1391 handle.Reset(); 1392 } 1393 1394 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { 1395 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1396 1397 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1398 ClientSocketHandle handle; 1399 TestCompletionCallback callback; 1400 1401 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1402 params_, 1403 DEFAULT_PRIORITY, 1404 callback.callback(), 1405 pool_.get(), 1406 BoundNetLog())); 1407 1408 handle.Reset(); 1409 1410 TestCompletionCallback callback2; 1411 EXPECT_EQ(ERR_IO_PENDING, 1412 handle.Init("a", 1413 params_, 1414 DEFAULT_PRIORITY, 1415 callback2.callback(), 1416 pool_.get(), 1417 BoundNetLog())); 1418 1419 EXPECT_EQ(OK, callback2.WaitForResult()); 1420 EXPECT_FALSE(callback.have_result()); 1421 1422 handle.Reset(); 1423 } 1424 1425 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { 1426 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1427 1428 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1429 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1430 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1431 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1432 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1433 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1434 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1435 1436 // Cancel a request. 1437 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2; 1438 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized()); 1439 (*requests())[index_to_cancel]->handle()->Reset(); 1440 1441 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); 1442 1443 EXPECT_EQ(kDefaultMaxSocketsPerGroup, 1444 client_socket_factory_.allocation_count()); 1445 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1, 1446 completion_count()); 1447 1448 EXPECT_EQ(1, GetOrderOfRequest(1)); 1449 EXPECT_EQ(2, GetOrderOfRequest(2)); 1450 EXPECT_EQ(5, GetOrderOfRequest(3)); 1451 EXPECT_EQ(3, GetOrderOfRequest(4)); 1452 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, 1453 GetOrderOfRequest(5)); // Canceled request. 1454 EXPECT_EQ(4, GetOrderOfRequest(6)); 1455 EXPECT_EQ(6, GetOrderOfRequest(7)); 1456 1457 // Make sure we test order of all requests made. 1458 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); 1459 } 1460 1461 class RequestSocketCallback : public TestCompletionCallbackBase { 1462 public: 1463 RequestSocketCallback(ClientSocketHandle* handle, 1464 TestClientSocketPool* pool, 1465 TestConnectJobFactory* test_connect_job_factory, 1466 TestConnectJob::JobType next_job_type) 1467 : handle_(handle), 1468 pool_(pool), 1469 within_callback_(false), 1470 test_connect_job_factory_(test_connect_job_factory), 1471 next_job_type_(next_job_type), 1472 callback_(base::Bind(&RequestSocketCallback::OnComplete, 1473 base::Unretained(this))) { 1474 } 1475 1476 virtual ~RequestSocketCallback() {} 1477 1478 const CompletionCallback& callback() const { return callback_; } 1479 1480 private: 1481 void OnComplete(int result) { 1482 SetResult(result); 1483 ASSERT_EQ(OK, result); 1484 1485 if (!within_callback_) { 1486 test_connect_job_factory_->set_job_type(next_job_type_); 1487 1488 // Don't allow reuse of the socket. Disconnect it and then release it and 1489 // run through the MessageLoop once to get it completely released. 1490 handle_->socket()->Disconnect(); 1491 handle_->Reset(); 1492 { 1493 // TODO: Resolve conflicting intentions of stopping recursion with the 1494 // |!within_callback_| test (above) and the call to |RunUntilIdle()| 1495 // below. http://crbug.com/114130. 1496 base::MessageLoop::ScopedNestableTaskAllower allow( 1497 base::MessageLoop::current()); 1498 base::MessageLoop::current()->RunUntilIdle(); 1499 } 1500 within_callback_ = true; 1501 TestCompletionCallback next_job_callback; 1502 scoped_refptr<TestSocketParams> params( 1503 new TestSocketParams(false /* ignore_limits */)); 1504 int rv = handle_->Init("a", 1505 params, 1506 DEFAULT_PRIORITY, 1507 next_job_callback.callback(), 1508 pool_, 1509 BoundNetLog()); 1510 switch (next_job_type_) { 1511 case TestConnectJob::kMockJob: 1512 EXPECT_EQ(OK, rv); 1513 break; 1514 case TestConnectJob::kMockPendingJob: 1515 EXPECT_EQ(ERR_IO_PENDING, rv); 1516 1517 // For pending jobs, wait for new socket to be created. This makes 1518 // sure there are no more pending operations nor any unclosed sockets 1519 // when the test finishes. 1520 // We need to give it a little bit of time to run, so that all the 1521 // operations that happen on timers (e.g. cleanup of idle 1522 // connections) can execute. 1523 { 1524 base::MessageLoop::ScopedNestableTaskAllower allow( 1525 base::MessageLoop::current()); 1526 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); 1527 EXPECT_EQ(OK, next_job_callback.WaitForResult()); 1528 } 1529 break; 1530 default: 1531 FAIL() << "Unexpected job type: " << next_job_type_; 1532 break; 1533 } 1534 } 1535 } 1536 1537 ClientSocketHandle* const handle_; 1538 TestClientSocketPool* const pool_; 1539 bool within_callback_; 1540 TestConnectJobFactory* const test_connect_job_factory_; 1541 TestConnectJob::JobType next_job_type_; 1542 CompletionCallback callback_; 1543 }; 1544 1545 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { 1546 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1547 1548 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1549 ClientSocketHandle handle; 1550 RequestSocketCallback callback( 1551 &handle, pool_.get(), connect_job_factory_, 1552 TestConnectJob::kMockPendingJob); 1553 int rv = handle.Init("a", 1554 params_, 1555 DEFAULT_PRIORITY, 1556 callback.callback(), 1557 pool_.get(), 1558 BoundNetLog()); 1559 ASSERT_EQ(ERR_IO_PENDING, rv); 1560 1561 EXPECT_EQ(OK, callback.WaitForResult()); 1562 } 1563 1564 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { 1565 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1566 1567 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1568 ClientSocketHandle handle; 1569 RequestSocketCallback callback( 1570 &handle, pool_.get(), connect_job_factory_, TestConnectJob::kMockJob); 1571 int rv = handle.Init("a", 1572 params_, 1573 DEFAULT_PRIORITY, 1574 callback.callback(), 1575 pool_.get(), 1576 BoundNetLog()); 1577 ASSERT_EQ(ERR_IO_PENDING, rv); 1578 1579 EXPECT_EQ(OK, callback.WaitForResult()); 1580 } 1581 1582 // Make sure that pending requests get serviced after active requests get 1583 // cancelled. 1584 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { 1585 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1586 1587 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1588 1589 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 1590 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 1591 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 1592 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 1593 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 1594 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 1595 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 1596 1597 // Now, kDefaultMaxSocketsPerGroup requests should be active. 1598 // Let's cancel them. 1599 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) { 1600 ASSERT_FALSE(request(i)->handle()->is_initialized()); 1601 request(i)->handle()->Reset(); 1602 } 1603 1604 // Let's wait for the rest to complete now. 1605 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) { 1606 EXPECT_EQ(OK, request(i)->WaitForResult()); 1607 request(i)->handle()->Reset(); 1608 } 1609 1610 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, 1611 completion_count()); 1612 } 1613 1614 // Make sure that pending requests get serviced after active requests fail. 1615 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { 1616 const size_t kMaxSockets = 5; 1617 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); 1618 1619 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1620 1621 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; 1622 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang. 1623 1624 // Queue up all the requests 1625 for (size_t i = 0; i < kNumberOfRequests; ++i) 1626 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 1627 1628 for (size_t i = 0; i < kNumberOfRequests; ++i) 1629 EXPECT_EQ(ERR_CONNECTION_FAILED, request(i)->WaitForResult()); 1630 } 1631 1632 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { 1633 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1634 1635 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1636 1637 ClientSocketHandle handle; 1638 TestCompletionCallback callback; 1639 int rv = handle.Init("a", 1640 params_, 1641 DEFAULT_PRIORITY, 1642 callback.callback(), 1643 pool_.get(), 1644 BoundNetLog()); 1645 EXPECT_EQ(ERR_IO_PENDING, rv); 1646 1647 // Cancel the active request. 1648 handle.Reset(); 1649 1650 rv = handle.Init("a", 1651 params_, 1652 DEFAULT_PRIORITY, 1653 callback.callback(), 1654 pool_.get(), 1655 BoundNetLog()); 1656 EXPECT_EQ(ERR_IO_PENDING, rv); 1657 EXPECT_EQ(OK, callback.WaitForResult()); 1658 1659 EXPECT_FALSE(handle.is_reused()); 1660 TestLoadTimingInfoConnectedNotReused(handle); 1661 EXPECT_EQ(2, client_socket_factory_.allocation_count()); 1662 } 1663 1664 // Regression test for http://crbug.com/17985. 1665 TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) { 1666 const int kMaxSockets = 3; 1667 const int kMaxSocketsPerGroup = 2; 1668 CreatePool(kMaxSockets, kMaxSocketsPerGroup); 1669 1670 const RequestPriority kHighPriority = HIGHEST; 1671 1672 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1673 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 1674 1675 // This is going to be a pending request in an otherwise empty group. 1676 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 1677 1678 // Reach the maximum socket limit. 1679 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); 1680 1681 // Create a stalled group with high priorities. 1682 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority)); 1683 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority)); 1684 1685 // Release the first two sockets from "a". Because this is a keepalive, 1686 // the first release will unblock the pending request for "a". The 1687 // second release will unblock a request for "c", becaue it is the next 1688 // high priority socket. 1689 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1690 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1691 1692 // Closing idle sockets should not get us into trouble, but in the bug 1693 // we were hitting a CHECK here. 1694 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 1695 pool_->CloseIdleSockets(); 1696 1697 // Run the released socket wakeups. 1698 base::MessageLoop::current()->RunUntilIdle(); 1699 } 1700 1701 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { 1702 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1703 1704 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1705 ClientSocketHandle handle; 1706 TestCompletionCallback callback; 1707 CapturingBoundNetLog log; 1708 int rv = handle.Init("a", 1709 params_, 1710 LOWEST, 1711 callback.callback(), 1712 pool_.get(), 1713 log.bound()); 1714 EXPECT_EQ(ERR_IO_PENDING, rv); 1715 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1716 TestLoadTimingInfoNotConnected(handle); 1717 1718 EXPECT_EQ(OK, callback.WaitForResult()); 1719 EXPECT_TRUE(handle.is_initialized()); 1720 EXPECT_TRUE(handle.socket()); 1721 TestLoadTimingInfoConnectedNotReused(handle); 1722 1723 handle.Reset(); 1724 TestLoadTimingInfoNotConnected(handle); 1725 1726 CapturingNetLog::CapturedEntryList entries; 1727 log.GetEntries(&entries); 1728 1729 EXPECT_EQ(4u, entries.size()); 1730 EXPECT_TRUE(LogContainsBeginEvent( 1731 entries, 0, NetLog::TYPE_SOCKET_POOL)); 1732 EXPECT_TRUE(LogContainsEvent( 1733 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 1734 NetLog::PHASE_NONE)); 1735 EXPECT_TRUE(LogContainsEvent( 1736 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, 1737 NetLog::PHASE_NONE)); 1738 EXPECT_TRUE(LogContainsEndEvent( 1739 entries, 3, NetLog::TYPE_SOCKET_POOL)); 1740 } 1741 1742 TEST_F(ClientSocketPoolBaseTest, 1743 InitConnectionAsynchronousFailure) { 1744 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1745 1746 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1747 ClientSocketHandle handle; 1748 TestCompletionCallback callback; 1749 CapturingBoundNetLog log; 1750 // Set the additional error state members to ensure that they get cleared. 1751 handle.set_is_ssl_error(true); 1752 HttpResponseInfo info; 1753 info.headers = new HttpResponseHeaders(std::string()); 1754 handle.set_ssl_error_response_info(info); 1755 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1756 params_, 1757 DEFAULT_PRIORITY, 1758 callback.callback(), 1759 pool_.get(), 1760 log.bound())); 1761 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1762 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 1763 EXPECT_FALSE(handle.is_ssl_error()); 1764 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); 1765 1766 CapturingNetLog::CapturedEntryList entries; 1767 log.GetEntries(&entries); 1768 1769 EXPECT_EQ(3u, entries.size()); 1770 EXPECT_TRUE(LogContainsBeginEvent( 1771 entries, 0, NetLog::TYPE_SOCKET_POOL)); 1772 EXPECT_TRUE(LogContainsEvent( 1773 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 1774 NetLog::PHASE_NONE)); 1775 EXPECT_TRUE(LogContainsEndEvent( 1776 entries, 2, NetLog::TYPE_SOCKET_POOL)); 1777 } 1778 1779 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { 1780 // TODO(eroman): Add back the log expectations! Removed them because the 1781 // ordering is difficult, and some may fire during destructor. 1782 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1783 1784 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1785 ClientSocketHandle handle; 1786 TestCompletionCallback callback; 1787 ClientSocketHandle handle2; 1788 TestCompletionCallback callback2; 1789 1790 EXPECT_EQ(ERR_IO_PENDING, 1791 handle.Init("a", 1792 params_, 1793 DEFAULT_PRIORITY, 1794 callback.callback(), 1795 pool_.get(), 1796 BoundNetLog())); 1797 CapturingBoundNetLog log2; 1798 EXPECT_EQ(ERR_IO_PENDING, 1799 handle2.Init("a", 1800 params_, 1801 DEFAULT_PRIORITY, 1802 callback2.callback(), 1803 pool_.get(), 1804 BoundNetLog())); 1805 1806 handle.Reset(); 1807 1808 1809 // At this point, request 2 is just waiting for the connect job to finish. 1810 1811 EXPECT_EQ(OK, callback2.WaitForResult()); 1812 handle2.Reset(); 1813 1814 // Now request 2 has actually finished. 1815 // TODO(eroman): Add back log expectations. 1816 } 1817 1818 TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) { 1819 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1820 1821 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1822 1823 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1824 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1825 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1826 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1827 1828 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1829 (*requests())[2]->handle()->Reset(); 1830 (*requests())[3]->handle()->Reset(); 1831 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1832 1833 (*requests())[1]->handle()->Reset(); 1834 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1835 1836 (*requests())[0]->handle()->Reset(); 1837 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1838 } 1839 1840 // When requests and ConnectJobs are not coupled, the request will get serviced 1841 // by whatever comes first. 1842 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) { 1843 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1844 1845 // Start job 1 (async OK) 1846 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1847 1848 std::vector<TestSocketRequest*> request_order; 1849 size_t completion_count; // unused 1850 TestSocketRequest req1(&request_order, &completion_count); 1851 int rv = req1.handle()->Init("a", 1852 params_, 1853 DEFAULT_PRIORITY, 1854 req1.callback(), pool_.get(), 1855 BoundNetLog()); 1856 EXPECT_EQ(ERR_IO_PENDING, rv); 1857 EXPECT_EQ(OK, req1.WaitForResult()); 1858 1859 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending 1860 // without a job. 1861 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1862 1863 TestSocketRequest req2(&request_order, &completion_count); 1864 rv = req2.handle()->Init("a", 1865 params_, 1866 DEFAULT_PRIORITY, 1867 req2.callback(), 1868 pool_.get(), 1869 BoundNetLog()); 1870 EXPECT_EQ(ERR_IO_PENDING, rv); 1871 TestSocketRequest req3(&request_order, &completion_count); 1872 rv = req3.handle()->Init("a", 1873 params_, 1874 DEFAULT_PRIORITY, 1875 req3.callback(), 1876 pool_.get(), 1877 BoundNetLog()); 1878 EXPECT_EQ(ERR_IO_PENDING, rv); 1879 1880 // Both Requests 2 and 3 are pending. We release socket 1 which should 1881 // service request 2. Request 3 should still be waiting. 1882 req1.handle()->Reset(); 1883 // Run the released socket wakeups. 1884 base::MessageLoop::current()->RunUntilIdle(); 1885 ASSERT_TRUE(req2.handle()->socket()); 1886 EXPECT_EQ(OK, req2.WaitForResult()); 1887 EXPECT_FALSE(req3.handle()->socket()); 1888 1889 // Signal job 2, which should service request 3. 1890 1891 client_socket_factory_.SignalJobs(); 1892 EXPECT_EQ(OK, req3.WaitForResult()); 1893 1894 ASSERT_EQ(3U, request_order.size()); 1895 EXPECT_EQ(&req1, request_order[0]); 1896 EXPECT_EQ(&req2, request_order[1]); 1897 EXPECT_EQ(&req3, request_order[2]); 1898 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 1899 } 1900 1901 // The requests are not coupled to the jobs. So, the requests should finish in 1902 // their priority / insertion order. 1903 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { 1904 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1905 // First two jobs are async. 1906 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1907 1908 std::vector<TestSocketRequest*> request_order; 1909 size_t completion_count; // unused 1910 TestSocketRequest req1(&request_order, &completion_count); 1911 int rv = req1.handle()->Init("a", 1912 params_, 1913 DEFAULT_PRIORITY, 1914 req1.callback(), 1915 pool_.get(), 1916 BoundNetLog()); 1917 EXPECT_EQ(ERR_IO_PENDING, rv); 1918 1919 TestSocketRequest req2(&request_order, &completion_count); 1920 rv = req2.handle()->Init("a", 1921 params_, 1922 DEFAULT_PRIORITY, 1923 req2.callback(), 1924 pool_.get(), 1925 BoundNetLog()); 1926 EXPECT_EQ(ERR_IO_PENDING, rv); 1927 1928 // The pending job is sync. 1929 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1930 1931 TestSocketRequest req3(&request_order, &completion_count); 1932 rv = req3.handle()->Init("a", 1933 params_, 1934 DEFAULT_PRIORITY, 1935 req3.callback(), 1936 pool_.get(), 1937 BoundNetLog()); 1938 EXPECT_EQ(ERR_IO_PENDING, rv); 1939 1940 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); 1941 EXPECT_EQ(OK, req2.WaitForResult()); 1942 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); 1943 1944 ASSERT_EQ(3U, request_order.size()); 1945 EXPECT_EQ(&req1, request_order[0]); 1946 EXPECT_EQ(&req2, request_order[1]); 1947 EXPECT_EQ(&req3, request_order[2]); 1948 } 1949 1950 // Test GetLoadState in the case there's only one socket request. 1951 TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) { 1952 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1953 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1954 1955 ClientSocketHandle handle; 1956 TestCompletionCallback callback; 1957 int rv = handle.Init("a", 1958 params_, 1959 DEFAULT_PRIORITY, 1960 callback.callback(), 1961 pool_.get(), 1962 BoundNetLog()); 1963 EXPECT_EQ(ERR_IO_PENDING, rv); 1964 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); 1965 1966 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); 1967 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); 1968 1969 // No point in completing the connection, since ClientSocketHandles only 1970 // expect the LoadState to be checked while connecting. 1971 } 1972 1973 // Test GetLoadState in the case there are two socket requests. 1974 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) { 1975 CreatePool(2, 2); 1976 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1977 1978 ClientSocketHandle handle; 1979 TestCompletionCallback callback; 1980 int rv = handle.Init("a", 1981 params_, 1982 DEFAULT_PRIORITY, 1983 callback.callback(), 1984 pool_.get(), 1985 BoundNetLog()); 1986 EXPECT_EQ(ERR_IO_PENDING, rv); 1987 1988 ClientSocketHandle handle2; 1989 TestCompletionCallback callback2; 1990 rv = handle2.Init("a", 1991 params_, 1992 DEFAULT_PRIORITY, 1993 callback2.callback(), 1994 pool_.get(), 1995 BoundNetLog()); 1996 EXPECT_EQ(ERR_IO_PENDING, rv); 1997 1998 // If the first Job is in an earlier state than the second, the state of 1999 // the second job should be used for both handles. 2000 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST); 2001 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); 2002 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); 2003 2004 // If the second Job is in an earlier state than the second, the state of 2005 // the first job should be used for both handles. 2006 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); 2007 // One request is farther 2008 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); 2009 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); 2010 2011 // Farthest along job connects and the first request gets the socket. The 2012 // second handle switches to the state of the remaining ConnectJob. 2013 client_socket_factory_.SignalJob(0); 2014 EXPECT_EQ(OK, callback.WaitForResult()); 2015 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); 2016 } 2017 2018 // Test GetLoadState in the case the per-group limit is reached. 2019 TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) { 2020 CreatePool(2, 1); 2021 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2022 2023 ClientSocketHandle handle; 2024 TestCompletionCallback callback; 2025 int rv = handle.Init("a", 2026 params_, 2027 MEDIUM, 2028 callback.callback(), 2029 pool_.get(), 2030 BoundNetLog()); 2031 EXPECT_EQ(ERR_IO_PENDING, rv); 2032 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); 2033 2034 // Request another socket from the same pool, buth with a higher priority. 2035 // The first request should now be stalled at the socket group limit. 2036 ClientSocketHandle handle2; 2037 TestCompletionCallback callback2; 2038 rv = handle2.Init("a", 2039 params_, 2040 HIGHEST, 2041 callback2.callback(), 2042 pool_.get(), 2043 BoundNetLog()); 2044 EXPECT_EQ(ERR_IO_PENDING, rv); 2045 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); 2046 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); 2047 2048 // The first handle should remain stalled as the other socket goes through 2049 // the connect process. 2050 2051 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); 2052 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); 2053 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); 2054 2055 client_socket_factory_.SignalJob(0); 2056 EXPECT_EQ(OK, callback2.WaitForResult()); 2057 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); 2058 2059 // Closing the second socket should cause the stalled handle to finally get a 2060 // ConnectJob. 2061 handle2.socket()->Disconnect(); 2062 handle2.Reset(); 2063 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); 2064 } 2065 2066 // Test GetLoadState in the case the per-pool limit is reached. 2067 TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) { 2068 CreatePool(2, 2); 2069 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2070 2071 ClientSocketHandle handle; 2072 TestCompletionCallback callback; 2073 int rv = handle.Init("a", 2074 params_, 2075 DEFAULT_PRIORITY, 2076 callback.callback(), 2077 pool_.get(), 2078 BoundNetLog()); 2079 EXPECT_EQ(ERR_IO_PENDING, rv); 2080 2081 // Request for socket from another pool. 2082 ClientSocketHandle handle2; 2083 TestCompletionCallback callback2; 2084 rv = handle2.Init("b", 2085 params_, 2086 DEFAULT_PRIORITY, 2087 callback2.callback(), 2088 pool_.get(), 2089 BoundNetLog()); 2090 EXPECT_EQ(ERR_IO_PENDING, rv); 2091 2092 // Request another socket from the first pool. Request should stall at the 2093 // socket pool limit. 2094 ClientSocketHandle handle3; 2095 TestCompletionCallback callback3; 2096 rv = handle3.Init("a", 2097 params_, 2098 DEFAULT_PRIORITY, 2099 callback2.callback(), 2100 pool_.get(), 2101 BoundNetLog()); 2102 EXPECT_EQ(ERR_IO_PENDING, rv); 2103 2104 // The third handle should remain stalled as the other sockets in its group 2105 // goes through the connect process. 2106 2107 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); 2108 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); 2109 2110 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); 2111 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); 2112 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); 2113 2114 client_socket_factory_.SignalJob(0); 2115 EXPECT_EQ(OK, callback.WaitForResult()); 2116 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); 2117 2118 // Closing a socket should allow the stalled handle to finally get a new 2119 // ConnectJob. 2120 handle.socket()->Disconnect(); 2121 handle.Reset(); 2122 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState()); 2123 } 2124 2125 TEST_F(ClientSocketPoolBaseTest, Recoverable) { 2126 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2127 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob); 2128 2129 ClientSocketHandle handle; 2130 TestCompletionCallback callback; 2131 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, 2132 handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(), 2133 pool_.get(), BoundNetLog())); 2134 EXPECT_TRUE(handle.is_initialized()); 2135 EXPECT_TRUE(handle.socket()); 2136 } 2137 2138 TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) { 2139 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2140 2141 connect_job_factory_->set_job_type( 2142 TestConnectJob::kMockPendingRecoverableJob); 2143 ClientSocketHandle handle; 2144 TestCompletionCallback callback; 2145 EXPECT_EQ(ERR_IO_PENDING, 2146 handle.Init("a", 2147 params_, 2148 DEFAULT_PRIORITY, 2149 callback.callback(), 2150 pool_.get(), 2151 BoundNetLog())); 2152 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 2153 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); 2154 EXPECT_TRUE(handle.is_initialized()); 2155 EXPECT_TRUE(handle.socket()); 2156 } 2157 2158 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) { 2159 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2160 connect_job_factory_->set_job_type( 2161 TestConnectJob::kMockAdditionalErrorStateJob); 2162 2163 ClientSocketHandle handle; 2164 TestCompletionCallback callback; 2165 EXPECT_EQ(ERR_CONNECTION_FAILED, 2166 handle.Init("a", 2167 params_, 2168 DEFAULT_PRIORITY, 2169 callback.callback(), 2170 pool_.get(), 2171 BoundNetLog())); 2172 EXPECT_FALSE(handle.is_initialized()); 2173 EXPECT_FALSE(handle.socket()); 2174 EXPECT_TRUE(handle.is_ssl_error()); 2175 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); 2176 } 2177 2178 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) { 2179 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2180 2181 connect_job_factory_->set_job_type( 2182 TestConnectJob::kMockPendingAdditionalErrorStateJob); 2183 ClientSocketHandle handle; 2184 TestCompletionCallback callback; 2185 EXPECT_EQ(ERR_IO_PENDING, 2186 handle.Init("a", 2187 params_, 2188 DEFAULT_PRIORITY, 2189 callback.callback(), 2190 pool_.get(), 2191 BoundNetLog())); 2192 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 2193 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 2194 EXPECT_FALSE(handle.is_initialized()); 2195 EXPECT_FALSE(handle.socket()); 2196 EXPECT_TRUE(handle.is_ssl_error()); 2197 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); 2198 } 2199 2200 // Make sure we can reuse sockets when the cleanup timer is disabled. 2201 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerReuse) { 2202 // Disable cleanup timer. 2203 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); 2204 2205 CreatePoolWithIdleTimeouts( 2206 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 2207 base::TimeDelta(), // Time out unused sockets immediately. 2208 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 2209 2210 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2211 2212 ClientSocketHandle handle; 2213 TestCompletionCallback callback; 2214 int rv = handle.Init("a", 2215 params_, 2216 LOWEST, 2217 callback.callback(), 2218 pool_.get(), 2219 BoundNetLog()); 2220 ASSERT_EQ(ERR_IO_PENDING, rv); 2221 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 2222 ASSERT_EQ(OK, callback.WaitForResult()); 2223 2224 // Use and release the socket. 2225 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback())); 2226 TestLoadTimingInfoConnectedNotReused(handle); 2227 handle.Reset(); 2228 2229 // Should now have one idle socket. 2230 ASSERT_EQ(1, pool_->IdleSocketCount()); 2231 2232 // Request a new socket. This should reuse the old socket and complete 2233 // synchronously. 2234 CapturingBoundNetLog log; 2235 rv = handle.Init("a", 2236 params_, 2237 LOWEST, 2238 CompletionCallback(), 2239 pool_.get(), 2240 log.bound()); 2241 ASSERT_EQ(OK, rv); 2242 EXPECT_TRUE(handle.is_reused()); 2243 TestLoadTimingInfoConnectedReused(handle); 2244 2245 ASSERT_TRUE(pool_->HasGroup("a")); 2246 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2247 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 2248 2249 CapturingNetLog::CapturedEntryList entries; 2250 log.GetEntries(&entries); 2251 EXPECT_TRUE(LogContainsEntryWithType( 2252 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); 2253 } 2254 2255 // Make sure we cleanup old unused sockets when the cleanup timer is disabled. 2256 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerNoReuse) { 2257 // Disable cleanup timer. 2258 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); 2259 2260 CreatePoolWithIdleTimeouts( 2261 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 2262 base::TimeDelta(), // Time out unused sockets immediately 2263 base::TimeDelta()); // Time out used sockets immediately 2264 2265 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2266 2267 // Startup two mock pending connect jobs, which will sit in the MessageLoop. 2268 2269 ClientSocketHandle handle; 2270 TestCompletionCallback callback; 2271 int rv = handle.Init("a", 2272 params_, 2273 LOWEST, 2274 callback.callback(), 2275 pool_.get(), 2276 BoundNetLog()); 2277 ASSERT_EQ(ERR_IO_PENDING, rv); 2278 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 2279 2280 ClientSocketHandle handle2; 2281 TestCompletionCallback callback2; 2282 rv = handle2.Init("a", 2283 params_, 2284 LOWEST, 2285 callback2.callback(), 2286 pool_.get(), 2287 BoundNetLog()); 2288 ASSERT_EQ(ERR_IO_PENDING, rv); 2289 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); 2290 2291 // Cancel one of the requests. Wait for the other, which will get the first 2292 // job. Release the socket. Run the loop again to make sure the second 2293 // socket is sitting idle and the first one is released (since ReleaseSocket() 2294 // just posts a DoReleaseSocket() task). 2295 2296 handle.Reset(); 2297 ASSERT_EQ(OK, callback2.WaitForResult()); 2298 // Use the socket. 2299 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); 2300 handle2.Reset(); 2301 2302 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 2303 // actually become pending until 2ms after they have been created. In order 2304 // to flush all tasks, we need to wait so that we know there are no 2305 // soon-to-be-pending tasks waiting. 2306 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); 2307 base::MessageLoop::current()->RunUntilIdle(); 2308 2309 // Both sockets should now be idle. 2310 ASSERT_EQ(2, pool_->IdleSocketCount()); 2311 2312 // Request a new socket. This should cleanup the unused and timed out ones. 2313 // A new socket will be created rather than reusing the idle one. 2314 CapturingBoundNetLog log; 2315 TestCompletionCallback callback3; 2316 rv = handle.Init("a", 2317 params_, 2318 LOWEST, 2319 callback3.callback(), 2320 pool_.get(), 2321 log.bound()); 2322 ASSERT_EQ(ERR_IO_PENDING, rv); 2323 ASSERT_EQ(OK, callback3.WaitForResult()); 2324 EXPECT_FALSE(handle.is_reused()); 2325 2326 // Make sure the idle socket is closed. 2327 ASSERT_TRUE(pool_->HasGroup("a")); 2328 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2329 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 2330 2331 CapturingNetLog::CapturedEntryList entries; 2332 log.GetEntries(&entries); 2333 EXPECT_FALSE(LogContainsEntryWithType( 2334 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); 2335 } 2336 2337 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSockets) { 2338 CreatePoolWithIdleTimeouts( 2339 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 2340 base::TimeDelta(), // Time out unused sockets immediately. 2341 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 2342 2343 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2344 2345 // Startup two mock pending connect jobs, which will sit in the MessageLoop. 2346 2347 ClientSocketHandle handle; 2348 TestCompletionCallback callback; 2349 int rv = handle.Init("a", 2350 params_, 2351 LOWEST, 2352 callback.callback(), 2353 pool_.get(), 2354 BoundNetLog()); 2355 EXPECT_EQ(ERR_IO_PENDING, rv); 2356 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 2357 2358 ClientSocketHandle handle2; 2359 TestCompletionCallback callback2; 2360 rv = handle2.Init("a", 2361 params_, 2362 LOWEST, 2363 callback2.callback(), 2364 pool_.get(), 2365 BoundNetLog()); 2366 EXPECT_EQ(ERR_IO_PENDING, rv); 2367 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); 2368 2369 // Cancel one of the requests. Wait for the other, which will get the first 2370 // job. Release the socket. Run the loop again to make sure the second 2371 // socket is sitting idle and the first one is released (since ReleaseSocket() 2372 // just posts a DoReleaseSocket() task). 2373 2374 handle.Reset(); 2375 EXPECT_EQ(OK, callback2.WaitForResult()); 2376 // Use the socket. 2377 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); 2378 handle2.Reset(); 2379 2380 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 2381 // actually become pending until 2ms after they have been created. In order 2382 // to flush all tasks, we need to wait so that we know there are no 2383 // soon-to-be-pending tasks waiting. 2384 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); 2385 base::MessageLoop::current()->RunUntilIdle(); 2386 2387 ASSERT_EQ(2, pool_->IdleSocketCount()); 2388 2389 // Invoke the idle socket cleanup check. Only one socket should be left, the 2390 // used socket. Request it to make sure that it's used. 2391 2392 pool_->CleanupTimedOutIdleSockets(); 2393 CapturingBoundNetLog log; 2394 rv = handle.Init("a", 2395 params_, 2396 LOWEST, 2397 callback.callback(), 2398 pool_.get(), 2399 log.bound()); 2400 EXPECT_EQ(OK, rv); 2401 EXPECT_TRUE(handle.is_reused()); 2402 2403 CapturingNetLog::CapturedEntryList entries; 2404 log.GetEntries(&entries); 2405 EXPECT_TRUE(LogContainsEntryWithType( 2406 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); 2407 } 2408 2409 // Make sure that we process all pending requests even when we're stalling 2410 // because of multiple releasing disconnected sockets. 2411 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) { 2412 CreatePoolWithIdleTimeouts( 2413 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 2414 base::TimeDelta(), // Time out unused sockets immediately. 2415 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 2416 2417 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2418 2419 // Startup 4 connect jobs. Two of them will be pending. 2420 2421 ClientSocketHandle handle; 2422 TestCompletionCallback callback; 2423 int rv = handle.Init("a", 2424 params_, 2425 LOWEST, 2426 callback.callback(), 2427 pool_.get(), 2428 BoundNetLog()); 2429 EXPECT_EQ(OK, rv); 2430 2431 ClientSocketHandle handle2; 2432 TestCompletionCallback callback2; 2433 rv = handle2.Init("a", 2434 params_, 2435 LOWEST, 2436 callback2.callback(), 2437 pool_.get(), 2438 BoundNetLog()); 2439 EXPECT_EQ(OK, rv); 2440 2441 ClientSocketHandle handle3; 2442 TestCompletionCallback callback3; 2443 rv = handle3.Init("a", 2444 params_, 2445 LOWEST, 2446 callback3.callback(), 2447 pool_.get(), 2448 BoundNetLog()); 2449 EXPECT_EQ(ERR_IO_PENDING, rv); 2450 2451 ClientSocketHandle handle4; 2452 TestCompletionCallback callback4; 2453 rv = handle4.Init("a", 2454 params_, 2455 LOWEST, 2456 callback4.callback(), 2457 pool_.get(), 2458 BoundNetLog()); 2459 EXPECT_EQ(ERR_IO_PENDING, rv); 2460 2461 // Release two disconnected sockets. 2462 2463 handle.socket()->Disconnect(); 2464 handle.Reset(); 2465 handle2.socket()->Disconnect(); 2466 handle2.Reset(); 2467 2468 EXPECT_EQ(OK, callback3.WaitForResult()); 2469 EXPECT_FALSE(handle3.is_reused()); 2470 EXPECT_EQ(OK, callback4.WaitForResult()); 2471 EXPECT_FALSE(handle4.is_reused()); 2472 } 2473 2474 // Regression test for http://crbug.com/42267. 2475 // When DoReleaseSocket() is processed for one socket, it is blocked because the 2476 // other stalled groups all have releasing sockets, so no progress can be made. 2477 TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) { 2478 CreatePoolWithIdleTimeouts( 2479 4 /* socket limit */, 4 /* socket limit per group */, 2480 base::TimeDelta(), // Time out unused sockets immediately. 2481 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 2482 2483 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2484 2485 // Max out the socket limit with 2 per group. 2486 2487 ClientSocketHandle handle_a[4]; 2488 TestCompletionCallback callback_a[4]; 2489 ClientSocketHandle handle_b[4]; 2490 TestCompletionCallback callback_b[4]; 2491 2492 for (int i = 0; i < 2; ++i) { 2493 EXPECT_EQ(OK, handle_a[i].Init("a", 2494 params_, 2495 LOWEST, 2496 callback_a[i].callback(), 2497 pool_.get(), 2498 BoundNetLog())); 2499 EXPECT_EQ(OK, handle_b[i].Init("b", 2500 params_, 2501 LOWEST, 2502 callback_b[i].callback(), 2503 pool_.get(), 2504 BoundNetLog())); 2505 } 2506 2507 // Make 4 pending requests, 2 per group. 2508 2509 for (int i = 2; i < 4; ++i) { 2510 EXPECT_EQ(ERR_IO_PENDING, 2511 handle_a[i].Init("a", 2512 params_, 2513 LOWEST, 2514 callback_a[i].callback(), 2515 pool_.get(), 2516 BoundNetLog())); 2517 EXPECT_EQ(ERR_IO_PENDING, 2518 handle_b[i].Init("b", 2519 params_, 2520 LOWEST, 2521 callback_b[i].callback(), 2522 pool_.get(), 2523 BoundNetLog())); 2524 } 2525 2526 // Release b's socket first. The order is important, because in 2527 // DoReleaseSocket(), we'll process b's released socket, and since both b and 2528 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a' 2529 // first, which has a releasing socket, so it refuses to start up another 2530 // ConnectJob. So, we used to infinite loop on this. 2531 handle_b[0].socket()->Disconnect(); 2532 handle_b[0].Reset(); 2533 handle_a[0].socket()->Disconnect(); 2534 handle_a[0].Reset(); 2535 2536 // Used to get stuck here. 2537 base::MessageLoop::current()->RunUntilIdle(); 2538 2539 handle_b[1].socket()->Disconnect(); 2540 handle_b[1].Reset(); 2541 handle_a[1].socket()->Disconnect(); 2542 handle_a[1].Reset(); 2543 2544 for (int i = 2; i < 4; ++i) { 2545 EXPECT_EQ(OK, callback_b[i].WaitForResult()); 2546 EXPECT_EQ(OK, callback_a[i].WaitForResult()); 2547 } 2548 } 2549 2550 TEST_F(ClientSocketPoolBaseTest, 2551 ReleasingDisconnectedSocketsMaintainsPriorityOrder) { 2552 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2553 2554 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2555 2556 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 2557 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 2558 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 2559 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", DEFAULT_PRIORITY)); 2560 2561 EXPECT_EQ(OK, (*requests())[0]->WaitForResult()); 2562 EXPECT_EQ(OK, (*requests())[1]->WaitForResult()); 2563 EXPECT_EQ(2u, completion_count()); 2564 2565 // Releases one connection. 2566 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE)); 2567 EXPECT_EQ(OK, (*requests())[2]->WaitForResult()); 2568 2569 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE)); 2570 EXPECT_EQ(OK, (*requests())[3]->WaitForResult()); 2571 EXPECT_EQ(4u, completion_count()); 2572 2573 EXPECT_EQ(1, GetOrderOfRequest(1)); 2574 EXPECT_EQ(2, GetOrderOfRequest(2)); 2575 EXPECT_EQ(3, GetOrderOfRequest(3)); 2576 EXPECT_EQ(4, GetOrderOfRequest(4)); 2577 2578 // Make sure we test order of all requests made. 2579 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5)); 2580 } 2581 2582 class TestReleasingSocketRequest : public TestCompletionCallbackBase { 2583 public: 2584 TestReleasingSocketRequest(TestClientSocketPool* pool, 2585 int expected_result, 2586 bool reset_releasing_handle) 2587 : pool_(pool), 2588 expected_result_(expected_result), 2589 reset_releasing_handle_(reset_releasing_handle), 2590 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete, 2591 base::Unretained(this))) { 2592 } 2593 2594 virtual ~TestReleasingSocketRequest() {} 2595 2596 ClientSocketHandle* handle() { return &handle_; } 2597 2598 const CompletionCallback& callback() const { return callback_; } 2599 2600 private: 2601 void OnComplete(int result) { 2602 SetResult(result); 2603 if (reset_releasing_handle_) 2604 handle_.Reset(); 2605 2606 scoped_refptr<TestSocketParams> con_params( 2607 new TestSocketParams(false /* ignore_limits */)); 2608 EXPECT_EQ(expected_result_, 2609 handle2_.Init("a", con_params, DEFAULT_PRIORITY, 2610 callback2_.callback(), pool_, BoundNetLog())); 2611 } 2612 2613 TestClientSocketPool* const pool_; 2614 int expected_result_; 2615 bool reset_releasing_handle_; 2616 ClientSocketHandle handle_; 2617 ClientSocketHandle handle2_; 2618 CompletionCallback callback_; 2619 TestCompletionCallback callback2_; 2620 }; 2621 2622 2623 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) { 2624 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2625 2626 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); 2627 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); 2628 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); 2629 2630 EXPECT_EQ(static_cast<int>(requests_size()), 2631 client_socket_factory_.allocation_count()); 2632 2633 connect_job_factory_->set_job_type( 2634 TestConnectJob::kMockPendingAdditionalErrorStateJob); 2635 TestReleasingSocketRequest req(pool_.get(), OK, false); 2636 EXPECT_EQ(ERR_IO_PENDING, 2637 req.handle()->Init("a", params_, DEFAULT_PRIORITY, req.callback(), 2638 pool_.get(), BoundNetLog())); 2639 // The next job should complete synchronously 2640 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2641 2642 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); 2643 EXPECT_FALSE(req.handle()->is_initialized()); 2644 EXPECT_FALSE(req.handle()->socket()); 2645 EXPECT_TRUE(req.handle()->is_ssl_error()); 2646 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL); 2647 } 2648 2649 // http://crbug.com/44724 regression test. 2650 // We start releasing the pool when we flush on network change. When that 2651 // happens, the only active references are in the ClientSocketHandles. When a 2652 // ConnectJob completes and calls back into the last ClientSocketHandle, that 2653 // callback can release the last reference and delete the pool. After the 2654 // callback finishes, we go back to the stack frame within the now-deleted pool. 2655 // Executing any code that refers to members of the now-deleted pool can cause 2656 // crashes. 2657 TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) { 2658 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2659 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 2660 2661 ClientSocketHandle handle; 2662 TestCompletionCallback callback; 2663 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2664 params_, 2665 DEFAULT_PRIORITY, 2666 callback.callback(), 2667 pool_.get(), 2668 BoundNetLog())); 2669 2670 pool_->FlushWithError(ERR_NETWORK_CHANGED); 2671 2672 // We'll call back into this now. 2673 callback.WaitForResult(); 2674 } 2675 2676 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) { 2677 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2678 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2679 2680 ClientSocketHandle handle; 2681 TestCompletionCallback callback; 2682 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2683 params_, 2684 DEFAULT_PRIORITY, 2685 callback.callback(), 2686 pool_.get(), 2687 BoundNetLog())); 2688 EXPECT_EQ(OK, callback.WaitForResult()); 2689 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); 2690 2691 pool_->FlushWithError(ERR_NETWORK_CHANGED); 2692 2693 handle.Reset(); 2694 base::MessageLoop::current()->RunUntilIdle(); 2695 2696 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2697 params_, 2698 DEFAULT_PRIORITY, 2699 callback.callback(), 2700 pool_.get(), 2701 BoundNetLog())); 2702 EXPECT_EQ(OK, callback.WaitForResult()); 2703 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); 2704 } 2705 2706 class ConnectWithinCallback : public TestCompletionCallbackBase { 2707 public: 2708 ConnectWithinCallback( 2709 const std::string& group_name, 2710 const scoped_refptr<TestSocketParams>& params, 2711 TestClientSocketPool* pool) 2712 : group_name_(group_name), 2713 params_(params), 2714 pool_(pool), 2715 callback_(base::Bind(&ConnectWithinCallback::OnComplete, 2716 base::Unretained(this))) { 2717 } 2718 2719 virtual ~ConnectWithinCallback() {} 2720 2721 int WaitForNestedResult() { 2722 return nested_callback_.WaitForResult(); 2723 } 2724 2725 const CompletionCallback& callback() const { return callback_; } 2726 2727 private: 2728 void OnComplete(int result) { 2729 SetResult(result); 2730 EXPECT_EQ(ERR_IO_PENDING, 2731 handle_.Init(group_name_, 2732 params_, 2733 DEFAULT_PRIORITY, 2734 nested_callback_.callback(), 2735 pool_, 2736 BoundNetLog())); 2737 } 2738 2739 const std::string group_name_; 2740 const scoped_refptr<TestSocketParams> params_; 2741 TestClientSocketPool* const pool_; 2742 ClientSocketHandle handle_; 2743 CompletionCallback callback_; 2744 TestCompletionCallback nested_callback_; 2745 2746 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback); 2747 }; 2748 2749 TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) { 2750 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2751 2752 // First job will be waiting until it gets aborted. 2753 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2754 2755 ClientSocketHandle handle; 2756 ConnectWithinCallback callback("a", params_, pool_.get()); 2757 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2758 params_, 2759 DEFAULT_PRIORITY, 2760 callback.callback(), 2761 pool_.get(), 2762 BoundNetLog())); 2763 2764 // Second job will be started during the first callback, and will 2765 // asynchronously complete with OK. 2766 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2767 pool_->FlushWithError(ERR_NETWORK_CHANGED); 2768 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult()); 2769 EXPECT_EQ(OK, callback.WaitForNestedResult()); 2770 } 2771 2772 // Cancel a pending socket request while we're at max sockets, 2773 // and verify that the backup socket firing doesn't cause a crash. 2774 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) { 2775 // Max 4 sockets globally, max 4 sockets per group. 2776 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2777 pool_->EnableConnectBackupJobs(); 2778 2779 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2780 // timer. 2781 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2782 ClientSocketHandle handle; 2783 TestCompletionCallback callback; 2784 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2785 params_, 2786 DEFAULT_PRIORITY, 2787 callback.callback(), 2788 pool_.get(), 2789 BoundNetLog())); 2790 2791 // Start (MaxSockets - 1) connected sockets to reach max sockets. 2792 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2793 ClientSocketHandle handles[kDefaultMaxSockets]; 2794 for (int i = 1; i < kDefaultMaxSockets; ++i) { 2795 TestCompletionCallback callback; 2796 EXPECT_EQ(OK, handles[i].Init("bar", 2797 params_, 2798 DEFAULT_PRIORITY, 2799 callback.callback(), 2800 pool_.get(), 2801 BoundNetLog())); 2802 } 2803 2804 base::MessageLoop::current()->RunUntilIdle(); 2805 2806 // Cancel the pending request. 2807 handle.Reset(); 2808 2809 // Wait for the backup timer to fire (add some slop to ensure it fires) 2810 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( 2811 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); 2812 2813 base::MessageLoop::current()->RunUntilIdle(); 2814 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 2815 } 2816 2817 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) { 2818 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2819 pool_->EnableConnectBackupJobs(); 2820 2821 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2822 // timer. 2823 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2824 ClientSocketHandle handle; 2825 TestCompletionCallback callback; 2826 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2827 params_, 2828 DEFAULT_PRIORITY, 2829 callback.callback(), 2830 pool_.get(), 2831 BoundNetLog())); 2832 ASSERT_TRUE(pool_->HasGroup("bar")); 2833 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); 2834 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar")); 2835 2836 // Cancel the socket request. This should cancel the backup timer. Wait for 2837 // the backup time to see if it indeed got canceled. 2838 handle.Reset(); 2839 // Wait for the backup timer to fire (add some slop to ensure it fires) 2840 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( 2841 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); 2842 base::MessageLoop::current()->RunUntilIdle(); 2843 ASSERT_TRUE(pool_->HasGroup("bar")); 2844 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); 2845 } 2846 2847 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) { 2848 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2849 pool_->EnableConnectBackupJobs(); 2850 2851 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2852 // timer. 2853 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2854 ClientSocketHandle handle; 2855 TestCompletionCallback callback; 2856 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2857 params_, 2858 DEFAULT_PRIORITY, 2859 callback.callback(), 2860 pool_.get(), 2861 BoundNetLog())); 2862 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2863 ClientSocketHandle handle2; 2864 TestCompletionCallback callback2; 2865 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("bar", 2866 params_, 2867 DEFAULT_PRIORITY, 2868 callback2.callback(), 2869 pool_.get(), 2870 BoundNetLog())); 2871 ASSERT_TRUE(pool_->HasGroup("bar")); 2872 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); 2873 2874 // Cancel request 1 and then complete request 2. With the requests finished, 2875 // the backup timer should be cancelled. 2876 handle.Reset(); 2877 EXPECT_EQ(OK, callback2.WaitForResult()); 2878 // Wait for the backup timer to fire (add some slop to ensure it fires) 2879 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( 2880 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); 2881 base::MessageLoop::current()->RunUntilIdle(); 2882 } 2883 2884 // Test delayed socket binding for the case where we have two connects, 2885 // and while one is waiting on a connect, the other frees up. 2886 // The socket waiting on a connect should switch immediately to the freed 2887 // up socket. 2888 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) { 2889 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2890 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2891 2892 ClientSocketHandle handle1; 2893 TestCompletionCallback callback; 2894 EXPECT_EQ(ERR_IO_PENDING, 2895 handle1.Init("a", 2896 params_, 2897 DEFAULT_PRIORITY, 2898 callback.callback(), 2899 pool_.get(), 2900 BoundNetLog())); 2901 EXPECT_EQ(OK, callback.WaitForResult()); 2902 2903 // No idle sockets, no pending jobs. 2904 EXPECT_EQ(0, pool_->IdleSocketCount()); 2905 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2906 2907 // Create a second socket to the same host, but this one will wait. 2908 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2909 ClientSocketHandle handle2; 2910 EXPECT_EQ(ERR_IO_PENDING, 2911 handle2.Init("a", 2912 params_, 2913 DEFAULT_PRIORITY, 2914 callback.callback(), 2915 pool_.get(), 2916 BoundNetLog())); 2917 // No idle sockets, and one connecting job. 2918 EXPECT_EQ(0, pool_->IdleSocketCount()); 2919 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2920 2921 // Return the first handle to the pool. This will initiate the delayed 2922 // binding. 2923 handle1.Reset(); 2924 2925 base::MessageLoop::current()->RunUntilIdle(); 2926 2927 // Still no idle sockets, still one pending connect job. 2928 EXPECT_EQ(0, pool_->IdleSocketCount()); 2929 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2930 2931 // The second socket connected, even though it was a Waiting Job. 2932 EXPECT_EQ(OK, callback.WaitForResult()); 2933 2934 // And we can see there is still one job waiting. 2935 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2936 2937 // Finally, signal the waiting Connect. 2938 client_socket_factory_.SignalJobs(); 2939 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2940 2941 base::MessageLoop::current()->RunUntilIdle(); 2942 } 2943 2944 // Test delayed socket binding when a group is at capacity and one 2945 // of the group's sockets frees up. 2946 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) { 2947 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2948 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2949 2950 ClientSocketHandle handle1; 2951 TestCompletionCallback callback; 2952 EXPECT_EQ(ERR_IO_PENDING, 2953 handle1.Init("a", 2954 params_, 2955 DEFAULT_PRIORITY, 2956 callback.callback(), 2957 pool_.get(), 2958 BoundNetLog())); 2959 EXPECT_EQ(OK, callback.WaitForResult()); 2960 2961 // No idle sockets, no pending jobs. 2962 EXPECT_EQ(0, pool_->IdleSocketCount()); 2963 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2964 2965 // Create a second socket to the same host, but this one will wait. 2966 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2967 ClientSocketHandle handle2; 2968 EXPECT_EQ(ERR_IO_PENDING, 2969 handle2.Init("a", 2970 params_, 2971 DEFAULT_PRIORITY, 2972 callback.callback(), 2973 pool_.get(), 2974 BoundNetLog())); 2975 // No idle sockets, and one connecting job. 2976 EXPECT_EQ(0, pool_->IdleSocketCount()); 2977 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2978 2979 // Return the first handle to the pool. This will initiate the delayed 2980 // binding. 2981 handle1.Reset(); 2982 2983 base::MessageLoop::current()->RunUntilIdle(); 2984 2985 // Still no idle sockets, still one pending connect job. 2986 EXPECT_EQ(0, pool_->IdleSocketCount()); 2987 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2988 2989 // The second socket connected, even though it was a Waiting Job. 2990 EXPECT_EQ(OK, callback.WaitForResult()); 2991 2992 // And we can see there is still one job waiting. 2993 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2994 2995 // Finally, signal the waiting Connect. 2996 client_socket_factory_.SignalJobs(); 2997 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2998 2999 base::MessageLoop::current()->RunUntilIdle(); 3000 } 3001 3002 // Test out the case where we have one socket connected, one 3003 // connecting, when the first socket finishes and goes idle. 3004 // Although the second connection is pending, the second request 3005 // should complete, by taking the first socket's idle socket. 3006 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) { 3007 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3008 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3009 3010 ClientSocketHandle handle1; 3011 TestCompletionCallback callback; 3012 EXPECT_EQ(ERR_IO_PENDING, 3013 handle1.Init("a", 3014 params_, 3015 DEFAULT_PRIORITY, 3016 callback.callback(), 3017 pool_.get(), 3018 BoundNetLog())); 3019 EXPECT_EQ(OK, callback.WaitForResult()); 3020 3021 // No idle sockets, no pending jobs. 3022 EXPECT_EQ(0, pool_->IdleSocketCount()); 3023 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3024 3025 // Create a second socket to the same host, but this one will wait. 3026 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 3027 ClientSocketHandle handle2; 3028 EXPECT_EQ(ERR_IO_PENDING, 3029 handle2.Init("a", 3030 params_, 3031 DEFAULT_PRIORITY, 3032 callback.callback(), 3033 pool_.get(), 3034 BoundNetLog())); 3035 // No idle sockets, and one connecting job. 3036 EXPECT_EQ(0, pool_->IdleSocketCount()); 3037 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3038 3039 // Return the first handle to the pool. This will initiate the delayed 3040 // binding. 3041 handle1.Reset(); 3042 3043 base::MessageLoop::current()->RunUntilIdle(); 3044 3045 // Still no idle sockets, still one pending connect job. 3046 EXPECT_EQ(0, pool_->IdleSocketCount()); 3047 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3048 3049 // The second socket connected, even though it was a Waiting Job. 3050 EXPECT_EQ(OK, callback.WaitForResult()); 3051 3052 // And we can see there is still one job waiting. 3053 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3054 3055 // Finally, signal the waiting Connect. 3056 client_socket_factory_.SignalJobs(); 3057 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3058 3059 base::MessageLoop::current()->RunUntilIdle(); 3060 } 3061 3062 // Cover the case where on an available socket slot, we have one pending 3063 // request that completes synchronously, thereby making the Group empty. 3064 TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) { 3065 const int kUnlimitedSockets = 100; 3066 const int kOneSocketPerGroup = 1; 3067 CreatePool(kUnlimitedSockets, kOneSocketPerGroup); 3068 3069 // Make the first request asynchronous fail. 3070 // This will free up a socket slot later. 3071 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 3072 3073 ClientSocketHandle handle1; 3074 TestCompletionCallback callback1; 3075 EXPECT_EQ(ERR_IO_PENDING, 3076 handle1.Init("a", 3077 params_, 3078 DEFAULT_PRIORITY, 3079 callback1.callback(), 3080 pool_.get(), 3081 BoundNetLog())); 3082 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3083 3084 // Make the second request synchronously fail. This should make the Group 3085 // empty. 3086 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 3087 ClientSocketHandle handle2; 3088 TestCompletionCallback callback2; 3089 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail 3090 // when created. 3091 EXPECT_EQ(ERR_IO_PENDING, 3092 handle2.Init("a", 3093 params_, 3094 DEFAULT_PRIORITY, 3095 callback2.callback(), 3096 pool_.get(), 3097 BoundNetLog())); 3098 3099 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3100 3101 EXPECT_EQ(ERR_CONNECTION_FAILED, callback1.WaitForResult()); 3102 EXPECT_EQ(ERR_CONNECTION_FAILED, callback2.WaitForResult()); 3103 EXPECT_FALSE(pool_->HasGroup("a")); 3104 } 3105 3106 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) { 3107 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 3108 3109 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3110 3111 ClientSocketHandle handle1; 3112 TestCompletionCallback callback1; 3113 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3114 params_, 3115 DEFAULT_PRIORITY, 3116 callback1.callback(), 3117 pool_.get(), 3118 BoundNetLog())); 3119 3120 ClientSocketHandle handle2; 3121 TestCompletionCallback callback2; 3122 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3123 params_, 3124 DEFAULT_PRIORITY, 3125 callback2.callback(), 3126 pool_.get(), 3127 BoundNetLog())); 3128 ClientSocketHandle handle3; 3129 TestCompletionCallback callback3; 3130 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", 3131 params_, 3132 DEFAULT_PRIORITY, 3133 callback3.callback(), 3134 pool_.get(), 3135 BoundNetLog())); 3136 3137 EXPECT_EQ(OK, callback1.WaitForResult()); 3138 EXPECT_EQ(OK, callback2.WaitForResult()); 3139 EXPECT_EQ(OK, callback3.WaitForResult()); 3140 3141 // Use the socket. 3142 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback())); 3143 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback())); 3144 3145 handle1.Reset(); 3146 handle2.Reset(); 3147 handle3.Reset(); 3148 3149 EXPECT_EQ(OK, handle1.Init("a", 3150 params_, 3151 DEFAULT_PRIORITY, 3152 callback1.callback(), 3153 pool_.get(), 3154 BoundNetLog())); 3155 EXPECT_EQ(OK, handle2.Init("a", 3156 params_, 3157 DEFAULT_PRIORITY, 3158 callback2.callback(), 3159 pool_.get(), 3160 BoundNetLog())); 3161 EXPECT_EQ(OK, handle3.Init("a", 3162 params_, 3163 DEFAULT_PRIORITY, 3164 callback3.callback(), 3165 pool_.get(), 3166 BoundNetLog())); 3167 3168 EXPECT_TRUE(handle1.socket()->WasEverUsed()); 3169 EXPECT_TRUE(handle2.socket()->WasEverUsed()); 3170 EXPECT_FALSE(handle3.socket()->WasEverUsed()); 3171 } 3172 3173 TEST_F(ClientSocketPoolBaseTest, RequestSockets) { 3174 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3175 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3176 3177 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3178 3179 ASSERT_TRUE(pool_->HasGroup("a")); 3180 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3181 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); 3182 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3183 3184 ClientSocketHandle handle1; 3185 TestCompletionCallback callback1; 3186 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3187 params_, 3188 DEFAULT_PRIORITY, 3189 callback1.callback(), 3190 pool_.get(), 3191 BoundNetLog())); 3192 3193 ClientSocketHandle handle2; 3194 TestCompletionCallback callback2; 3195 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3196 params_, 3197 DEFAULT_PRIORITY, 3198 callback2.callback(), 3199 pool_.get(), 3200 BoundNetLog())); 3201 3202 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3203 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3204 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3205 3206 EXPECT_EQ(OK, callback1.WaitForResult()); 3207 EXPECT_EQ(OK, callback2.WaitForResult()); 3208 handle1.Reset(); 3209 handle2.Reset(); 3210 3211 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3212 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3213 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 3214 } 3215 3216 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { 3217 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3218 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3219 3220 ClientSocketHandle handle1; 3221 TestCompletionCallback callback1; 3222 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3223 params_, 3224 DEFAULT_PRIORITY, 3225 callback1.callback(), 3226 pool_.get(), 3227 BoundNetLog())); 3228 3229 ASSERT_TRUE(pool_->HasGroup("a")); 3230 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3231 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3232 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3233 3234 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3235 3236 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3237 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3238 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3239 3240 ClientSocketHandle handle2; 3241 TestCompletionCallback callback2; 3242 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3243 params_, 3244 DEFAULT_PRIORITY, 3245 callback2.callback(), 3246 pool_.get(), 3247 BoundNetLog())); 3248 3249 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3250 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3251 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3252 3253 EXPECT_EQ(OK, callback1.WaitForResult()); 3254 EXPECT_EQ(OK, callback2.WaitForResult()); 3255 handle1.Reset(); 3256 handle2.Reset(); 3257 3258 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3259 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3260 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 3261 } 3262 3263 TEST_F(ClientSocketPoolBaseTest, 3264 RequestSocketsWhenAlreadyHaveMultipleConnectJob) { 3265 CreatePool(4, 4); 3266 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3267 3268 ClientSocketHandle handle1; 3269 TestCompletionCallback callback1; 3270 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3271 params_, 3272 DEFAULT_PRIORITY, 3273 callback1.callback(), 3274 pool_.get(), 3275 BoundNetLog())); 3276 3277 ClientSocketHandle handle2; 3278 TestCompletionCallback callback2; 3279 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 3280 params_, 3281 DEFAULT_PRIORITY, 3282 callback2.callback(), 3283 pool_.get(), 3284 BoundNetLog())); 3285 3286 ClientSocketHandle handle3; 3287 TestCompletionCallback callback3; 3288 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", 3289 params_, 3290 DEFAULT_PRIORITY, 3291 callback3.callback(), 3292 pool_.get(), 3293 BoundNetLog())); 3294 3295 ASSERT_TRUE(pool_->HasGroup("a")); 3296 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 3297 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3298 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3299 3300 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3301 3302 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 3303 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3304 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3305 3306 EXPECT_EQ(OK, callback1.WaitForResult()); 3307 EXPECT_EQ(OK, callback2.WaitForResult()); 3308 EXPECT_EQ(OK, callback3.WaitForResult()); 3309 handle1.Reset(); 3310 handle2.Reset(); 3311 handle3.Reset(); 3312 3313 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3314 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3315 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a")); 3316 } 3317 3318 TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) { 3319 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 3320 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3321 3322 ASSERT_FALSE(pool_->HasGroup("a")); 3323 3324 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSockets, 3325 BoundNetLog()); 3326 3327 ASSERT_TRUE(pool_->HasGroup("a")); 3328 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a")); 3329 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a")); 3330 3331 ASSERT_FALSE(pool_->HasGroup("b")); 3332 3333 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSockets, 3334 BoundNetLog()); 3335 3336 ASSERT_FALSE(pool_->HasGroup("b")); 3337 } 3338 3339 TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) { 3340 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 3341 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3342 3343 ASSERT_FALSE(pool_->HasGroup("a")); 3344 3345 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSockets - 1, 3346 BoundNetLog()); 3347 3348 ASSERT_TRUE(pool_->HasGroup("a")); 3349 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a")); 3350 EXPECT_EQ(kDefaultMaxSockets - 1, 3351 pool_->NumUnassignedConnectJobsInGroup("a")); 3352 EXPECT_FALSE(pool_->IsStalled()); 3353 3354 ASSERT_FALSE(pool_->HasGroup("b")); 3355 3356 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSockets, 3357 BoundNetLog()); 3358 3359 ASSERT_TRUE(pool_->HasGroup("b")); 3360 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b")); 3361 EXPECT_FALSE(pool_->IsStalled()); 3362 } 3363 3364 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { 3365 CreatePool(4, 4); 3366 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3367 3368 ClientSocketHandle handle1; 3369 TestCompletionCallback callback1; 3370 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3371 params_, 3372 DEFAULT_PRIORITY, 3373 callback1.callback(), 3374 pool_.get(), 3375 BoundNetLog())); 3376 ASSERT_EQ(OK, callback1.WaitForResult()); 3377 handle1.Reset(); 3378 3379 ASSERT_TRUE(pool_->HasGroup("a")); 3380 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3381 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3382 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3383 3384 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3385 3386 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3387 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3388 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3389 } 3390 3391 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { 3392 CreatePool(4, 4); 3393 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3394 3395 ClientSocketHandle handle1; 3396 TestCompletionCallback callback1; 3397 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3398 params_, 3399 DEFAULT_PRIORITY, 3400 callback1.callback(), 3401 pool_.get(), 3402 BoundNetLog())); 3403 ASSERT_EQ(OK, callback1.WaitForResult()); 3404 3405 ASSERT_TRUE(pool_->HasGroup("a")); 3406 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3407 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3408 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3409 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 3410 3411 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3412 3413 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3414 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3415 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3416 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 3417 } 3418 3419 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) { 3420 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3421 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3422 3423 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSocketsPerGroup, 3424 BoundNetLog()); 3425 3426 ASSERT_TRUE(pool_->HasGroup("a")); 3427 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3428 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3429 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a")); 3430 3431 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSocketsPerGroup, 3432 BoundNetLog()); 3433 3434 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); 3435 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); 3436 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b")); 3437 } 3438 3439 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) { 3440 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3441 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 3442 3443 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSocketsPerGroup, 3444 BoundNetLog()); 3445 3446 ASSERT_FALSE(pool_->HasGroup("a")); 3447 3448 connect_job_factory_->set_job_type( 3449 TestConnectJob::kMockAdditionalErrorStateJob); 3450 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSocketsPerGroup, 3451 BoundNetLog()); 3452 3453 ASSERT_FALSE(pool_->HasGroup("a")); 3454 } 3455 3456 TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) { 3457 CreatePool(4, 4); 3458 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3459 3460 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3461 3462 ASSERT_TRUE(pool_->HasGroup("a")); 3463 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3464 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); 3465 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3466 3467 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3468 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3469 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); 3470 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3471 3472 ClientSocketHandle handle1; 3473 TestCompletionCallback callback1; 3474 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3475 params_, 3476 DEFAULT_PRIORITY, 3477 callback1.callback(), 3478 pool_.get(), 3479 BoundNetLog())); 3480 ASSERT_EQ(OK, callback1.WaitForResult()); 3481 3482 ClientSocketHandle handle2; 3483 TestCompletionCallback callback2; 3484 int rv = handle2.Init("a", 3485 params_, 3486 DEFAULT_PRIORITY, 3487 callback2.callback(), 3488 pool_.get(), 3489 BoundNetLog()); 3490 if (rv != OK) { 3491 EXPECT_EQ(ERR_IO_PENDING, rv); 3492 EXPECT_EQ(OK, callback2.WaitForResult()); 3493 } 3494 3495 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3496 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3497 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a")); 3498 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3499 3500 handle1.Reset(); 3501 handle2.Reset(); 3502 3503 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3504 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3505 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 3506 3507 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3508 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3509 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3510 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 3511 } 3512 3513 TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) { 3514 CreatePool(4, 4); 3515 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3516 3517 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); 3518 3519 ASSERT_TRUE(pool_->HasGroup("a")); 3520 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3521 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3522 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3523 3524 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3525 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3526 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); 3527 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3528 3529 pool_->RequestSockets("a", ¶ms_, 3, BoundNetLog()); 3530 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 3531 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a")); 3532 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3533 3534 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); 3535 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 3536 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a")); 3537 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3538 } 3539 3540 TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) { 3541 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3542 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3543 3544 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); 3545 3546 ASSERT_TRUE(pool_->HasGroup("a")); 3547 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3548 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3549 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3550 3551 ClientSocketHandle handle1; 3552 TestCompletionCallback callback1; 3553 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3554 params_, 3555 DEFAULT_PRIORITY, 3556 callback1.callback(), 3557 pool_.get(), 3558 BoundNetLog())); 3559 3560 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3561 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3562 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3563 3564 ASSERT_EQ(OK, callback1.WaitForResult()); 3565 3566 // Make sure if a preconnected socket is not fully connected when a request 3567 // starts, it has a connect start time. 3568 TestLoadTimingInfoConnectedNotReused(handle1); 3569 handle1.Reset(); 3570 3571 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3572 } 3573 3574 // Checks that fully connected preconnect jobs have no connect times, and are 3575 // marked as reused. 3576 TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) { 3577 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3578 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3579 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); 3580 3581 ASSERT_TRUE(pool_->HasGroup("a")); 3582 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3583 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3584 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3585 3586 ClientSocketHandle handle; 3587 TestCompletionCallback callback; 3588 EXPECT_EQ(OK, handle.Init("a", 3589 params_, 3590 DEFAULT_PRIORITY, 3591 callback.callback(), 3592 pool_.get(), 3593 BoundNetLog())); 3594 3595 // Make sure the idle socket was used. 3596 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3597 3598 TestLoadTimingInfoConnectedReused(handle); 3599 handle.Reset(); 3600 TestLoadTimingInfoNotConnected(handle); 3601 } 3602 3603 // http://crbug.com/64940 regression test. 3604 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { 3605 const int kMaxTotalSockets = 3; 3606 const int kMaxSocketsPerGroup = 2; 3607 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup); 3608 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3609 3610 // Note that group name ordering matters here. "a" comes before "b", so 3611 // CloseOneIdleSocket() will try to close "a"'s idle socket. 3612 3613 // Set up one idle socket in "a". 3614 ClientSocketHandle handle1; 3615 TestCompletionCallback callback1; 3616 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3617 params_, 3618 DEFAULT_PRIORITY, 3619 callback1.callback(), 3620 pool_.get(), 3621 BoundNetLog())); 3622 3623 ASSERT_EQ(OK, callback1.WaitForResult()); 3624 handle1.Reset(); 3625 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3626 3627 // Set up two active sockets in "b". 3628 ClientSocketHandle handle2; 3629 TestCompletionCallback callback2; 3630 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("b", 3631 params_, 3632 DEFAULT_PRIORITY, 3633 callback1.callback(), 3634 pool_.get(), 3635 BoundNetLog())); 3636 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("b", 3637 params_, 3638 DEFAULT_PRIORITY, 3639 callback2.callback(), 3640 pool_.get(), 3641 BoundNetLog())); 3642 3643 ASSERT_EQ(OK, callback1.WaitForResult()); 3644 ASSERT_EQ(OK, callback2.WaitForResult()); 3645 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); 3646 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); 3647 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); 3648 3649 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means 3650 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3. 3651 // Requesting 2 preconnected sockets for "a" should fail to allocate any more 3652 // sockets for "a", and "b" should still have 2 active sockets. 3653 3654 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3655 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3656 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3657 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3658 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); 3659 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); 3660 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); 3661 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); 3662 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); 3663 3664 // Now release the 2 active sockets for "b". This will give us 1 idle socket 3665 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for 3666 // "a" should result in closing 1 for "b". 3667 handle1.Reset(); 3668 handle2.Reset(); 3669 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b")); 3670 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b")); 3671 3672 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3673 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3674 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3675 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3676 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); 3677 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); 3678 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); 3679 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b")); 3680 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b")); 3681 } 3682 3683 TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) { 3684 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3685 pool_->EnableConnectBackupJobs(); 3686 3687 // Make the ConnectJob hang until it times out, shorten the timeout. 3688 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 3689 connect_job_factory_->set_timeout_duration( 3690 base::TimeDelta::FromMilliseconds(500)); 3691 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); 3692 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3693 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3694 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3695 3696 // Verify the backup timer doesn't create a backup job, by making 3697 // the backup job a pending job instead of a waiting job, so it 3698 // *would* complete if it were created. 3699 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3700 base::MessageLoop::current()->PostDelayedTask( 3701 FROM_HERE, 3702 base::MessageLoop::QuitClosure(), 3703 base::TimeDelta::FromSeconds(1)); 3704 base::MessageLoop::current()->Run(); 3705 EXPECT_FALSE(pool_->HasGroup("a")); 3706 } 3707 3708 TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) { 3709 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3710 pool_->EnableConnectBackupJobs(); 3711 3712 // Make the ConnectJob hang forever. 3713 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 3714 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); 3715 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3716 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); 3717 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3718 base::MessageLoop::current()->RunUntilIdle(); 3719 3720 // Make the backup job be a pending job, so it completes normally. 3721 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3722 ClientSocketHandle handle; 3723 TestCompletionCallback callback; 3724 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 3725 params_, 3726 DEFAULT_PRIORITY, 3727 callback.callback(), 3728 pool_.get(), 3729 BoundNetLog())); 3730 // Timer has started, but the backup connect job shouldn't be created yet. 3731 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3732 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3733 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3734 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); 3735 ASSERT_EQ(OK, callback.WaitForResult()); 3736 3737 // The hung connect job should still be there, but everything else should be 3738 // complete. 3739 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3740 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3741 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3742 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 3743 } 3744 3745 // Tests that a preconnect that starts out with unread data can still be used. 3746 // http://crbug.com/334467 3747 TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) { 3748 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3749 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob); 3750 3751 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); 3752 3753 ASSERT_TRUE(pool_->HasGroup("a")); 3754 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3755 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3756 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3757 3758 // Fail future jobs to be sure that handle receives the preconnected socket 3759 // rather than closing it and making a new one. 3760 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 3761 ClientSocketHandle handle; 3762 TestCompletionCallback callback; 3763 EXPECT_EQ(OK, handle.Init("a", 3764 params_, 3765 DEFAULT_PRIORITY, 3766 callback.callback(), 3767 pool_.get(), 3768 BoundNetLog())); 3769 3770 ASSERT_TRUE(pool_->HasGroup("a")); 3771 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3772 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); 3773 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3774 3775 // Drain the pending read. 3776 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback())); 3777 3778 TestLoadTimingInfoConnectedReused(handle); 3779 handle.Reset(); 3780 3781 // The socket should be usable now that it's idle again. 3782 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3783 } 3784 3785 class MockLayeredPool : public HigherLayeredPool { 3786 public: 3787 MockLayeredPool(TestClientSocketPool* pool, 3788 const std::string& group_name) 3789 : pool_(pool), 3790 group_name_(group_name), 3791 can_release_connection_(true) { 3792 pool_->AddHigherLayeredPool(this); 3793 } 3794 3795 ~MockLayeredPool() { 3796 pool_->RemoveHigherLayeredPool(this); 3797 } 3798 3799 int RequestSocket(TestClientSocketPool* pool) { 3800 scoped_refptr<TestSocketParams> params( 3801 new TestSocketParams(false /* ignore_limits */)); 3802 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, 3803 callback_.callback(), pool, BoundNetLog()); 3804 } 3805 3806 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { 3807 scoped_refptr<TestSocketParams> params( 3808 new TestSocketParams(true /* ignore_limits */)); 3809 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, 3810 callback_.callback(), pool, BoundNetLog()); 3811 } 3812 3813 bool ReleaseOneConnection() { 3814 if (!handle_.is_initialized() || !can_release_connection_) { 3815 return false; 3816 } 3817 handle_.socket()->Disconnect(); 3818 handle_.Reset(); 3819 return true; 3820 } 3821 3822 void set_can_release_connection(bool can_release_connection) { 3823 can_release_connection_ = can_release_connection; 3824 } 3825 3826 MOCK_METHOD0(CloseOneIdleConnection, bool()); 3827 3828 private: 3829 TestClientSocketPool* const pool_; 3830 ClientSocketHandle handle_; 3831 TestCompletionCallback callback_; 3832 const std::string group_name_; 3833 bool can_release_connection_; 3834 }; 3835 3836 TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) { 3837 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3838 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3839 3840 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); 3841 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3842 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3843 .WillOnce(Return(false)); 3844 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); 3845 } 3846 3847 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) { 3848 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3849 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3850 3851 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); 3852 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3853 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3854 .WillOnce(Invoke(&mock_layered_pool, 3855 &MockLayeredPool::ReleaseOneConnection)); 3856 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); 3857 } 3858 3859 // Tests the basic case of closing an idle socket in a higher layered pool when 3860 // a new request is issued and the lower layer pool is stalled. 3861 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) { 3862 CreatePool(1, 1); 3863 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3864 3865 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); 3866 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3867 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3868 .WillOnce(Invoke(&mock_layered_pool, 3869 &MockLayeredPool::ReleaseOneConnection)); 3870 ClientSocketHandle handle; 3871 TestCompletionCallback callback; 3872 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 3873 params_, 3874 DEFAULT_PRIORITY, 3875 callback.callback(), 3876 pool_.get(), 3877 BoundNetLog())); 3878 EXPECT_EQ(OK, callback.WaitForResult()); 3879 } 3880 3881 // Same as above, but the idle socket is in the same group as the stalled 3882 // socket, and closes the only other request in its group when closing requests 3883 // in higher layered pools. This generally shouldn't happen, but it may be 3884 // possible if a higher level pool issues a request and the request is 3885 // subsequently cancelled. Even if it's not possible, best not to crash. 3886 TEST_F(ClientSocketPoolBaseTest, 3887 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) { 3888 CreatePool(2, 2); 3889 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3890 3891 // Need a socket in another group for the pool to be stalled (If a group 3892 // has the maximum number of connections already, it's not stalled). 3893 ClientSocketHandle handle1; 3894 TestCompletionCallback callback1; 3895 EXPECT_EQ(OK, handle1.Init("group1", 3896 params_, 3897 DEFAULT_PRIORITY, 3898 callback1.callback(), 3899 pool_.get(), 3900 BoundNetLog())); 3901 3902 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); 3903 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3904 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3905 .WillOnce(Invoke(&mock_layered_pool, 3906 &MockLayeredPool::ReleaseOneConnection)); 3907 ClientSocketHandle handle; 3908 TestCompletionCallback callback2; 3909 EXPECT_EQ(ERR_IO_PENDING, handle.Init("group2", 3910 params_, 3911 DEFAULT_PRIORITY, 3912 callback2.callback(), 3913 pool_.get(), 3914 BoundNetLog())); 3915 EXPECT_EQ(OK, callback2.WaitForResult()); 3916 } 3917 3918 // Tests the case when an idle socket can be closed when a new request is 3919 // issued, and the new request belongs to a group that was previously stalled. 3920 TEST_F(ClientSocketPoolBaseTest, 3921 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) { 3922 CreatePool(2, 2); 3923 std::list<TestConnectJob::JobType> job_types; 3924 job_types.push_back(TestConnectJob::kMockJob); 3925 job_types.push_back(TestConnectJob::kMockJob); 3926 job_types.push_back(TestConnectJob::kMockJob); 3927 job_types.push_back(TestConnectJob::kMockJob); 3928 connect_job_factory_->set_job_types(&job_types); 3929 3930 ClientSocketHandle handle1; 3931 TestCompletionCallback callback1; 3932 EXPECT_EQ(OK, handle1.Init("group1", 3933 params_, 3934 DEFAULT_PRIORITY, 3935 callback1.callback(), 3936 pool_.get(), 3937 BoundNetLog())); 3938 3939 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); 3940 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 3941 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 3942 .WillRepeatedly(Invoke(&mock_layered_pool, 3943 &MockLayeredPool::ReleaseOneConnection)); 3944 mock_layered_pool.set_can_release_connection(false); 3945 3946 // The third request is made when the socket pool is in a stalled state. 3947 ClientSocketHandle handle3; 3948 TestCompletionCallback callback3; 3949 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", 3950 params_, 3951 DEFAULT_PRIORITY, 3952 callback3.callback(), 3953 pool_.get(), 3954 BoundNetLog())); 3955 3956 base::RunLoop().RunUntilIdle(); 3957 EXPECT_FALSE(callback3.have_result()); 3958 3959 // The fourth request is made when the pool is no longer stalled. The third 3960 // request should be serviced first, since it was issued first and has the 3961 // same priority. 3962 mock_layered_pool.set_can_release_connection(true); 3963 ClientSocketHandle handle4; 3964 TestCompletionCallback callback4; 3965 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", 3966 params_, 3967 DEFAULT_PRIORITY, 3968 callback4.callback(), 3969 pool_.get(), 3970 BoundNetLog())); 3971 EXPECT_EQ(OK, callback3.WaitForResult()); 3972 EXPECT_FALSE(callback4.have_result()); 3973 3974 // Closing a handle should free up another socket slot. 3975 handle1.Reset(); 3976 EXPECT_EQ(OK, callback4.WaitForResult()); 3977 } 3978 3979 // Tests the case when an idle socket can be closed when a new request is 3980 // issued, and the new request belongs to a group that was previously stalled. 3981 // 3982 // The two differences from the above test are that the stalled requests are not 3983 // in the same group as the layered pool's request, and the the fourth request 3984 // has a higher priority than the third one, so gets a socket first. 3985 TEST_F(ClientSocketPoolBaseTest, 3986 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) { 3987 CreatePool(2, 2); 3988 std::list<TestConnectJob::JobType> job_types; 3989 job_types.push_back(TestConnectJob::kMockJob); 3990 job_types.push_back(TestConnectJob::kMockJob); 3991 job_types.push_back(TestConnectJob::kMockJob); 3992 job_types.push_back(TestConnectJob::kMockJob); 3993 connect_job_factory_->set_job_types(&job_types); 3994 3995 ClientSocketHandle handle1; 3996 TestCompletionCallback callback1; 3997 EXPECT_EQ(OK, handle1.Init("group1", 3998 params_, 3999 DEFAULT_PRIORITY, 4000 callback1.callback(), 4001 pool_.get(), 4002 BoundNetLog())); 4003 4004 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); 4005 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); 4006 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) 4007 .WillRepeatedly(Invoke(&mock_layered_pool, 4008 &MockLayeredPool::ReleaseOneConnection)); 4009 mock_layered_pool.set_can_release_connection(false); 4010 4011 // The third request is made when the socket pool is in a stalled state. 4012 ClientSocketHandle handle3; 4013 TestCompletionCallback callback3; 4014 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", 4015 params_, 4016 MEDIUM, 4017 callback3.callback(), 4018 pool_.get(), 4019 BoundNetLog())); 4020 4021 base::RunLoop().RunUntilIdle(); 4022 EXPECT_FALSE(callback3.have_result()); 4023 4024 // The fourth request is made when the pool is no longer stalled. This 4025 // request has a higher priority than the third request, so is serviced first. 4026 mock_layered_pool.set_can_release_connection(true); 4027 ClientSocketHandle handle4; 4028 TestCompletionCallback callback4; 4029 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", 4030 params_, 4031 HIGHEST, 4032 callback4.callback(), 4033 pool_.get(), 4034 BoundNetLog())); 4035 EXPECT_EQ(OK, callback4.WaitForResult()); 4036 EXPECT_FALSE(callback3.have_result()); 4037 4038 // Closing a handle should free up another socket slot. 4039 handle1.Reset(); 4040 EXPECT_EQ(OK, callback3.WaitForResult()); 4041 } 4042 4043 TEST_F(ClientSocketPoolBaseTest, 4044 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) { 4045 CreatePool(1, 1); 4046 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 4047 4048 MockLayeredPool mock_layered_pool1(pool_.get(), "foo"); 4049 EXPECT_EQ(OK, mock_layered_pool1.RequestSocket(pool_.get())); 4050 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection()) 4051 .WillRepeatedly(Invoke(&mock_layered_pool1, 4052 &MockLayeredPool::ReleaseOneConnection)); 4053 MockLayeredPool mock_layered_pool2(pool_.get(), "bar"); 4054 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get())); 4055 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection()) 4056 .WillRepeatedly(Invoke(&mock_layered_pool2, 4057 &MockLayeredPool::ReleaseOneConnection)); 4058 ClientSocketHandle handle; 4059 TestCompletionCallback callback; 4060 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 4061 params_, 4062 DEFAULT_PRIORITY, 4063 callback.callback(), 4064 pool_.get(), 4065 BoundNetLog())); 4066 EXPECT_EQ(OK, callback.WaitForResult()); 4067 } 4068 4069 // Test that when a socket pool and group are at their limits, a request 4070 // with |ignore_limits| triggers creation of a new socket, and gets the socket 4071 // instead of a request with the same priority that was issued earlier, but 4072 // that does not have |ignore_limits| set. 4073 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { 4074 scoped_refptr<TestSocketParams> params_ignore_limits( 4075 new TestSocketParams(true /* ignore_limits */)); 4076 CreatePool(1, 1); 4077 4078 // Issue a request to reach the socket pool limit. 4079 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); 4080 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4081 4082 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 4083 4084 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, 4085 params_)); 4086 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4087 4088 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, 4089 params_ignore_limits)); 4090 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); 4091 4092 EXPECT_EQ(OK, request(2)->WaitForResult()); 4093 EXPECT_FALSE(request(1)->have_result()); 4094 } 4095 4096 // Test that when a socket pool and group are at their limits, a ConnectJob 4097 // issued for a request with |ignore_limits| set is not cancelled when a request 4098 // without |ignore_limits| issued to the same group is cancelled. 4099 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { 4100 scoped_refptr<TestSocketParams> params_ignore_limits( 4101 new TestSocketParams(true /* ignore_limits */)); 4102 CreatePool(1, 1); 4103 4104 // Issue a request to reach the socket pool limit. 4105 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); 4106 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4107 4108 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 4109 4110 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, 4111 params_)); 4112 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 4113 4114 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, 4115 params_ignore_limits)); 4116 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); 4117 4118 // Cancel the pending request without ignore_limits set. The ConnectJob 4119 // should not be cancelled. 4120 request(1)->handle()->Reset(); 4121 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); 4122 4123 EXPECT_EQ(OK, request(2)->WaitForResult()); 4124 EXPECT_FALSE(request(1)->have_result()); 4125 } 4126 4127 } // namespace 4128 4129 } // namespace net 4130