1 // Copyright (c) 2011 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 "base/callback.h" 8 #include "base/compiler_specific.h" 9 #include "base/memory/ref_counted.h" 10 #include "base/memory/scoped_vector.h" 11 #include "base/message_loop.h" 12 #include "base/string_number_conversions.h" 13 #include "base/string_util.h" 14 #include "base/threading/platform_thread.h" 15 #include "net/base/net_errors.h" 16 #include "net/base/net_log.h" 17 #include "net/base/net_log_unittest.h" 18 #include "net/base/request_priority.h" 19 #include "net/base/test_completion_callback.h" 20 #include "net/http/http_response_headers.h" 21 #include "net/socket/client_socket.h" 22 #include "net/socket/client_socket_factory.h" 23 #include "net/socket/client_socket_handle.h" 24 #include "net/socket/client_socket_pool_histograms.h" 25 #include "net/socket/socket_test_util.h" 26 #include "net/socket/ssl_host_info.h" 27 #include "testing/gtest/include/gtest/gtest.h" 28 29 namespace net { 30 31 namespace { 32 33 const int kDefaultMaxSockets = 4; 34 const int kDefaultMaxSocketsPerGroup = 2; 35 const net::RequestPriority kDefaultPriority = MEDIUM; 36 37 class TestSocketParams : public base::RefCounted<TestSocketParams> { 38 public: 39 bool ignore_limits() { return false; } 40 private: 41 friend class base::RefCounted<TestSocketParams>; 42 ~TestSocketParams() {} 43 }; 44 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase; 45 46 class MockClientSocket : public ClientSocket { 47 public: 48 MockClientSocket() : connected_(false), was_used_to_convey_data_(false) {} 49 50 // Socket methods: 51 virtual int Read( 52 IOBuffer* /* buf */, int /* len */, CompletionCallback* /* callback */) { 53 return ERR_UNEXPECTED; 54 } 55 56 virtual int Write( 57 IOBuffer* /* buf */, int len, CompletionCallback* /* callback */) { 58 was_used_to_convey_data_ = true; 59 return len; 60 } 61 virtual bool SetReceiveBufferSize(int32 size) { return true; } 62 virtual bool SetSendBufferSize(int32 size) { return true; } 63 64 // ClientSocket methods: 65 66 virtual int Connect(CompletionCallback* callback) { 67 connected_ = true; 68 return OK; 69 } 70 71 virtual void Disconnect() { connected_ = false; } 72 virtual bool IsConnected() const { return connected_; } 73 virtual bool IsConnectedAndIdle() const { return connected_; } 74 75 virtual int GetPeerAddress(AddressList* /* address */) const { 76 return ERR_UNEXPECTED; 77 } 78 79 virtual int GetLocalAddress(IPEndPoint* /* address */) const { 80 return ERR_UNEXPECTED; 81 } 82 83 virtual const BoundNetLog& NetLog() const { 84 return net_log_; 85 } 86 87 virtual void SetSubresourceSpeculation() {} 88 virtual void SetOmniboxSpeculation() {} 89 virtual bool WasEverUsed() const { return was_used_to_convey_data_; } 90 virtual bool UsingTCPFastOpen() const { return false; } 91 92 private: 93 bool connected_; 94 BoundNetLog net_log_; 95 bool was_used_to_convey_data_; 96 97 DISALLOW_COPY_AND_ASSIGN(MockClientSocket); 98 }; 99 100 class TestConnectJob; 101 102 class MockClientSocketFactory : public ClientSocketFactory { 103 public: 104 MockClientSocketFactory() : allocation_count_(0) {} 105 106 virtual ClientSocket* CreateTransportClientSocket( 107 const AddressList& addresses, 108 NetLog* /* net_log */, 109 const NetLog::Source& /*source*/) { 110 allocation_count_++; 111 return NULL; 112 } 113 114 virtual SSLClientSocket* CreateSSLClientSocket( 115 ClientSocketHandle* transport_socket, 116 const HostPortPair& host_and_port, 117 const SSLConfig& ssl_config, 118 SSLHostInfo* ssl_host_info, 119 CertVerifier* cert_verifier, 120 DnsCertProvenanceChecker* dns_cert_checker) { 121 NOTIMPLEMENTED(); 122 delete ssl_host_info; 123 return NULL; 124 } 125 126 virtual void ClearSSLSessionCache() { 127 NOTIMPLEMENTED(); 128 } 129 130 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } 131 void SignalJobs(); 132 133 int allocation_count() const { return allocation_count_; } 134 135 private: 136 int allocation_count_; 137 std::vector<TestConnectJob*> waiting_jobs_; 138 }; 139 140 class TestConnectJob : public ConnectJob { 141 public: 142 enum JobType { 143 kMockJob, 144 kMockFailingJob, 145 kMockPendingJob, 146 kMockPendingFailingJob, 147 kMockWaitingJob, 148 kMockAdvancingLoadStateJob, 149 kMockRecoverableJob, 150 kMockPendingRecoverableJob, 151 kMockAdditionalErrorStateJob, 152 kMockPendingAdditionalErrorStateJob, 153 }; 154 155 // The kMockPendingJob uses a slight delay before allowing the connect 156 // to complete. 157 static const int kPendingConnectDelay = 2; 158 159 TestConnectJob(JobType job_type, 160 const std::string& group_name, 161 const TestClientSocketPoolBase::Request& request, 162 base::TimeDelta timeout_duration, 163 ConnectJob::Delegate* delegate, 164 MockClientSocketFactory* client_socket_factory, 165 NetLog* net_log) 166 : ConnectJob(group_name, timeout_duration, delegate, 167 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), 168 job_type_(job_type), 169 client_socket_factory_(client_socket_factory), 170 method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 171 load_state_(LOAD_STATE_IDLE), 172 store_additional_error_state_(false) {} 173 174 void Signal() { 175 DoConnect(waiting_success_, true /* async */, false /* recoverable */); 176 } 177 178 virtual LoadState GetLoadState() const { return load_state_; } 179 180 virtual void GetAdditionalErrorState(ClientSocketHandle* handle) { 181 if (store_additional_error_state_) { 182 // Set all of the additional error state fields in some way. 183 handle->set_is_ssl_error(true); 184 HttpResponseInfo info; 185 info.headers = new HttpResponseHeaders(""); 186 handle->set_ssl_error_response_info(info); 187 } 188 } 189 190 private: 191 // ConnectJob methods: 192 193 virtual int ConnectInternal() { 194 AddressList ignored; 195 client_socket_factory_->CreateTransportClientSocket( 196 ignored, NULL, net::NetLog::Source()); 197 set_socket(new MockClientSocket()); 198 switch (job_type_) { 199 case kMockJob: 200 return DoConnect(true /* successful */, false /* sync */, 201 false /* recoverable */); 202 case kMockFailingJob: 203 return DoConnect(false /* error */, false /* sync */, 204 false /* recoverable */); 205 case kMockPendingJob: 206 set_load_state(LOAD_STATE_CONNECTING); 207 208 // Depending on execution timings, posting a delayed task can result 209 // in the task getting executed the at the earliest possible 210 // opportunity or only after returning once from the message loop and 211 // then a second call into the message loop. In order to make behavior 212 // more deterministic, we change the default delay to 2ms. This should 213 // always require us to wait for the second call into the message loop. 214 // 215 // N.B. The correct fix for this and similar timing problems is to 216 // abstract time for the purpose of unittests. Unfortunately, we have 217 // a lot of third-party components that directly call the various 218 // time functions, so this change would be rather invasive. 219 MessageLoop::current()->PostDelayedTask( 220 FROM_HERE, 221 method_factory_.NewRunnableMethod( 222 &TestConnectJob::DoConnect, 223 true /* successful */, 224 true /* async */, 225 false /* recoverable */), 226 kPendingConnectDelay); 227 return ERR_IO_PENDING; 228 case kMockPendingFailingJob: 229 set_load_state(LOAD_STATE_CONNECTING); 230 MessageLoop::current()->PostDelayedTask( 231 FROM_HERE, 232 method_factory_.NewRunnableMethod( 233 &TestConnectJob::DoConnect, 234 false /* error */, 235 true /* async */, 236 false /* recoverable */), 237 2); 238 return ERR_IO_PENDING; 239 case kMockWaitingJob: 240 client_socket_factory_->WaitForSignal(this); 241 waiting_success_ = true; 242 return ERR_IO_PENDING; 243 case kMockAdvancingLoadStateJob: 244 MessageLoop::current()->PostTask( 245 FROM_HERE, 246 method_factory_.NewRunnableMethod( 247 &TestConnectJob::AdvanceLoadState, load_state_)); 248 return ERR_IO_PENDING; 249 case kMockRecoverableJob: 250 return DoConnect(false /* error */, false /* sync */, 251 true /* recoverable */); 252 case kMockPendingRecoverableJob: 253 set_load_state(LOAD_STATE_CONNECTING); 254 MessageLoop::current()->PostDelayedTask( 255 FROM_HERE, 256 method_factory_.NewRunnableMethod( 257 &TestConnectJob::DoConnect, 258 false /* error */, 259 true /* async */, 260 true /* recoverable */), 261 2); 262 return ERR_IO_PENDING; 263 case kMockAdditionalErrorStateJob: 264 store_additional_error_state_ = true; 265 return DoConnect(false /* error */, false /* sync */, 266 false /* recoverable */); 267 case kMockPendingAdditionalErrorStateJob: 268 set_load_state(LOAD_STATE_CONNECTING); 269 store_additional_error_state_ = true; 270 MessageLoop::current()->PostDelayedTask( 271 FROM_HERE, 272 method_factory_.NewRunnableMethod( 273 &TestConnectJob::DoConnect, 274 false /* error */, 275 true /* async */, 276 false /* recoverable */), 277 2); 278 return ERR_IO_PENDING; 279 default: 280 NOTREACHED(); 281 set_socket(NULL); 282 return ERR_FAILED; 283 } 284 } 285 286 void set_load_state(LoadState load_state) { load_state_ = load_state; } 287 288 int DoConnect(bool succeed, bool was_async, bool recoverable) { 289 int result = OK; 290 if (succeed) { 291 socket()->Connect(NULL); 292 } else if (recoverable) { 293 result = ERR_PROXY_AUTH_REQUESTED; 294 } else { 295 result = ERR_CONNECTION_FAILED; 296 set_socket(NULL); 297 } 298 299 if (was_async) 300 NotifyDelegateOfCompletion(result); 301 return result; 302 } 303 304 // This function helps simulate the progress of load states on a ConnectJob. 305 // Each time it is called it advances the load state and posts a task to be 306 // called again. It stops at the last connecting load state (the one 307 // before LOAD_STATE_SENDING_REQUEST). 308 void AdvanceLoadState(LoadState state) { 309 int tmp = state; 310 tmp++; 311 if (tmp < LOAD_STATE_SENDING_REQUEST) { 312 state = static_cast<LoadState>(tmp); 313 set_load_state(state); 314 MessageLoop::current()->PostTask( 315 FROM_HERE, 316 method_factory_.NewRunnableMethod(&TestConnectJob::AdvanceLoadState, 317 state)); 318 } 319 } 320 321 bool waiting_success_; 322 const JobType job_type_; 323 MockClientSocketFactory* const client_socket_factory_; 324 ScopedRunnableMethodFactory<TestConnectJob> method_factory_; 325 LoadState load_state_; 326 bool store_additional_error_state_; 327 328 DISALLOW_COPY_AND_ASSIGN(TestConnectJob); 329 }; 330 331 class TestConnectJobFactory 332 : public TestClientSocketPoolBase::ConnectJobFactory { 333 public: 334 explicit TestConnectJobFactory(MockClientSocketFactory* client_socket_factory) 335 : job_type_(TestConnectJob::kMockJob), 336 client_socket_factory_(client_socket_factory) {} 337 338 virtual ~TestConnectJobFactory() {} 339 340 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; } 341 342 void set_timeout_duration(base::TimeDelta timeout_duration) { 343 timeout_duration_ = timeout_duration; 344 } 345 346 // ConnectJobFactory methods: 347 348 virtual ConnectJob* NewConnectJob( 349 const std::string& group_name, 350 const TestClientSocketPoolBase::Request& request, 351 ConnectJob::Delegate* delegate) const { 352 return new TestConnectJob(job_type_, 353 group_name, 354 request, 355 timeout_duration_, 356 delegate, 357 client_socket_factory_, 358 NULL); 359 } 360 361 virtual base::TimeDelta ConnectionTimeout() const { 362 return timeout_duration_; 363 } 364 365 private: 366 TestConnectJob::JobType job_type_; 367 base::TimeDelta timeout_duration_; 368 MockClientSocketFactory* const client_socket_factory_; 369 370 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory); 371 }; 372 373 class TestClientSocketPool : public ClientSocketPool { 374 public: 375 TestClientSocketPool( 376 int max_sockets, 377 int max_sockets_per_group, 378 ClientSocketPoolHistograms* histograms, 379 base::TimeDelta unused_idle_socket_timeout, 380 base::TimeDelta used_idle_socket_timeout, 381 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) 382 : base_(max_sockets, max_sockets_per_group, histograms, 383 unused_idle_socket_timeout, used_idle_socket_timeout, 384 connect_job_factory) {} 385 386 virtual ~TestClientSocketPool() {} 387 388 virtual int RequestSocket( 389 const std::string& group_name, 390 const void* params, 391 net::RequestPriority priority, 392 ClientSocketHandle* handle, 393 CompletionCallback* callback, 394 const BoundNetLog& net_log) { 395 const scoped_refptr<TestSocketParams>* casted_socket_params = 396 static_cast<const scoped_refptr<TestSocketParams>*>(params); 397 return base_.RequestSocket(group_name, *casted_socket_params, priority, 398 handle, callback, net_log); 399 } 400 401 virtual void RequestSockets(const std::string& group_name, 402 const void* params, 403 int num_sockets, 404 const BoundNetLog& net_log) { 405 const scoped_refptr<TestSocketParams>* casted_params = 406 static_cast<const scoped_refptr<TestSocketParams>*>(params); 407 408 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log); 409 } 410 411 virtual void CancelRequest( 412 const std::string& group_name, 413 ClientSocketHandle* handle) { 414 base_.CancelRequest(group_name, handle); 415 } 416 417 virtual void ReleaseSocket( 418 const std::string& group_name, 419 ClientSocket* socket, 420 int id) { 421 base_.ReleaseSocket(group_name, socket, id); 422 } 423 424 virtual void Flush() { 425 base_.Flush(); 426 } 427 428 virtual void CloseIdleSockets() { 429 base_.CloseIdleSockets(); 430 } 431 432 virtual int IdleSocketCount() const { return base_.idle_socket_count(); } 433 434 virtual int IdleSocketCountInGroup(const std::string& group_name) const { 435 return base_.IdleSocketCountInGroup(group_name); 436 } 437 438 virtual LoadState GetLoadState(const std::string& group_name, 439 const ClientSocketHandle* handle) const { 440 return base_.GetLoadState(group_name, handle); 441 } 442 443 virtual DictionaryValue* GetInfoAsValue(const std::string& name, 444 const std::string& type, 445 bool include_nested_pools) const { 446 return base_.GetInfoAsValue(name, type); 447 } 448 449 virtual base::TimeDelta ConnectionTimeout() const { 450 return base_.ConnectionTimeout(); 451 } 452 453 virtual ClientSocketPoolHistograms* histograms() const { 454 return base_.histograms(); 455 } 456 457 const TestClientSocketPoolBase* base() const { return &base_; } 458 459 int NumConnectJobsInGroup(const std::string& group_name) const { 460 return base_.NumConnectJobsInGroup(group_name); 461 } 462 463 int NumActiveSocketsInGroup(const std::string& group_name) const { 464 return base_.NumActiveSocketsInGroup(group_name); 465 } 466 467 bool HasGroup(const std::string& group_name) const { 468 return base_.HasGroup(group_name); 469 } 470 471 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); } 472 473 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); } 474 475 private: 476 TestClientSocketPoolBase base_; 477 478 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); 479 }; 480 481 } // namespace 482 483 REGISTER_SOCKET_PARAMS_FOR_POOL(TestClientSocketPool, TestSocketParams); 484 485 namespace { 486 487 void MockClientSocketFactory::SignalJobs() { 488 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); 489 it != waiting_jobs_.end(); ++it) { 490 (*it)->Signal(); 491 } 492 waiting_jobs_.clear(); 493 } 494 495 class TestConnectJobDelegate : public ConnectJob::Delegate { 496 public: 497 TestConnectJobDelegate() 498 : have_result_(false), waiting_for_result_(false), result_(OK) {} 499 virtual ~TestConnectJobDelegate() {} 500 501 virtual void OnConnectJobComplete(int result, ConnectJob* job) { 502 result_ = result; 503 scoped_ptr<ClientSocket> socket(job->ReleaseSocket()); 504 // socket.get() should be NULL iff result != OK 505 EXPECT_EQ(socket.get() == NULL, result != OK); 506 delete job; 507 have_result_ = true; 508 if (waiting_for_result_) 509 MessageLoop::current()->Quit(); 510 } 511 512 int WaitForResult() { 513 DCHECK(!waiting_for_result_); 514 while (!have_result_) { 515 waiting_for_result_ = true; 516 MessageLoop::current()->Run(); 517 waiting_for_result_ = false; 518 } 519 have_result_ = false; // auto-reset for next callback 520 return result_; 521 } 522 523 private: 524 bool have_result_; 525 bool waiting_for_result_; 526 int result_; 527 }; 528 529 class ClientSocketPoolBaseTest : public testing::Test { 530 protected: 531 ClientSocketPoolBaseTest() 532 : params_(new TestSocketParams()), 533 histograms_("ClientSocketPoolTest") { 534 connect_backup_jobs_enabled_ = 535 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled(); 536 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true); 537 cleanup_timer_enabled_ = 538 internal::ClientSocketPoolBaseHelper::cleanup_timer_enabled(); 539 } 540 541 virtual ~ClientSocketPoolBaseTest() { 542 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( 543 connect_backup_jobs_enabled_); 544 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled( 545 cleanup_timer_enabled_); 546 } 547 548 void CreatePool(int max_sockets, int max_sockets_per_group) { 549 CreatePoolWithIdleTimeouts( 550 max_sockets, 551 max_sockets_per_group, 552 base::TimeDelta::FromSeconds( 553 ClientSocketPool::unused_idle_socket_timeout()), 554 base::TimeDelta::FromSeconds(kUsedIdleSocketTimeout)); 555 } 556 557 void CreatePoolWithIdleTimeouts( 558 int max_sockets, int max_sockets_per_group, 559 base::TimeDelta unused_idle_socket_timeout, 560 base::TimeDelta used_idle_socket_timeout) { 561 DCHECK(!pool_.get()); 562 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_); 563 pool_.reset(new TestClientSocketPool(max_sockets, 564 max_sockets_per_group, 565 &histograms_, 566 unused_idle_socket_timeout, 567 used_idle_socket_timeout, 568 connect_job_factory_)); 569 } 570 571 int StartRequest(const std::string& group_name, 572 net::RequestPriority priority) { 573 return test_base_.StartRequestUsingPool< 574 TestClientSocketPool, TestSocketParams>( 575 pool_.get(), group_name, priority, params_); 576 } 577 578 int GetOrderOfRequest(size_t index) const { 579 return test_base_.GetOrderOfRequest(index); 580 } 581 582 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) { 583 return test_base_.ReleaseOneConnection(keep_alive); 584 } 585 586 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) { 587 test_base_.ReleaseAllConnections(keep_alive); 588 } 589 590 TestSocketRequest* request(int i) { return test_base_.request(i); } 591 size_t requests_size() const { return test_base_.requests_size(); } 592 ScopedVector<TestSocketRequest>* requests() { return test_base_.requests(); } 593 size_t completion_count() const { return test_base_.completion_count(); } 594 595 bool connect_backup_jobs_enabled_; 596 bool cleanup_timer_enabled_; 597 MockClientSocketFactory client_socket_factory_; 598 TestConnectJobFactory* connect_job_factory_; 599 scoped_refptr<TestSocketParams> params_; 600 ClientSocketPoolHistograms histograms_; 601 scoped_ptr<TestClientSocketPool> pool_; 602 ClientSocketPoolTest test_base_; 603 }; 604 605 // Even though a timeout is specified, it doesn't time out on a synchronous 606 // completion. 607 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { 608 TestConnectJobDelegate delegate; 609 ClientSocketHandle ignored; 610 TestClientSocketPoolBase::Request request( 611 &ignored, NULL, kDefaultPriority, 612 internal::ClientSocketPoolBaseHelper::NORMAL, 613 false, params_, BoundNetLog()); 614 scoped_ptr<TestConnectJob> job( 615 new TestConnectJob(TestConnectJob::kMockJob, 616 "a", 617 request, 618 base::TimeDelta::FromMicroseconds(1), 619 &delegate, 620 &client_socket_factory_, 621 NULL)); 622 EXPECT_EQ(OK, job->Connect()); 623 } 624 625 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { 626 TestConnectJobDelegate delegate; 627 ClientSocketHandle ignored; 628 CapturingNetLog log(CapturingNetLog::kUnbounded); 629 630 TestClientSocketPoolBase::Request request( 631 &ignored, NULL, kDefaultPriority, 632 internal::ClientSocketPoolBaseHelper::NORMAL, 633 false, params_, BoundNetLog()); 634 // Deleted by TestConnectJobDelegate. 635 TestConnectJob* job = 636 new TestConnectJob(TestConnectJob::kMockPendingJob, 637 "a", 638 request, 639 base::TimeDelta::FromMicroseconds(1), 640 &delegate, 641 &client_socket_factory_, 642 &log); 643 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); 644 base::PlatformThread::Sleep(1); 645 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult()); 646 647 net::CapturingNetLog::EntryList entries; 648 log.GetEntries(&entries); 649 650 EXPECT_EQ(6u, entries.size()); 651 EXPECT_TRUE(LogContainsBeginEvent( 652 entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 653 EXPECT_TRUE(LogContainsBeginEvent( 654 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); 655 EXPECT_TRUE(LogContainsEvent( 656 entries, 2, NetLog::TYPE_CONNECT_JOB_SET_SOCKET, 657 NetLog::PHASE_NONE)); 658 EXPECT_TRUE(LogContainsEvent( 659 entries, 3, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT, 660 NetLog::PHASE_NONE)); 661 EXPECT_TRUE(LogContainsEndEvent( 662 entries, 4, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT)); 663 EXPECT_TRUE(LogContainsEndEvent( 664 entries, 5, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 665 } 666 667 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { 668 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 669 670 TestCompletionCallback callback; 671 ClientSocketHandle handle; 672 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 673 674 EXPECT_EQ(OK, 675 handle.Init("a", 676 params_, 677 kDefaultPriority, 678 &callback, 679 pool_.get(), 680 log.bound())); 681 EXPECT_TRUE(handle.is_initialized()); 682 EXPECT_TRUE(handle.socket()); 683 handle.Reset(); 684 685 net::CapturingNetLog::EntryList entries; 686 log.GetEntries(&entries); 687 688 EXPECT_EQ(4u, entries.size()); 689 EXPECT_TRUE(LogContainsBeginEvent( 690 entries, 0, NetLog::TYPE_SOCKET_POOL)); 691 EXPECT_TRUE(LogContainsEvent( 692 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 693 NetLog::PHASE_NONE)); 694 EXPECT_TRUE(LogContainsEvent( 695 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, 696 NetLog::PHASE_NONE)); 697 EXPECT_TRUE(LogContainsEndEvent( 698 entries, 3, NetLog::TYPE_SOCKET_POOL)); 699 } 700 701 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { 702 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 703 704 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 705 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 706 707 ClientSocketHandle handle; 708 TestCompletionCallback callback; 709 // Set the additional error state members to ensure that they get cleared. 710 handle.set_is_ssl_error(true); 711 HttpResponseInfo info; 712 info.headers = new HttpResponseHeaders(""); 713 handle.set_ssl_error_response_info(info); 714 EXPECT_EQ(ERR_CONNECTION_FAILED, 715 handle.Init("a", 716 params_, 717 kDefaultPriority, 718 &callback, 719 pool_.get(), 720 log.bound())); 721 EXPECT_FALSE(handle.socket()); 722 EXPECT_FALSE(handle.is_ssl_error()); 723 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); 724 725 net::CapturingNetLog::EntryList entries; 726 log.GetEntries(&entries); 727 728 EXPECT_EQ(3u, entries.size()); 729 EXPECT_TRUE(LogContainsBeginEvent( 730 entries, 0, NetLog::TYPE_SOCKET_POOL)); 731 EXPECT_TRUE(LogContainsEvent( 732 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 733 NetLog::PHASE_NONE)); 734 EXPECT_TRUE(LogContainsEndEvent( 735 entries, 2, NetLog::TYPE_SOCKET_POOL)); 736 } 737 738 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { 739 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 740 741 // TODO(eroman): Check that the NetLog contains this event. 742 743 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 744 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 745 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority)); 746 EXPECT_EQ(OK, StartRequest("d", kDefaultPriority)); 747 748 EXPECT_EQ(static_cast<int>(requests_size()), 749 client_socket_factory_.allocation_count()); 750 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 751 752 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority)); 753 EXPECT_EQ(ERR_IO_PENDING, StartRequest("f", kDefaultPriority)); 754 EXPECT_EQ(ERR_IO_PENDING, StartRequest("g", kDefaultPriority)); 755 756 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 757 758 EXPECT_EQ(static_cast<int>(requests_size()), 759 client_socket_factory_.allocation_count()); 760 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 761 762 EXPECT_EQ(1, GetOrderOfRequest(1)); 763 EXPECT_EQ(2, GetOrderOfRequest(2)); 764 EXPECT_EQ(3, GetOrderOfRequest(3)); 765 EXPECT_EQ(4, GetOrderOfRequest(4)); 766 EXPECT_EQ(5, GetOrderOfRequest(5)); 767 EXPECT_EQ(6, GetOrderOfRequest(6)); 768 EXPECT_EQ(7, GetOrderOfRequest(7)); 769 770 // Make sure we test order of all requests made. 771 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); 772 } 773 774 TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) { 775 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 776 777 // TODO(eroman): Check that the NetLog contains this event. 778 779 // Reach all limits: max total sockets, and max sockets per group. 780 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 781 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 782 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 783 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 784 785 EXPECT_EQ(static_cast<int>(requests_size()), 786 client_socket_factory_.allocation_count()); 787 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 788 789 // Now create a new group and verify that we don't starve it. 790 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority)); 791 792 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 793 794 EXPECT_EQ(static_cast<int>(requests_size()), 795 client_socket_factory_.allocation_count()); 796 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 797 798 EXPECT_EQ(1, GetOrderOfRequest(1)); 799 EXPECT_EQ(2, GetOrderOfRequest(2)); 800 EXPECT_EQ(3, GetOrderOfRequest(3)); 801 EXPECT_EQ(4, GetOrderOfRequest(4)); 802 EXPECT_EQ(5, GetOrderOfRequest(5)); 803 804 // Make sure we test order of all requests made. 805 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6)); 806 } 807 808 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) { 809 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 810 811 EXPECT_EQ(OK, StartRequest("b", LOWEST)); 812 EXPECT_EQ(OK, StartRequest("a", MEDIUM)); 813 EXPECT_EQ(OK, StartRequest("b", HIGHEST)); 814 EXPECT_EQ(OK, StartRequest("a", LOWEST)); 815 816 EXPECT_EQ(static_cast<int>(requests_size()), 817 client_socket_factory_.allocation_count()); 818 819 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", LOWEST)); 820 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 821 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", HIGHEST)); 822 823 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 824 825 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 826 827 // First 4 requests don't have to wait, and finish in order. 828 EXPECT_EQ(1, GetOrderOfRequest(1)); 829 EXPECT_EQ(2, GetOrderOfRequest(2)); 830 EXPECT_EQ(3, GetOrderOfRequest(3)); 831 EXPECT_EQ(4, GetOrderOfRequest(4)); 832 833 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM), 834 // and then ("c", LOWEST). 835 EXPECT_EQ(7, GetOrderOfRequest(5)); 836 EXPECT_EQ(6, GetOrderOfRequest(6)); 837 EXPECT_EQ(5, GetOrderOfRequest(7)); 838 839 // Make sure we test order of all requests made. 840 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9)); 841 } 842 843 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) { 844 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 845 846 EXPECT_EQ(OK, StartRequest("a", LOWEST)); 847 EXPECT_EQ(OK, StartRequest("a", LOW)); 848 EXPECT_EQ(OK, StartRequest("b", HIGHEST)); 849 EXPECT_EQ(OK, StartRequest("b", MEDIUM)); 850 851 EXPECT_EQ(static_cast<int>(requests_size()), 852 client_socket_factory_.allocation_count()); 853 854 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", MEDIUM)); 855 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 856 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", HIGHEST)); 857 858 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 859 860 EXPECT_EQ(static_cast<int>(requests_size()), 861 client_socket_factory_.allocation_count()); 862 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count()); 863 864 // First 4 requests don't have to wait, and finish in order. 865 EXPECT_EQ(1, GetOrderOfRequest(1)); 866 EXPECT_EQ(2, GetOrderOfRequest(2)); 867 EXPECT_EQ(3, GetOrderOfRequest(3)); 868 EXPECT_EQ(4, GetOrderOfRequest(4)); 869 870 // Request ("b", 7) has the highest priority, but we can't make new socket for 871 // group "b", because it has reached the per-group limit. Then we make 872 // socket for ("c", 6), because it has higher priority than ("a", 4), 873 // and we still can't make a socket for group "b". 874 EXPECT_EQ(5, GetOrderOfRequest(5)); 875 EXPECT_EQ(6, GetOrderOfRequest(6)); 876 EXPECT_EQ(7, GetOrderOfRequest(7)); 877 878 // Make sure we test order of all requests made. 879 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); 880 } 881 882 // Make sure that we count connecting sockets against the total limit. 883 TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) { 884 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 885 886 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 887 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 888 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority)); 889 890 // Create one asynchronous request. 891 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 892 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", kDefaultPriority)); 893 894 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 895 // actually become pending until 2ms after they have been created. In order 896 // to flush all tasks, we need to wait so that we know there are no 897 // soon-to-be-pending tasks waiting. 898 base::PlatformThread::Sleep(10); 899 MessageLoop::current()->RunAllPending(); 900 901 // The next synchronous request should wait for its turn. 902 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 903 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority)); 904 905 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 906 907 EXPECT_EQ(static_cast<int>(requests_size()), 908 client_socket_factory_.allocation_count()); 909 910 EXPECT_EQ(1, GetOrderOfRequest(1)); 911 EXPECT_EQ(2, GetOrderOfRequest(2)); 912 EXPECT_EQ(3, GetOrderOfRequest(3)); 913 EXPECT_EQ(4, GetOrderOfRequest(4)); 914 EXPECT_EQ(5, GetOrderOfRequest(5)); 915 916 // Make sure we test order of all requests made. 917 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6)); 918 } 919 920 TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) { 921 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 922 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 923 924 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 925 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 926 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 927 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 928 929 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 930 931 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 932 933 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", kDefaultPriority)); 934 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority)); 935 936 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 937 938 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 939 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); 940 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 941 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); 942 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 943 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 944 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); 945 } 946 947 TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) { 948 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 949 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 950 951 ClientSocketHandle handle; 952 TestCompletionCallback callback; 953 EXPECT_EQ(ERR_IO_PENDING, 954 handle.Init("a", 955 params_, 956 kDefaultPriority, 957 &callback, 958 pool_.get(), 959 BoundNetLog())); 960 961 ClientSocketHandle handles[4]; 962 for (size_t i = 0; i < arraysize(handles); ++i) { 963 TestCompletionCallback callback; 964 EXPECT_EQ(ERR_IO_PENDING, 965 handles[i].Init("b", 966 params_, 967 kDefaultPriority, 968 &callback, 969 pool_.get(), 970 BoundNetLog())); 971 } 972 973 // One will be stalled, cancel all the handles now. 974 // This should hit the OnAvailableSocketSlot() code where we previously had 975 // stalled groups, but no longer have any. 976 for (size_t i = 0; i < arraysize(handles); ++i) 977 handles[i].Reset(); 978 } 979 980 TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) { 981 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 982 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 983 984 { 985 ClientSocketHandle handles[kDefaultMaxSockets]; 986 TestCompletionCallback callbacks[kDefaultMaxSockets]; 987 for (int i = 0; i < kDefaultMaxSockets; ++i) { 988 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), 989 params_, 990 kDefaultPriority, 991 &callbacks[i], 992 pool_.get(), 993 BoundNetLog())); 994 } 995 996 // Force a stalled group. 997 ClientSocketHandle stalled_handle; 998 TestCompletionCallback callback; 999 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1000 params_, 1001 kDefaultPriority, 1002 &callback, 1003 pool_.get(), 1004 BoundNetLog())); 1005 1006 // Cancel the stalled request. 1007 stalled_handle.Reset(); 1008 1009 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1010 EXPECT_EQ(0, pool_->IdleSocketCount()); 1011 1012 // Dropping out of scope will close all handles and return them to idle. 1013 } 1014 1015 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1016 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount()); 1017 } 1018 1019 TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) { 1020 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1021 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1022 1023 { 1024 ClientSocketHandle handles[kDefaultMaxSockets]; 1025 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1026 TestCompletionCallback callback; 1027 EXPECT_EQ(ERR_IO_PENDING, handles[i].Init(base::IntToString(i), 1028 params_, 1029 kDefaultPriority, 1030 &callback, 1031 pool_.get(), 1032 BoundNetLog())); 1033 } 1034 1035 // Force a stalled group. 1036 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1037 ClientSocketHandle stalled_handle; 1038 TestCompletionCallback callback; 1039 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1040 params_, 1041 kDefaultPriority, 1042 &callback, 1043 pool_.get(), 1044 BoundNetLog())); 1045 1046 // Since it is stalled, it should have no connect jobs. 1047 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); 1048 1049 // Cancel the stalled request. 1050 handles[0].Reset(); 1051 1052 // Now we should have a connect job. 1053 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo")); 1054 1055 // The stalled socket should connect. 1056 EXPECT_EQ(OK, callback.WaitForResult()); 1057 1058 EXPECT_EQ(kDefaultMaxSockets + 1, 1059 client_socket_factory_.allocation_count()); 1060 EXPECT_EQ(0, pool_->IdleSocketCount()); 1061 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); 1062 1063 // Dropping out of scope will close all handles and return them to idle. 1064 } 1065 1066 EXPECT_EQ(1, pool_->IdleSocketCount()); 1067 } 1068 1069 TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) { 1070 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1071 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1072 1073 ClientSocketHandle stalled_handle; 1074 TestCompletionCallback callback; 1075 { 1076 ClientSocketHandle handles[kDefaultMaxSockets]; 1077 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1078 TestCompletionCallback callback; 1079 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i), 1080 params_, 1081 kDefaultPriority, 1082 &callback, 1083 pool_.get(), 1084 BoundNetLog())); 1085 } 1086 1087 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1088 EXPECT_EQ(0, pool_->IdleSocketCount()); 1089 1090 // Now we will hit the socket limit. 1091 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", 1092 params_, 1093 kDefaultPriority, 1094 &callback, 1095 pool_.get(), 1096 BoundNetLog())); 1097 1098 // Dropping out of scope will close all handles and return them to idle. 1099 } 1100 1101 // But if we wait for it, the released idle sockets will be closed in 1102 // preference of the waiting request. 1103 EXPECT_EQ(OK, callback.WaitForResult()); 1104 1105 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); 1106 EXPECT_EQ(3, pool_->IdleSocketCount()); 1107 } 1108 1109 // Regression test for http://crbug.com/40952. 1110 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) { 1111 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1112 pool_->EnableConnectBackupJobs(); 1113 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1114 1115 for (int i = 0; i < kDefaultMaxSockets; ++i) { 1116 ClientSocketHandle handle; 1117 TestCompletionCallback callback; 1118 EXPECT_EQ(OK, handle.Init(base::IntToString(i), 1119 params_, 1120 kDefaultPriority, 1121 &callback, 1122 pool_.get(), 1123 BoundNetLog())); 1124 } 1125 1126 // Flush all the DoReleaseSocket tasks. 1127 MessageLoop::current()->RunAllPending(); 1128 1129 // Stall a group. Set a pending job so it'll trigger a backup job if we don't 1130 // reuse a socket. 1131 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1132 ClientSocketHandle handle; 1133 TestCompletionCallback callback; 1134 1135 // "0" is special here, since it should be the first entry in the sorted map, 1136 // which is the one which we would close an idle socket for. We shouldn't 1137 // close an idle socket though, since we should reuse the idle socket. 1138 EXPECT_EQ(OK, handle.Init("0", 1139 params_, 1140 kDefaultPriority, 1141 &callback, 1142 pool_.get(), 1143 BoundNetLog())); 1144 1145 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 1146 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); 1147 } 1148 1149 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { 1150 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1151 1152 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1153 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1154 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", IDLE)); 1155 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1156 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1157 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1158 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1159 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1160 1161 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); 1162 1163 EXPECT_EQ(kDefaultMaxSocketsPerGroup, 1164 client_socket_factory_.allocation_count()); 1165 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, 1166 completion_count()); 1167 1168 EXPECT_EQ(1, GetOrderOfRequest(1)); 1169 EXPECT_EQ(2, GetOrderOfRequest(2)); 1170 EXPECT_EQ(8, GetOrderOfRequest(3)); 1171 EXPECT_EQ(6, GetOrderOfRequest(4)); 1172 EXPECT_EQ(4, GetOrderOfRequest(5)); 1173 EXPECT_EQ(3, GetOrderOfRequest(6)); 1174 EXPECT_EQ(5, GetOrderOfRequest(7)); 1175 EXPECT_EQ(7, GetOrderOfRequest(8)); 1176 1177 // Make sure we test order of all requests made. 1178 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9)); 1179 } 1180 1181 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) { 1182 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1183 1184 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1185 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1186 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1187 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1188 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1189 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1190 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1191 1192 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE); 1193 1194 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) 1195 EXPECT_EQ(OK, request(i)->WaitForResult()); 1196 1197 EXPECT_EQ(static_cast<int>(requests_size()), 1198 client_socket_factory_.allocation_count()); 1199 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, 1200 completion_count()); 1201 } 1202 1203 // This test will start up a RequestSocket() and then immediately Cancel() it. 1204 // The pending connect job will be cancelled and should not call back into 1205 // ClientSocketPoolBase. 1206 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { 1207 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1208 1209 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1210 ClientSocketHandle handle; 1211 TestCompletionCallback callback; 1212 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1213 params_, 1214 kDefaultPriority, 1215 &callback, 1216 pool_.get(), 1217 BoundNetLog())); 1218 handle.Reset(); 1219 } 1220 1221 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { 1222 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1223 1224 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1225 ClientSocketHandle handle; 1226 TestCompletionCallback callback; 1227 1228 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1229 params_, 1230 kDefaultPriority, 1231 &callback, 1232 pool_.get(), 1233 BoundNetLog())); 1234 1235 handle.Reset(); 1236 1237 TestCompletionCallback callback2; 1238 EXPECT_EQ(ERR_IO_PENDING, 1239 handle.Init("a", 1240 params_, 1241 kDefaultPriority, 1242 &callback2, 1243 pool_.get(), 1244 BoundNetLog())); 1245 1246 EXPECT_EQ(OK, callback2.WaitForResult()); 1247 EXPECT_FALSE(callback.have_result()); 1248 1249 handle.Reset(); 1250 } 1251 1252 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { 1253 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1254 1255 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1256 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1257 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1258 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1259 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1260 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1261 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1262 1263 // Cancel a request. 1264 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2; 1265 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized()); 1266 (*requests())[index_to_cancel]->handle()->Reset(); 1267 1268 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE); 1269 1270 EXPECT_EQ(kDefaultMaxSocketsPerGroup, 1271 client_socket_factory_.allocation_count()); 1272 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1, 1273 completion_count()); 1274 1275 EXPECT_EQ(1, GetOrderOfRequest(1)); 1276 EXPECT_EQ(2, GetOrderOfRequest(2)); 1277 EXPECT_EQ(5, GetOrderOfRequest(3)); 1278 EXPECT_EQ(3, GetOrderOfRequest(4)); 1279 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, 1280 GetOrderOfRequest(5)); // Canceled request. 1281 EXPECT_EQ(4, GetOrderOfRequest(6)); 1282 EXPECT_EQ(6, GetOrderOfRequest(7)); 1283 1284 // Make sure we test order of all requests made. 1285 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8)); 1286 } 1287 1288 class RequestSocketCallback : public CallbackRunner< Tuple1<int> > { 1289 public: 1290 RequestSocketCallback(ClientSocketHandle* handle, 1291 TestClientSocketPool* pool, 1292 TestConnectJobFactory* test_connect_job_factory, 1293 TestConnectJob::JobType next_job_type) 1294 : handle_(handle), 1295 pool_(pool), 1296 within_callback_(false), 1297 test_connect_job_factory_(test_connect_job_factory), 1298 next_job_type_(next_job_type) {} 1299 1300 virtual void RunWithParams(const Tuple1<int>& params) { 1301 callback_.RunWithParams(params); 1302 ASSERT_EQ(OK, params.a); 1303 1304 if (!within_callback_) { 1305 test_connect_job_factory_->set_job_type(next_job_type_); 1306 1307 // Don't allow reuse of the socket. Disconnect it and then release it and 1308 // run through the MessageLoop once to get it completely released. 1309 handle_->socket()->Disconnect(); 1310 handle_->Reset(); 1311 { 1312 MessageLoop::ScopedNestableTaskAllower nestable( 1313 MessageLoop::current()); 1314 MessageLoop::current()->RunAllPending(); 1315 } 1316 within_callback_ = true; 1317 TestCompletionCallback next_job_callback; 1318 scoped_refptr<TestSocketParams> params(new TestSocketParams()); 1319 int rv = handle_->Init("a", 1320 params, 1321 kDefaultPriority, 1322 &next_job_callback, 1323 pool_, 1324 BoundNetLog()); 1325 switch (next_job_type_) { 1326 case TestConnectJob::kMockJob: 1327 EXPECT_EQ(OK, rv); 1328 break; 1329 case TestConnectJob::kMockPendingJob: 1330 EXPECT_EQ(ERR_IO_PENDING, rv); 1331 1332 // For pending jobs, wait for new socket to be created. This makes 1333 // sure there are no more pending operations nor any unclosed sockets 1334 // when the test finishes. 1335 // We need to give it a little bit of time to run, so that all the 1336 // operations that happen on timers (e.g. cleanup of idle 1337 // connections) can execute. 1338 { 1339 MessageLoop::ScopedNestableTaskAllower nestable( 1340 MessageLoop::current()); 1341 base::PlatformThread::Sleep(10); 1342 EXPECT_EQ(OK, next_job_callback.WaitForResult()); 1343 } 1344 break; 1345 default: 1346 FAIL() << "Unexpected job type: " << next_job_type_; 1347 break; 1348 } 1349 } 1350 } 1351 1352 int WaitForResult() { 1353 return callback_.WaitForResult(); 1354 } 1355 1356 private: 1357 ClientSocketHandle* const handle_; 1358 TestClientSocketPool* const pool_; 1359 bool within_callback_; 1360 TestConnectJobFactory* const test_connect_job_factory_; 1361 TestConnectJob::JobType next_job_type_; 1362 TestCompletionCallback callback_; 1363 }; 1364 1365 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { 1366 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1367 1368 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1369 ClientSocketHandle handle; 1370 RequestSocketCallback callback( 1371 &handle, pool_.get(), connect_job_factory_, 1372 TestConnectJob::kMockPendingJob); 1373 int rv = handle.Init("a", 1374 params_, 1375 kDefaultPriority, 1376 &callback, 1377 pool_.get(), 1378 BoundNetLog()); 1379 ASSERT_EQ(ERR_IO_PENDING, rv); 1380 1381 EXPECT_EQ(OK, callback.WaitForResult()); 1382 } 1383 1384 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { 1385 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1386 1387 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1388 ClientSocketHandle handle; 1389 RequestSocketCallback callback( 1390 &handle, pool_.get(), connect_job_factory_, TestConnectJob::kMockJob); 1391 int rv = handle.Init("a", 1392 params_, 1393 kDefaultPriority, 1394 &callback, 1395 pool_.get(), 1396 BoundNetLog()); 1397 ASSERT_EQ(ERR_IO_PENDING, rv); 1398 1399 EXPECT_EQ(OK, callback.WaitForResult()); 1400 } 1401 1402 // Make sure that pending requests get serviced after active requests get 1403 // cancelled. 1404 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { 1405 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1406 1407 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1408 1409 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1410 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1411 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1412 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1413 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1414 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1415 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1416 1417 // Now, kDefaultMaxSocketsPerGroup requests should be active. 1418 // Let's cancel them. 1419 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) { 1420 ASSERT_FALSE(request(i)->handle()->is_initialized()); 1421 request(i)->handle()->Reset(); 1422 } 1423 1424 // Let's wait for the rest to complete now. 1425 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) { 1426 EXPECT_EQ(OK, request(i)->WaitForResult()); 1427 request(i)->handle()->Reset(); 1428 } 1429 1430 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup, 1431 completion_count()); 1432 } 1433 1434 // Make sure that pending requests get serviced after active requests fail. 1435 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { 1436 const size_t kMaxSockets = 5; 1437 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); 1438 1439 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1440 1441 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; 1442 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang. 1443 1444 // Queue up all the requests 1445 for (size_t i = 0; i < kNumberOfRequests; ++i) 1446 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1447 1448 for (size_t i = 0; i < kNumberOfRequests; ++i) 1449 EXPECT_EQ(ERR_CONNECTION_FAILED, request(i)->WaitForResult()); 1450 } 1451 1452 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { 1453 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1454 1455 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1456 1457 ClientSocketHandle handle; 1458 TestCompletionCallback callback; 1459 int rv = handle.Init("a", 1460 params_, 1461 kDefaultPriority, 1462 &callback, 1463 pool_.get(), 1464 BoundNetLog()); 1465 EXPECT_EQ(ERR_IO_PENDING, rv); 1466 1467 // Cancel the active request. 1468 handle.Reset(); 1469 1470 rv = handle.Init("a", 1471 params_, 1472 kDefaultPriority, 1473 &callback, 1474 pool_.get(), 1475 BoundNetLog()); 1476 EXPECT_EQ(ERR_IO_PENDING, rv); 1477 EXPECT_EQ(OK, callback.WaitForResult()); 1478 1479 EXPECT_FALSE(handle.is_reused()); 1480 EXPECT_EQ(2, client_socket_factory_.allocation_count()); 1481 } 1482 1483 // Regression test for http://crbug.com/17985. 1484 TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) { 1485 const int kMaxSockets = 3; 1486 const int kMaxSocketsPerGroup = 2; 1487 CreatePool(kMaxSockets, kMaxSocketsPerGroup); 1488 1489 const RequestPriority kHighPriority = HIGHEST; 1490 1491 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1492 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1493 1494 // This is going to be a pending request in an otherwise empty group. 1495 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1496 1497 // Reach the maximum socket limit. 1498 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 1499 1500 // Create a stalled group with high priorities. 1501 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority)); 1502 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority)); 1503 1504 // Release the first two sockets from "a". Because this is a keepalive, 1505 // the first release will unblock the pending request for "a". The 1506 // second release will unblock a request for "c", becaue it is the next 1507 // high priority socket. 1508 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1509 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE)); 1510 1511 // Closing idle sockets should not get us into trouble, but in the bug 1512 // we were hitting a CHECK here. 1513 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 1514 pool_->CloseIdleSockets(); 1515 1516 MessageLoop::current()->RunAllPending(); // Run the released socket wakeups 1517 } 1518 1519 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { 1520 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1521 1522 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1523 ClientSocketHandle handle; 1524 TestCompletionCallback callback; 1525 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 1526 int rv = handle.Init("a", 1527 params_, 1528 LOWEST, 1529 &callback, 1530 pool_.get(), 1531 log.bound()); 1532 EXPECT_EQ(ERR_IO_PENDING, rv); 1533 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1534 EXPECT_EQ(OK, callback.WaitForResult()); 1535 EXPECT_TRUE(handle.is_initialized()); 1536 EXPECT_TRUE(handle.socket()); 1537 handle.Reset(); 1538 1539 net::CapturingNetLog::EntryList entries; 1540 log.GetEntries(&entries); 1541 1542 EXPECT_EQ(4u, entries.size()); 1543 EXPECT_TRUE(LogContainsBeginEvent( 1544 entries, 0, NetLog::TYPE_SOCKET_POOL)); 1545 EXPECT_TRUE(LogContainsEvent( 1546 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 1547 NetLog::PHASE_NONE)); 1548 EXPECT_TRUE(LogContainsEvent( 1549 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, 1550 NetLog::PHASE_NONE)); 1551 EXPECT_TRUE(LogContainsEndEvent( 1552 entries, 3, NetLog::TYPE_SOCKET_POOL)); 1553 } 1554 1555 TEST_F(ClientSocketPoolBaseTest, 1556 InitConnectionAsynchronousFailure) { 1557 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1558 1559 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1560 ClientSocketHandle handle; 1561 TestCompletionCallback callback; 1562 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 1563 // Set the additional error state members to ensure that they get cleared. 1564 handle.set_is_ssl_error(true); 1565 HttpResponseInfo info; 1566 info.headers = new HttpResponseHeaders(""); 1567 handle.set_ssl_error_response_info(info); 1568 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 1569 params_, 1570 kDefaultPriority, 1571 &callback, 1572 pool_.get(), 1573 log.bound())); 1574 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1575 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 1576 EXPECT_FALSE(handle.is_ssl_error()); 1577 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); 1578 1579 net::CapturingNetLog::EntryList entries; 1580 log.GetEntries(&entries); 1581 1582 EXPECT_EQ(3u, entries.size()); 1583 EXPECT_TRUE(LogContainsBeginEvent( 1584 entries, 0, NetLog::TYPE_SOCKET_POOL)); 1585 EXPECT_TRUE(LogContainsEvent( 1586 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB, 1587 NetLog::PHASE_NONE)); 1588 EXPECT_TRUE(LogContainsEndEvent( 1589 entries, 2, NetLog::TYPE_SOCKET_POOL)); 1590 } 1591 1592 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { 1593 // TODO(eroman): Add back the log expectations! Removed them because the 1594 // ordering is difficult, and some may fire during destructor. 1595 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1596 1597 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1598 ClientSocketHandle handle; 1599 TestCompletionCallback callback; 1600 ClientSocketHandle handle2; 1601 TestCompletionCallback callback2; 1602 1603 EXPECT_EQ(ERR_IO_PENDING, 1604 handle.Init("a", 1605 params_, 1606 kDefaultPriority, 1607 &callback, 1608 pool_.get(), 1609 BoundNetLog())); 1610 CapturingBoundNetLog log2(CapturingNetLog::kUnbounded); 1611 EXPECT_EQ(ERR_IO_PENDING, 1612 handle2.Init("a", 1613 params_, 1614 kDefaultPriority, 1615 &callback2, 1616 pool_.get(), 1617 BoundNetLog())); 1618 1619 handle.Reset(); 1620 1621 1622 // At this point, request 2 is just waiting for the connect job to finish. 1623 1624 EXPECT_EQ(OK, callback2.WaitForResult()); 1625 handle2.Reset(); 1626 1627 // Now request 2 has actually finished. 1628 // TODO(eroman): Add back log expectations. 1629 } 1630 1631 TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) { 1632 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1633 1634 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1635 1636 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1637 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1638 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1639 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1640 1641 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1642 (*requests())[2]->handle()->Reset(); 1643 (*requests())[3]->handle()->Reset(); 1644 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1645 1646 (*requests())[1]->handle()->Reset(); 1647 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1648 1649 (*requests())[0]->handle()->Reset(); 1650 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1651 } 1652 1653 // When requests and ConnectJobs are not coupled, the request will get serviced 1654 // by whatever comes first. 1655 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) { 1656 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1657 1658 // Start job 1 (async OK) 1659 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1660 1661 std::vector<TestSocketRequest*> request_order; 1662 size_t completion_count; // unused 1663 TestSocketRequest req1(&request_order, &completion_count); 1664 int rv = req1.handle()->Init("a", 1665 params_, 1666 kDefaultPriority, 1667 &req1, pool_.get(), 1668 BoundNetLog()); 1669 EXPECT_EQ(ERR_IO_PENDING, rv); 1670 EXPECT_EQ(OK, req1.WaitForResult()); 1671 1672 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending 1673 // without a job. 1674 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1675 1676 TestSocketRequest req2(&request_order, &completion_count); 1677 rv = req2.handle()->Init("a", 1678 params_, 1679 kDefaultPriority, 1680 &req2, 1681 pool_.get(), 1682 BoundNetLog()); 1683 EXPECT_EQ(ERR_IO_PENDING, rv); 1684 TestSocketRequest req3(&request_order, &completion_count); 1685 rv = req3.handle()->Init("a", 1686 params_, 1687 kDefaultPriority, 1688 &req3, 1689 pool_.get(), 1690 BoundNetLog()); 1691 EXPECT_EQ(ERR_IO_PENDING, rv); 1692 1693 // Both Requests 2 and 3 are pending. We release socket 1 which should 1694 // service request 2. Request 3 should still be waiting. 1695 req1.handle()->Reset(); 1696 MessageLoop::current()->RunAllPending(); // Run the released socket wakeups 1697 ASSERT_TRUE(req2.handle()->socket()); 1698 EXPECT_EQ(OK, req2.WaitForResult()); 1699 EXPECT_FALSE(req3.handle()->socket()); 1700 1701 // Signal job 2, which should service request 3. 1702 1703 client_socket_factory_.SignalJobs(); 1704 EXPECT_EQ(OK, req3.WaitForResult()); 1705 1706 ASSERT_EQ(3U, request_order.size()); 1707 EXPECT_EQ(&req1, request_order[0]); 1708 EXPECT_EQ(&req2, request_order[1]); 1709 EXPECT_EQ(&req3, request_order[2]); 1710 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 1711 } 1712 1713 // The requests are not coupled to the jobs. So, the requests should finish in 1714 // their priority / insertion order. 1715 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { 1716 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1717 // First two jobs are async. 1718 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1719 1720 std::vector<TestSocketRequest*> request_order; 1721 size_t completion_count; // unused 1722 TestSocketRequest req1(&request_order, &completion_count); 1723 int rv = req1.handle()->Init("a", 1724 params_, 1725 kDefaultPriority, 1726 &req1, 1727 pool_.get(), 1728 BoundNetLog()); 1729 EXPECT_EQ(ERR_IO_PENDING, rv); 1730 1731 TestSocketRequest req2(&request_order, &completion_count); 1732 rv = req2.handle()->Init("a", 1733 params_, 1734 kDefaultPriority, 1735 &req2, 1736 pool_.get(), 1737 BoundNetLog()); 1738 EXPECT_EQ(ERR_IO_PENDING, rv); 1739 1740 // The pending job is sync. 1741 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1742 1743 TestSocketRequest req3(&request_order, &completion_count); 1744 rv = req3.handle()->Init("a", 1745 params_, 1746 kDefaultPriority, 1747 &req3, 1748 pool_.get(), 1749 BoundNetLog()); 1750 EXPECT_EQ(ERR_IO_PENDING, rv); 1751 1752 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); 1753 EXPECT_EQ(OK, req2.WaitForResult()); 1754 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); 1755 1756 ASSERT_EQ(3U, request_order.size()); 1757 EXPECT_EQ(&req1, request_order[0]); 1758 EXPECT_EQ(&req2, request_order[1]); 1759 EXPECT_EQ(&req3, request_order[2]); 1760 } 1761 1762 TEST_F(ClientSocketPoolBaseTest, LoadState) { 1763 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1764 connect_job_factory_->set_job_type( 1765 TestConnectJob::kMockAdvancingLoadStateJob); 1766 1767 ClientSocketHandle handle; 1768 TestCompletionCallback callback; 1769 int rv = handle.Init("a", 1770 params_, 1771 kDefaultPriority, 1772 &callback, 1773 pool_.get(), 1774 BoundNetLog()); 1775 EXPECT_EQ(ERR_IO_PENDING, rv); 1776 EXPECT_EQ(LOAD_STATE_IDLE, handle.GetLoadState()); 1777 1778 MessageLoop::current()->RunAllPending(); 1779 1780 ClientSocketHandle handle2; 1781 TestCompletionCallback callback2; 1782 rv = handle2.Init("a", 1783 params_, 1784 kDefaultPriority, 1785 &callback2, pool_.get(), 1786 BoundNetLog()); 1787 EXPECT_EQ(ERR_IO_PENDING, rv); 1788 EXPECT_NE(LOAD_STATE_IDLE, handle.GetLoadState()); 1789 EXPECT_NE(LOAD_STATE_IDLE, handle2.GetLoadState()); 1790 } 1791 1792 TEST_F(ClientSocketPoolBaseTest, Recoverable) { 1793 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1794 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob); 1795 1796 ClientSocketHandle handle; 1797 TestCompletionCallback callback; 1798 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, handle.Init("a", 1799 params_, 1800 kDefaultPriority, 1801 &callback, pool_.get(), 1802 BoundNetLog())); 1803 EXPECT_TRUE(handle.is_initialized()); 1804 EXPECT_TRUE(handle.socket()); 1805 } 1806 1807 TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) { 1808 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1809 1810 connect_job_factory_->set_job_type( 1811 TestConnectJob::kMockPendingRecoverableJob); 1812 ClientSocketHandle handle; 1813 TestCompletionCallback callback; 1814 EXPECT_EQ(ERR_IO_PENDING, 1815 handle.Init("a", 1816 params_, 1817 kDefaultPriority, 1818 &callback, 1819 pool_.get(), 1820 BoundNetLog())); 1821 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1822 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); 1823 EXPECT_TRUE(handle.is_initialized()); 1824 EXPECT_TRUE(handle.socket()); 1825 } 1826 1827 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) { 1828 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1829 connect_job_factory_->set_job_type( 1830 TestConnectJob::kMockAdditionalErrorStateJob); 1831 1832 ClientSocketHandle handle; 1833 TestCompletionCallback callback; 1834 EXPECT_EQ(ERR_CONNECTION_FAILED, 1835 handle.Init("a", 1836 params_, 1837 kDefaultPriority, 1838 &callback, 1839 pool_.get(), 1840 BoundNetLog())); 1841 EXPECT_FALSE(handle.is_initialized()); 1842 EXPECT_FALSE(handle.socket()); 1843 EXPECT_TRUE(handle.is_ssl_error()); 1844 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); 1845 } 1846 1847 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) { 1848 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1849 1850 connect_job_factory_->set_job_type( 1851 TestConnectJob::kMockPendingAdditionalErrorStateJob); 1852 ClientSocketHandle handle; 1853 TestCompletionCallback callback; 1854 EXPECT_EQ(ERR_IO_PENDING, 1855 handle.Init("a", 1856 params_, 1857 kDefaultPriority, 1858 &callback, 1859 pool_.get(), 1860 BoundNetLog())); 1861 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1862 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); 1863 EXPECT_FALSE(handle.is_initialized()); 1864 EXPECT_FALSE(handle.socket()); 1865 EXPECT_TRUE(handle.is_ssl_error()); 1866 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); 1867 } 1868 1869 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimer) { 1870 // Disable cleanup timer. 1871 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); 1872 1873 CreatePoolWithIdleTimeouts( 1874 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 1875 base::TimeDelta::FromMilliseconds(10), // Time out unused sockets 1876 base::TimeDelta::FromMilliseconds(10)); // Time out used sockets 1877 1878 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1879 1880 // Startup two mock pending connect jobs, which will sit in the MessageLoop. 1881 1882 ClientSocketHandle handle; 1883 TestOldCompletionCallback callback; 1884 int rv = handle.Init("a", 1885 params_, 1886 LOWEST, 1887 &callback, 1888 pool_.get(), 1889 BoundNetLog()); 1890 EXPECT_EQ(ERR_IO_PENDING, rv); 1891 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1892 1893 ClientSocketHandle handle2; 1894 TestOldCompletionCallback callback2; 1895 rv = handle2.Init("a", 1896 params_, 1897 LOWEST, 1898 &callback2, 1899 pool_.get(), 1900 BoundNetLog()); 1901 EXPECT_EQ(ERR_IO_PENDING, rv); 1902 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); 1903 1904 // Cancel one of the requests. Wait for the other, which will get the first 1905 // job. Release the socket. Run the loop again to make sure the second 1906 // socket is sitting idle and the first one is released (since ReleaseSocket() 1907 // just posts a DoReleaseSocket() task). 1908 1909 handle.Reset(); 1910 EXPECT_EQ(OK, callback2.WaitForResult()); 1911 // Use the socket. 1912 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, NULL)); 1913 handle2.Reset(); 1914 1915 // The idle socket timeout value was set to 10 milliseconds. Wait 20 1916 // milliseconds so the sockets timeout. 1917 base::PlatformThread::Sleep(20); 1918 MessageLoop::current()->RunAllPending(); 1919 1920 ASSERT_EQ(2, pool_->IdleSocketCount()); 1921 1922 // Request a new socket. This should cleanup the unused and timed out ones. 1923 // A new socket will be created rather than reusing the idle one. 1924 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 1925 rv = handle.Init("a", 1926 params_, 1927 LOWEST, 1928 &callback, 1929 pool_.get(), 1930 log.bound()); 1931 EXPECT_EQ(ERR_IO_PENDING, rv); 1932 EXPECT_EQ(OK, callback.WaitForResult()); 1933 EXPECT_FALSE(handle.is_reused()); 1934 1935 // Make sure the idle socket is closed 1936 ASSERT_TRUE(pool_->HasGroup("a")); 1937 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 1938 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 1939 1940 net::CapturingNetLog::EntryList entries; 1941 log.GetEntries(&entries); 1942 EXPECT_FALSE(LogContainsEntryWithType( 1943 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); 1944 } 1945 1946 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSockets) { 1947 CreatePoolWithIdleTimeouts( 1948 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 1949 base::TimeDelta(), // Time out unused sockets immediately. 1950 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 1951 1952 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1953 1954 // Startup two mock pending connect jobs, which will sit in the MessageLoop. 1955 1956 ClientSocketHandle handle; 1957 TestCompletionCallback callback; 1958 int rv = handle.Init("a", 1959 params_, 1960 LOWEST, 1961 &callback, 1962 pool_.get(), 1963 BoundNetLog()); 1964 EXPECT_EQ(ERR_IO_PENDING, rv); 1965 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); 1966 1967 ClientSocketHandle handle2; 1968 TestCompletionCallback callback2; 1969 rv = handle2.Init("a", 1970 params_, 1971 LOWEST, 1972 &callback2, 1973 pool_.get(), 1974 BoundNetLog()); 1975 EXPECT_EQ(ERR_IO_PENDING, rv); 1976 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); 1977 1978 // Cancel one of the requests. Wait for the other, which will get the first 1979 // job. Release the socket. Run the loop again to make sure the second 1980 // socket is sitting idle and the first one is released (since ReleaseSocket() 1981 // just posts a DoReleaseSocket() task). 1982 1983 handle.Reset(); 1984 EXPECT_EQ(OK, callback2.WaitForResult()); 1985 // Use the socket. 1986 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, NULL)); 1987 handle2.Reset(); 1988 1989 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 1990 // actually become pending until 2ms after they have been created. In order 1991 // to flush all tasks, we need to wait so that we know there are no 1992 // soon-to-be-pending tasks waiting. 1993 base::PlatformThread::Sleep(10); 1994 MessageLoop::current()->RunAllPending(); 1995 1996 ASSERT_EQ(2, pool_->IdleSocketCount()); 1997 1998 // Invoke the idle socket cleanup check. Only one socket should be left, the 1999 // used socket. Request it to make sure that it's used. 2000 2001 pool_->CleanupTimedOutIdleSockets(); 2002 CapturingBoundNetLog log(CapturingNetLog::kUnbounded); 2003 rv = handle.Init("a", 2004 params_, 2005 LOWEST, 2006 &callback, 2007 pool_.get(), 2008 log.bound()); 2009 EXPECT_EQ(OK, rv); 2010 EXPECT_TRUE(handle.is_reused()); 2011 2012 net::CapturingNetLog::EntryList entries; 2013 log.GetEntries(&entries); 2014 EXPECT_TRUE(LogContainsEntryWithType( 2015 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); 2016 } 2017 2018 // Make sure that we process all pending requests even when we're stalling 2019 // because of multiple releasing disconnected sockets. 2020 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) { 2021 CreatePoolWithIdleTimeouts( 2022 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 2023 base::TimeDelta(), // Time out unused sockets immediately. 2024 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 2025 2026 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2027 2028 // Startup 4 connect jobs. Two of them will be pending. 2029 2030 ClientSocketHandle handle; 2031 TestCompletionCallback callback; 2032 int rv = handle.Init("a", 2033 params_, 2034 LOWEST, 2035 &callback, 2036 pool_.get(), 2037 BoundNetLog()); 2038 EXPECT_EQ(OK, rv); 2039 2040 ClientSocketHandle handle2; 2041 TestCompletionCallback callback2; 2042 rv = handle2.Init("a", 2043 params_, 2044 LOWEST, 2045 &callback2, 2046 pool_.get(), 2047 BoundNetLog()); 2048 EXPECT_EQ(OK, rv); 2049 2050 ClientSocketHandle handle3; 2051 TestCompletionCallback callback3; 2052 rv = handle3.Init("a", 2053 params_, 2054 LOWEST, 2055 &callback3, 2056 pool_.get(), 2057 BoundNetLog()); 2058 EXPECT_EQ(ERR_IO_PENDING, rv); 2059 2060 ClientSocketHandle handle4; 2061 TestCompletionCallback callback4; 2062 rv = handle4.Init("a", 2063 params_, 2064 LOWEST, 2065 &callback4, 2066 pool_.get(), 2067 BoundNetLog()); 2068 EXPECT_EQ(ERR_IO_PENDING, rv); 2069 2070 // Release two disconnected sockets. 2071 2072 handle.socket()->Disconnect(); 2073 handle.Reset(); 2074 handle2.socket()->Disconnect(); 2075 handle2.Reset(); 2076 2077 EXPECT_EQ(OK, callback3.WaitForResult()); 2078 EXPECT_FALSE(handle3.is_reused()); 2079 EXPECT_EQ(OK, callback4.WaitForResult()); 2080 EXPECT_FALSE(handle4.is_reused()); 2081 } 2082 2083 // Regression test for http://crbug.com/42267. 2084 // When DoReleaseSocket() is processed for one socket, it is blocked because the 2085 // other stalled groups all have releasing sockets, so no progress can be made. 2086 TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) { 2087 CreatePoolWithIdleTimeouts( 2088 4 /* socket limit */, 4 /* socket limit per group */, 2089 base::TimeDelta(), // Time out unused sockets immediately. 2090 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 2091 2092 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2093 2094 // Max out the socket limit with 2 per group. 2095 2096 ClientSocketHandle handle_a[4]; 2097 TestCompletionCallback callback_a[4]; 2098 ClientSocketHandle handle_b[4]; 2099 TestCompletionCallback callback_b[4]; 2100 2101 for (int i = 0; i < 2; ++i) { 2102 EXPECT_EQ(OK, handle_a[i].Init("a", 2103 params_, 2104 LOWEST, 2105 &callback_a[i], 2106 pool_.get(), 2107 BoundNetLog())); 2108 EXPECT_EQ(OK, handle_b[i].Init("b", 2109 params_, 2110 LOWEST, 2111 &callback_b[i], 2112 pool_.get(), 2113 BoundNetLog())); 2114 } 2115 2116 // Make 4 pending requests, 2 per group. 2117 2118 for (int i = 2; i < 4; ++i) { 2119 EXPECT_EQ(ERR_IO_PENDING, 2120 handle_a[i].Init("a", 2121 params_, 2122 LOWEST, 2123 &callback_a[i], 2124 pool_.get(), 2125 BoundNetLog())); 2126 EXPECT_EQ(ERR_IO_PENDING, 2127 handle_b[i].Init("b", 2128 params_, 2129 LOWEST, 2130 &callback_b[i], 2131 pool_.get(), 2132 BoundNetLog())); 2133 } 2134 2135 // Release b's socket first. The order is important, because in 2136 // DoReleaseSocket(), we'll process b's released socket, and since both b and 2137 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a' 2138 // first, which has a releasing socket, so it refuses to start up another 2139 // ConnectJob. So, we used to infinite loop on this. 2140 handle_b[0].socket()->Disconnect(); 2141 handle_b[0].Reset(); 2142 handle_a[0].socket()->Disconnect(); 2143 handle_a[0].Reset(); 2144 2145 // Used to get stuck here. 2146 MessageLoop::current()->RunAllPending(); 2147 2148 handle_b[1].socket()->Disconnect(); 2149 handle_b[1].Reset(); 2150 handle_a[1].socket()->Disconnect(); 2151 handle_a[1].Reset(); 2152 2153 for (int i = 2; i < 4; ++i) { 2154 EXPECT_EQ(OK, callback_b[i].WaitForResult()); 2155 EXPECT_EQ(OK, callback_a[i].WaitForResult()); 2156 } 2157 } 2158 2159 TEST_F(ClientSocketPoolBaseTest, 2160 ReleasingDisconnectedSocketsMaintainsPriorityOrder) { 2161 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2162 2163 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2164 2165 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 2166 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 2167 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 2168 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 2169 2170 EXPECT_EQ(OK, (*requests())[0]->WaitForResult()); 2171 EXPECT_EQ(OK, (*requests())[1]->WaitForResult()); 2172 EXPECT_EQ(2u, completion_count()); 2173 2174 // Releases one connection. 2175 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE)); 2176 EXPECT_EQ(OK, (*requests())[2]->WaitForResult()); 2177 2178 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE)); 2179 EXPECT_EQ(OK, (*requests())[3]->WaitForResult()); 2180 EXPECT_EQ(4u, completion_count()); 2181 2182 EXPECT_EQ(1, GetOrderOfRequest(1)); 2183 EXPECT_EQ(2, GetOrderOfRequest(2)); 2184 EXPECT_EQ(3, GetOrderOfRequest(3)); 2185 EXPECT_EQ(4, GetOrderOfRequest(4)); 2186 2187 // Make sure we test order of all requests made. 2188 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5)); 2189 } 2190 2191 class TestReleasingSocketRequest : public CallbackRunner< Tuple1<int> > { 2192 public: 2193 TestReleasingSocketRequest(TestClientSocketPool* pool, 2194 int expected_result, 2195 bool reset_releasing_handle) 2196 : pool_(pool), 2197 expected_result_(expected_result), 2198 reset_releasing_handle_(reset_releasing_handle) {} 2199 2200 ClientSocketHandle* handle() { return &handle_; } 2201 2202 int WaitForResult() { 2203 return callback_.WaitForResult(); 2204 } 2205 2206 virtual void RunWithParams(const Tuple1<int>& params) { 2207 callback_.RunWithParams(params); 2208 if (reset_releasing_handle_) 2209 handle_.Reset(); 2210 scoped_refptr<TestSocketParams> con_params(new TestSocketParams()); 2211 EXPECT_EQ(expected_result_, handle2_.Init("a", 2212 con_params, 2213 kDefaultPriority, 2214 &callback2_, 2215 pool_, 2216 BoundNetLog())); 2217 } 2218 2219 private: 2220 TestClientSocketPool* const pool_; 2221 int expected_result_; 2222 bool reset_releasing_handle_; 2223 ClientSocketHandle handle_; 2224 ClientSocketHandle handle2_; 2225 TestCompletionCallback callback_; 2226 TestCompletionCallback callback2_; 2227 }; 2228 2229 2230 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) { 2231 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2232 2233 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 2234 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 2235 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 2236 2237 EXPECT_EQ(static_cast<int>(requests_size()), 2238 client_socket_factory_.allocation_count()); 2239 2240 connect_job_factory_->set_job_type( 2241 TestConnectJob::kMockPendingAdditionalErrorStateJob); 2242 TestReleasingSocketRequest req(pool_.get(), OK, false); 2243 EXPECT_EQ(ERR_IO_PENDING, 2244 req.handle()->Init("a", 2245 params_, 2246 kDefaultPriority, 2247 &req, 2248 pool_.get(), 2249 BoundNetLog())); 2250 // The next job should complete synchronously 2251 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2252 2253 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); 2254 EXPECT_FALSE(req.handle()->is_initialized()); 2255 EXPECT_FALSE(req.handle()->socket()); 2256 EXPECT_TRUE(req.handle()->is_ssl_error()); 2257 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL); 2258 } 2259 2260 // http://crbug.com/44724 regression test. 2261 // We start releasing the pool when we flush on network change. When that 2262 // happens, the only active references are in the ClientSocketHandles. When a 2263 // ConnectJob completes and calls back into the last ClientSocketHandle, that 2264 // callback can release the last reference and delete the pool. After the 2265 // callback finishes, we go back to the stack frame within the now-deleted pool. 2266 // Executing any code that refers to members of the now-deleted pool can cause 2267 // crashes. 2268 TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) { 2269 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2270 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 2271 2272 ClientSocketHandle handle; 2273 TestCompletionCallback callback; 2274 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2275 params_, 2276 kDefaultPriority, 2277 &callback, 2278 pool_.get(), 2279 BoundNetLog())); 2280 2281 pool_->Flush(); 2282 2283 // We'll call back into this now. 2284 callback.WaitForResult(); 2285 } 2286 2287 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) { 2288 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2289 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2290 2291 ClientSocketHandle handle; 2292 TestCompletionCallback callback; 2293 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2294 params_, 2295 kDefaultPriority, 2296 &callback, 2297 pool_.get(), 2298 BoundNetLog())); 2299 EXPECT_EQ(OK, callback.WaitForResult()); 2300 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); 2301 2302 pool_->Flush(); 2303 2304 handle.Reset(); 2305 MessageLoop::current()->RunAllPending(); 2306 2307 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2308 params_, 2309 kDefaultPriority, 2310 &callback, 2311 pool_.get(), 2312 BoundNetLog())); 2313 EXPECT_EQ(OK, callback.WaitForResult()); 2314 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); 2315 } 2316 2317 class ConnectWithinCallback : public CallbackRunner< Tuple1<int> > { 2318 public: 2319 ConnectWithinCallback( 2320 const std::string& group_name, 2321 const scoped_refptr<TestSocketParams>& params, 2322 TestClientSocketPool* pool) 2323 : group_name_(group_name), params_(params), pool_(pool) {} 2324 2325 ~ConnectWithinCallback() {} 2326 2327 virtual void RunWithParams(const Tuple1<int>& params) { 2328 callback_.RunWithParams(params); 2329 EXPECT_EQ(ERR_IO_PENDING, 2330 handle_.Init(group_name_, 2331 params_, 2332 kDefaultPriority, 2333 &nested_callback_, 2334 pool_, 2335 BoundNetLog())); 2336 } 2337 2338 int WaitForResult() { 2339 return callback_.WaitForResult(); 2340 } 2341 2342 int WaitForNestedResult() { 2343 return nested_callback_.WaitForResult(); 2344 } 2345 2346 private: 2347 const std::string group_name_; 2348 const scoped_refptr<TestSocketParams> params_; 2349 TestClientSocketPool* const pool_; 2350 ClientSocketHandle handle_; 2351 TestCompletionCallback callback_; 2352 TestCompletionCallback nested_callback_; 2353 }; 2354 2355 TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) { 2356 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2357 2358 // First job will be waiting until it gets aborted. 2359 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2360 2361 ClientSocketHandle handle; 2362 ConnectWithinCallback callback("a", params_, pool_.get()); 2363 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", 2364 params_, 2365 kDefaultPriority, 2366 &callback, 2367 pool_.get(), 2368 BoundNetLog())); 2369 2370 // Second job will be started during the first callback, and will 2371 // asynchronously complete with OK. 2372 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2373 pool_->Flush(); 2374 EXPECT_EQ(ERR_ABORTED, callback.WaitForResult()); 2375 EXPECT_EQ(OK, callback.WaitForNestedResult()); 2376 } 2377 2378 // Cancel a pending socket request while we're at max sockets, 2379 // and verify that the backup socket firing doesn't cause a crash. 2380 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) { 2381 // Max 4 sockets globally, max 4 sockets per group. 2382 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2383 pool_->EnableConnectBackupJobs(); 2384 2385 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2386 // timer. 2387 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2388 ClientSocketHandle handle; 2389 TestCompletionCallback callback; 2390 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2391 params_, 2392 kDefaultPriority, 2393 &callback, 2394 pool_.get(), 2395 BoundNetLog())); 2396 2397 // Start (MaxSockets - 1) connected sockets to reach max sockets. 2398 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 2399 ClientSocketHandle handles[kDefaultMaxSockets]; 2400 for (int i = 1; i < kDefaultMaxSockets; ++i) { 2401 TestCompletionCallback callback; 2402 EXPECT_EQ(OK, handles[i].Init("bar", 2403 params_, 2404 kDefaultPriority, 2405 &callback, 2406 pool_.get(), 2407 BoundNetLog())); 2408 } 2409 2410 MessageLoop::current()->RunAllPending(); 2411 2412 // Cancel the pending request. 2413 handle.Reset(); 2414 2415 // Wait for the backup timer to fire (add some slop to ensure it fires) 2416 base::PlatformThread::Sleep( 2417 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3); 2418 2419 MessageLoop::current()->RunAllPending(); 2420 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); 2421 } 2422 2423 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) { 2424 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2425 pool_->EnableConnectBackupJobs(); 2426 2427 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2428 // timer. 2429 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2430 ClientSocketHandle handle; 2431 TestCompletionCallback callback; 2432 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2433 params_, 2434 kDefaultPriority, 2435 &callback, 2436 pool_.get(), 2437 BoundNetLog())); 2438 ASSERT_TRUE(pool_->HasGroup("bar")); 2439 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); 2440 2441 // Cancel the socket request. This should cancel the backup timer. Wait for 2442 // the backup time to see if it indeed got canceled. 2443 handle.Reset(); 2444 // Wait for the backup timer to fire (add some slop to ensure it fires) 2445 base::PlatformThread::Sleep( 2446 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3); 2447 MessageLoop::current()->RunAllPending(); 2448 ASSERT_TRUE(pool_->HasGroup("bar")); 2449 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); 2450 } 2451 2452 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) { 2453 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2454 pool_->EnableConnectBackupJobs(); 2455 2456 // Create the first socket and set to ERR_IO_PENDING. This starts the backup 2457 // timer. 2458 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2459 ClientSocketHandle handle; 2460 TestCompletionCallback callback; 2461 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", 2462 params_, 2463 kDefaultPriority, 2464 &callback, 2465 pool_.get(), 2466 BoundNetLog())); 2467 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2468 ClientSocketHandle handle2; 2469 TestCompletionCallback callback2; 2470 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("bar", 2471 params_, 2472 kDefaultPriority, 2473 &callback2, 2474 pool_.get(), 2475 BoundNetLog())); 2476 ASSERT_TRUE(pool_->HasGroup("bar")); 2477 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); 2478 2479 // Cancel request 1 and then complete request 2. With the requests finished, 2480 // the backup timer should be cancelled. 2481 handle.Reset(); 2482 EXPECT_EQ(OK, callback2.WaitForResult()); 2483 // Wait for the backup timer to fire (add some slop to ensure it fires) 2484 base::PlatformThread::Sleep( 2485 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3); 2486 MessageLoop::current()->RunAllPending(); 2487 } 2488 2489 // Test delayed socket binding for the case where we have two connects, 2490 // and while one is waiting on a connect, the other frees up. 2491 // The socket waiting on a connect should switch immediately to the freed 2492 // up socket. 2493 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) { 2494 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2495 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2496 2497 ClientSocketHandle handle1; 2498 TestCompletionCallback callback; 2499 EXPECT_EQ(ERR_IO_PENDING, 2500 handle1.Init("a", 2501 params_, 2502 kDefaultPriority, 2503 &callback, 2504 pool_.get(), 2505 BoundNetLog())); 2506 EXPECT_EQ(OK, callback.WaitForResult()); 2507 2508 // No idle sockets, no pending jobs. 2509 EXPECT_EQ(0, pool_->IdleSocketCount()); 2510 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2511 2512 // Create a second socket to the same host, but this one will wait. 2513 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2514 ClientSocketHandle handle2; 2515 EXPECT_EQ(ERR_IO_PENDING, 2516 handle2.Init("a", 2517 params_, 2518 kDefaultPriority, 2519 &callback, 2520 pool_.get(), 2521 BoundNetLog())); 2522 // No idle sockets, and one connecting job. 2523 EXPECT_EQ(0, pool_->IdleSocketCount()); 2524 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2525 2526 // Return the first handle to the pool. This will initiate the delayed 2527 // binding. 2528 handle1.Reset(); 2529 2530 MessageLoop::current()->RunAllPending(); 2531 2532 // Still no idle sockets, still one pending connect job. 2533 EXPECT_EQ(0, pool_->IdleSocketCount()); 2534 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2535 2536 // The second socket connected, even though it was a Waiting Job. 2537 EXPECT_EQ(OK, callback.WaitForResult()); 2538 2539 // And we can see there is still one job waiting. 2540 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2541 2542 // Finally, signal the waiting Connect. 2543 client_socket_factory_.SignalJobs(); 2544 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2545 2546 MessageLoop::current()->RunAllPending(); 2547 } 2548 2549 // Test delayed socket binding when a group is at capacity and one 2550 // of the group's sockets frees up. 2551 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) { 2552 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2553 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2554 2555 ClientSocketHandle handle1; 2556 TestCompletionCallback callback; 2557 EXPECT_EQ(ERR_IO_PENDING, 2558 handle1.Init("a", 2559 params_, 2560 kDefaultPriority, 2561 &callback, 2562 pool_.get(), 2563 BoundNetLog())); 2564 EXPECT_EQ(OK, callback.WaitForResult()); 2565 2566 // No idle sockets, no pending jobs. 2567 EXPECT_EQ(0, pool_->IdleSocketCount()); 2568 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2569 2570 // Create a second socket to the same host, but this one will wait. 2571 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2572 ClientSocketHandle handle2; 2573 EXPECT_EQ(ERR_IO_PENDING, 2574 handle2.Init("a", 2575 params_, 2576 kDefaultPriority, 2577 &callback, 2578 pool_.get(), 2579 BoundNetLog())); 2580 // No idle sockets, and one connecting job. 2581 EXPECT_EQ(0, pool_->IdleSocketCount()); 2582 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2583 2584 // Return the first handle to the pool. This will initiate the delayed 2585 // binding. 2586 handle1.Reset(); 2587 2588 MessageLoop::current()->RunAllPending(); 2589 2590 // Still no idle sockets, still one pending connect job. 2591 EXPECT_EQ(0, pool_->IdleSocketCount()); 2592 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2593 2594 // The second socket connected, even though it was a Waiting Job. 2595 EXPECT_EQ(OK, callback.WaitForResult()); 2596 2597 // And we can see there is still one job waiting. 2598 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2599 2600 // Finally, signal the waiting Connect. 2601 client_socket_factory_.SignalJobs(); 2602 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2603 2604 MessageLoop::current()->RunAllPending(); 2605 } 2606 2607 // Test out the case where we have one socket connected, one 2608 // connecting, when the first socket finishes and goes idle. 2609 // Although the second connection is pending, the second request 2610 // should complete, by taking the first socket's idle socket. 2611 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) { 2612 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2613 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2614 2615 ClientSocketHandle handle1; 2616 TestCompletionCallback callback; 2617 EXPECT_EQ(ERR_IO_PENDING, 2618 handle1.Init("a", 2619 params_, 2620 kDefaultPriority, 2621 &callback, 2622 pool_.get(), 2623 BoundNetLog())); 2624 EXPECT_EQ(OK, callback.WaitForResult()); 2625 2626 // No idle sockets, no pending jobs. 2627 EXPECT_EQ(0, pool_->IdleSocketCount()); 2628 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2629 2630 // Create a second socket to the same host, but this one will wait. 2631 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 2632 ClientSocketHandle handle2; 2633 EXPECT_EQ(ERR_IO_PENDING, 2634 handle2.Init("a", 2635 params_, 2636 kDefaultPriority, 2637 &callback, 2638 pool_.get(), 2639 BoundNetLog())); 2640 // No idle sockets, and one connecting job. 2641 EXPECT_EQ(0, pool_->IdleSocketCount()); 2642 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2643 2644 // Return the first handle to the pool. This will initiate the delayed 2645 // binding. 2646 handle1.Reset(); 2647 2648 MessageLoop::current()->RunAllPending(); 2649 2650 // Still no idle sockets, still one pending connect job. 2651 EXPECT_EQ(0, pool_->IdleSocketCount()); 2652 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2653 2654 // The second socket connected, even though it was a Waiting Job. 2655 EXPECT_EQ(OK, callback.WaitForResult()); 2656 2657 // And we can see there is still one job waiting. 2658 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2659 2660 // Finally, signal the waiting Connect. 2661 client_socket_factory_.SignalJobs(); 2662 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2663 2664 MessageLoop::current()->RunAllPending(); 2665 } 2666 2667 // Cover the case where on an available socket slot, we have one pending 2668 // request that completes synchronously, thereby making the Group empty. 2669 TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) { 2670 const int kUnlimitedSockets = 100; 2671 const int kOneSocketPerGroup = 1; 2672 CreatePool(kUnlimitedSockets, kOneSocketPerGroup); 2673 2674 // Make the first request asynchronous fail. 2675 // This will free up a socket slot later. 2676 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 2677 2678 ClientSocketHandle handle1; 2679 TestCompletionCallback callback1; 2680 EXPECT_EQ(ERR_IO_PENDING, 2681 handle1.Init("a", 2682 params_, 2683 kDefaultPriority, 2684 &callback1, 2685 pool_.get(), 2686 BoundNetLog())); 2687 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2688 2689 // Make the second request synchronously fail. This should make the Group 2690 // empty. 2691 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 2692 ClientSocketHandle handle2; 2693 TestCompletionCallback callback2; 2694 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail 2695 // when created. 2696 EXPECT_EQ(ERR_IO_PENDING, 2697 handle2.Init("a", 2698 params_, 2699 kDefaultPriority, 2700 &callback2, 2701 pool_.get(), 2702 BoundNetLog())); 2703 2704 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2705 2706 EXPECT_EQ(ERR_CONNECTION_FAILED, callback1.WaitForResult()); 2707 EXPECT_EQ(ERR_CONNECTION_FAILED, callback2.WaitForResult()); 2708 EXPECT_FALSE(pool_->HasGroup("a")); 2709 } 2710 2711 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) { 2712 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2713 2714 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2715 2716 ClientSocketHandle handle1; 2717 TestCompletionCallback callback1; 2718 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 2719 params_, 2720 kDefaultPriority, 2721 &callback1, 2722 pool_.get(), 2723 BoundNetLog())); 2724 2725 ClientSocketHandle handle2; 2726 TestCompletionCallback callback2; 2727 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 2728 params_, 2729 kDefaultPriority, 2730 &callback2, 2731 pool_.get(), 2732 BoundNetLog())); 2733 ClientSocketHandle handle3; 2734 TestCompletionCallback callback3; 2735 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", 2736 params_, 2737 kDefaultPriority, 2738 &callback3, 2739 pool_.get(), 2740 BoundNetLog())); 2741 2742 EXPECT_EQ(OK, callback1.WaitForResult()); 2743 EXPECT_EQ(OK, callback2.WaitForResult()); 2744 EXPECT_EQ(OK, callback3.WaitForResult()); 2745 2746 // Use the socket. 2747 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, NULL)); 2748 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, NULL)); 2749 2750 handle1.Reset(); 2751 handle2.Reset(); 2752 handle3.Reset(); 2753 2754 EXPECT_EQ(OK, handle1.Init("a", 2755 params_, 2756 kDefaultPriority, 2757 &callback1, 2758 pool_.get(), 2759 BoundNetLog())); 2760 EXPECT_EQ(OK, handle2.Init("a", 2761 params_, 2762 kDefaultPriority, 2763 &callback2, 2764 pool_.get(), 2765 BoundNetLog())); 2766 EXPECT_EQ(OK, handle3.Init("a", 2767 params_, 2768 kDefaultPriority, 2769 &callback3, 2770 pool_.get(), 2771 BoundNetLog())); 2772 2773 EXPECT_TRUE(handle1.socket()->WasEverUsed()); 2774 EXPECT_TRUE(handle2.socket()->WasEverUsed()); 2775 EXPECT_FALSE(handle3.socket()->WasEverUsed()); 2776 } 2777 2778 TEST_F(ClientSocketPoolBaseTest, RequestSockets) { 2779 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2780 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2781 2782 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 2783 2784 ASSERT_TRUE(pool_->HasGroup("a")); 2785 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 2786 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2787 2788 ClientSocketHandle handle1; 2789 TestCompletionCallback callback1; 2790 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 2791 params_, 2792 kDefaultPriority, 2793 &callback1, 2794 pool_.get(), 2795 BoundNetLog())); 2796 2797 ClientSocketHandle handle2; 2798 TestCompletionCallback callback2; 2799 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 2800 params_, 2801 kDefaultPriority, 2802 &callback2, 2803 pool_.get(), 2804 BoundNetLog())); 2805 2806 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 2807 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2808 2809 EXPECT_EQ(OK, callback1.WaitForResult()); 2810 EXPECT_EQ(OK, callback2.WaitForResult()); 2811 handle1.Reset(); 2812 handle2.Reset(); 2813 2814 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2815 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 2816 } 2817 2818 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { 2819 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 2820 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2821 2822 ClientSocketHandle handle1; 2823 TestCompletionCallback callback1; 2824 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 2825 params_, 2826 kDefaultPriority, 2827 &callback1, 2828 pool_.get(), 2829 BoundNetLog())); 2830 2831 ASSERT_TRUE(pool_->HasGroup("a")); 2832 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2833 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2834 2835 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 2836 2837 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 2838 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2839 2840 ClientSocketHandle handle2; 2841 TestCompletionCallback callback2; 2842 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 2843 params_, 2844 kDefaultPriority, 2845 &callback2, 2846 pool_.get(), 2847 BoundNetLog())); 2848 2849 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 2850 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2851 2852 EXPECT_EQ(OK, callback1.WaitForResult()); 2853 EXPECT_EQ(OK, callback2.WaitForResult()); 2854 handle1.Reset(); 2855 handle2.Reset(); 2856 2857 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2858 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 2859 } 2860 2861 TEST_F(ClientSocketPoolBaseTest, 2862 RequestSocketsWhenAlreadyHaveMultipleConnectJob) { 2863 CreatePool(4, 4); 2864 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2865 2866 ClientSocketHandle handle1; 2867 TestCompletionCallback callback1; 2868 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 2869 params_, 2870 kDefaultPriority, 2871 &callback1, 2872 pool_.get(), 2873 BoundNetLog())); 2874 2875 ClientSocketHandle handle2; 2876 TestCompletionCallback callback2; 2877 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", 2878 params_, 2879 kDefaultPriority, 2880 &callback2, 2881 pool_.get(), 2882 BoundNetLog())); 2883 2884 ClientSocketHandle handle3; 2885 TestCompletionCallback callback3; 2886 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", 2887 params_, 2888 kDefaultPriority, 2889 &callback3, 2890 pool_.get(), 2891 BoundNetLog())); 2892 2893 ASSERT_TRUE(pool_->HasGroup("a")); 2894 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 2895 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2896 2897 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 2898 2899 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 2900 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2901 2902 EXPECT_EQ(OK, callback1.WaitForResult()); 2903 EXPECT_EQ(OK, callback2.WaitForResult()); 2904 EXPECT_EQ(OK, callback3.WaitForResult()); 2905 handle1.Reset(); 2906 handle2.Reset(); 2907 handle3.Reset(); 2908 2909 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2910 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a")); 2911 } 2912 2913 TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) { 2914 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2915 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2916 2917 ASSERT_FALSE(pool_->HasGroup("a")); 2918 2919 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSockets, 2920 BoundNetLog()); 2921 2922 ASSERT_TRUE(pool_->HasGroup("a")); 2923 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a")); 2924 2925 ASSERT_FALSE(pool_->HasGroup("b")); 2926 2927 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSockets, 2928 BoundNetLog()); 2929 2930 ASSERT_FALSE(pool_->HasGroup("b")); 2931 } 2932 2933 TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) { 2934 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); 2935 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2936 2937 ASSERT_FALSE(pool_->HasGroup("a")); 2938 2939 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSockets - 1, 2940 BoundNetLog()); 2941 2942 ASSERT_TRUE(pool_->HasGroup("a")); 2943 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a")); 2944 2945 ASSERT_FALSE(pool_->HasGroup("b")); 2946 2947 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSockets, 2948 BoundNetLog()); 2949 2950 ASSERT_TRUE(pool_->HasGroup("b")); 2951 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b")); 2952 } 2953 2954 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { 2955 CreatePool(4, 4); 2956 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2957 2958 ClientSocketHandle handle1; 2959 TestCompletionCallback callback1; 2960 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 2961 params_, 2962 kDefaultPriority, 2963 &callback1, 2964 pool_.get(), 2965 BoundNetLog())); 2966 ASSERT_EQ(OK, callback1.WaitForResult()); 2967 handle1.Reset(); 2968 2969 ASSERT_TRUE(pool_->HasGroup("a")); 2970 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2971 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 2972 2973 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 2974 2975 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 2976 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 2977 } 2978 2979 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { 2980 CreatePool(4, 4); 2981 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 2982 2983 ClientSocketHandle handle1; 2984 TestCompletionCallback callback1; 2985 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 2986 params_, 2987 kDefaultPriority, 2988 &callback1, 2989 pool_.get(), 2990 BoundNetLog())); 2991 ASSERT_EQ(OK, callback1.WaitForResult()); 2992 2993 ASSERT_TRUE(pool_->HasGroup("a")); 2994 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 2995 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 2996 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 2997 2998 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 2999 3000 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3001 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3002 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); 3003 } 3004 3005 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) { 3006 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3007 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 3008 3009 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSocketsPerGroup, 3010 BoundNetLog()); 3011 3012 ASSERT_TRUE(pool_->HasGroup("a")); 3013 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3014 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a")); 3015 3016 pool_->RequestSockets("b", ¶ms_, kDefaultMaxSocketsPerGroup, 3017 BoundNetLog()); 3018 3019 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); 3020 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b")); 3021 } 3022 3023 TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) { 3024 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3025 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 3026 3027 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSocketsPerGroup, 3028 BoundNetLog()); 3029 3030 ASSERT_FALSE(pool_->HasGroup("a")); 3031 3032 connect_job_factory_->set_job_type( 3033 TestConnectJob::kMockAdditionalErrorStateJob); 3034 pool_->RequestSockets("a", ¶ms_, kDefaultMaxSocketsPerGroup, 3035 BoundNetLog()); 3036 3037 ASSERT_FALSE(pool_->HasGroup("a")); 3038 } 3039 3040 TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) { 3041 CreatePool(4, 4); 3042 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3043 3044 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3045 3046 ASSERT_TRUE(pool_->HasGroup("a")); 3047 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3048 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3049 3050 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3051 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3052 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3053 3054 ClientSocketHandle handle1; 3055 TestCompletionCallback callback1; 3056 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3057 params_, 3058 kDefaultPriority, 3059 &callback1, 3060 pool_.get(), 3061 BoundNetLog())); 3062 ASSERT_EQ(OK, callback1.WaitForResult()); 3063 3064 ClientSocketHandle handle2; 3065 TestCompletionCallback callback2; 3066 int rv = handle2.Init("a", 3067 params_, 3068 kDefaultPriority, 3069 &callback2, 3070 pool_.get(), 3071 BoundNetLog()); 3072 if (rv != OK) { 3073 EXPECT_EQ(ERR_IO_PENDING, rv); 3074 EXPECT_EQ(OK, callback2.WaitForResult()); 3075 } 3076 3077 handle1.Reset(); 3078 handle2.Reset(); 3079 3080 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 3081 3082 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3083 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3084 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 3085 } 3086 3087 TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) { 3088 CreatePool(4, 4); 3089 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3090 3091 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); 3092 3093 ASSERT_TRUE(pool_->HasGroup("a")); 3094 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3095 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3096 3097 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3098 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); 3099 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3100 3101 pool_->RequestSockets("a", ¶ms_, 3, BoundNetLog()); 3102 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 3103 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3104 3105 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); 3106 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); 3107 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3108 } 3109 3110 TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) { 3111 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 3112 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3113 3114 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); 3115 3116 ASSERT_TRUE(pool_->HasGroup("a")); 3117 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3118 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3119 3120 ClientSocketHandle handle1; 3121 TestCompletionCallback callback1; 3122 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3123 params_, 3124 kDefaultPriority, 3125 &callback1, 3126 pool_.get(), 3127 BoundNetLog())); 3128 3129 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3130 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 3131 3132 ASSERT_EQ(OK, callback1.WaitForResult()); 3133 3134 handle1.Reset(); 3135 3136 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3137 } 3138 3139 // http://crbug.com/64940 regression test. 3140 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { 3141 const int kMaxTotalSockets = 3; 3142 const int kMaxSocketsPerGroup = 2; 3143 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup); 3144 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 3145 3146 // Note that group name ordering matters here. "a" comes before "b", so 3147 // CloseOneIdleSocket() will try to close "a"'s idle socket. 3148 3149 // Set up one idle socket in "a". 3150 ClientSocketHandle handle1; 3151 TestCompletionCallback callback1; 3152 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", 3153 params_, 3154 kDefaultPriority, 3155 &callback1, 3156 pool_.get(), 3157 BoundNetLog())); 3158 3159 ASSERT_EQ(OK, callback1.WaitForResult()); 3160 handle1.Reset(); 3161 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3162 3163 // Set up two active sockets in "b". 3164 ClientSocketHandle handle2; 3165 TestCompletionCallback callback2; 3166 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("b", 3167 params_, 3168 kDefaultPriority, 3169 &callback1, 3170 pool_.get(), 3171 BoundNetLog())); 3172 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("b", 3173 params_, 3174 kDefaultPriority, 3175 &callback2, 3176 pool_.get(), 3177 BoundNetLog())); 3178 3179 ASSERT_EQ(OK, callback1.WaitForResult()); 3180 ASSERT_EQ(OK, callback2.WaitForResult()); 3181 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); 3182 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); 3183 3184 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means 3185 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3. 3186 // Requesting 2 preconnected sockets for "a" should fail to allocate any more 3187 // sockets for "a", and "b" should still have 2 active sockets. 3188 3189 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3190 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); 3191 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3192 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); 3193 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); 3194 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); 3195 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); 3196 3197 // Now release the 2 active sockets for "b". This will give us 1 idle socket 3198 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for 3199 // "a" should result in closing 1 for "b". 3200 handle1.Reset(); 3201 handle2.Reset(); 3202 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b")); 3203 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b")); 3204 3205 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); 3206 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); 3207 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); 3208 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); 3209 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b")); 3210 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b")); 3211 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b")); 3212 } 3213 3214 } // namespace 3215 3216 } // namespace net 3217