1 // Copyright (c) 2009 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/compiler_specific.h" 8 #include "base/message_loop.h" 9 #include "base/platform_thread.h" 10 #include "base/scoped_vector.h" 11 #include "net/base/load_log.h" 12 #include "net/base/load_log_unittest.h" 13 #include "net/base/net_errors.h" 14 #include "net/base/request_priority.h" 15 #include "net/base/test_completion_callback.h" 16 #include "net/socket/client_socket.h" 17 #include "net/socket/client_socket_factory.h" 18 #include "net/socket/client_socket_handle.h" 19 #include "net/socket/socket_test_util.h" 20 #include "testing/gtest/include/gtest/gtest.h" 21 22 namespace net { 23 24 namespace { 25 26 const int kDefaultMaxSockets = 4; 27 const int kDefaultMaxSocketsPerGroup = 2; 28 const net::RequestPriority kDefaultPriority = MEDIUM; 29 30 typedef ClientSocketPoolBase<const void*> TestClientSocketPoolBase; 31 32 class MockClientSocket : public ClientSocket { 33 public: 34 MockClientSocket() : connected_(false) {} 35 36 // Socket methods: 37 virtual int Read( 38 IOBuffer* /* buf */, int /* len */, CompletionCallback* /* callback */) { 39 return ERR_UNEXPECTED; 40 } 41 42 virtual int Write( 43 IOBuffer* /* buf */, int /* len */, CompletionCallback* /* callback */) { 44 return ERR_UNEXPECTED; 45 } 46 virtual bool SetReceiveBufferSize(int32 size) { return true; }; 47 virtual bool SetSendBufferSize(int32 size) { return true; }; 48 49 // ClientSocket methods: 50 51 virtual int Connect(CompletionCallback* callback, LoadLog* load_log) { 52 connected_ = true; 53 return OK; 54 } 55 56 virtual void Disconnect() { connected_ = false; } 57 virtual bool IsConnected() const { return connected_; } 58 virtual bool IsConnectedAndIdle() const { return connected_; } 59 60 virtual int GetPeerName(struct sockaddr* /* name */, 61 socklen_t* /* namelen */) { 62 return ERR_UNEXPECTED; 63 } 64 65 private: 66 bool connected_; 67 68 DISALLOW_COPY_AND_ASSIGN(MockClientSocket); 69 }; 70 71 class TestConnectJob; 72 73 class MockClientSocketFactory : public ClientSocketFactory { 74 public: 75 MockClientSocketFactory() : allocation_count_(0) {} 76 77 virtual ClientSocket* CreateTCPClientSocket(const AddressList& addresses) { 78 allocation_count_++; 79 return NULL; 80 } 81 82 virtual SSLClientSocket* CreateSSLClientSocket( 83 ClientSocket* transport_socket, 84 const std::string& hostname, 85 const SSLConfig& ssl_config) { 86 NOTIMPLEMENTED(); 87 return NULL; 88 } 89 90 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); } 91 void SignalJobs(); 92 93 int allocation_count() const { return allocation_count_; } 94 95 private: 96 int allocation_count_; 97 std::vector<TestConnectJob*> waiting_jobs_; 98 }; 99 100 class TestConnectJob : public ConnectJob { 101 public: 102 enum JobType { 103 kMockJob, 104 kMockFailingJob, 105 kMockPendingJob, 106 kMockPendingFailingJob, 107 kMockWaitingJob, 108 kMockAdvancingLoadStateJob, 109 }; 110 111 TestConnectJob(JobType job_type, 112 const std::string& group_name, 113 const TestClientSocketPoolBase::Request& request, 114 base::TimeDelta timeout_duration, 115 ConnectJob::Delegate* delegate, 116 MockClientSocketFactory* client_socket_factory, 117 LoadLog* load_log) 118 : ConnectJob(group_name, timeout_duration, delegate, load_log), 119 job_type_(job_type), 120 client_socket_factory_(client_socket_factory), 121 method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 122 load_state_(LOAD_STATE_IDLE) {} 123 124 void Signal() { 125 DoConnect(waiting_success_, true /* async */); 126 } 127 128 virtual LoadState GetLoadState() const { return load_state_; } 129 130 private: 131 // ConnectJob methods: 132 133 virtual int ConnectInternal() { 134 AddressList ignored; 135 client_socket_factory_->CreateTCPClientSocket(ignored); 136 set_socket(new MockClientSocket()); 137 switch (job_type_) { 138 case kMockJob: 139 return DoConnect(true /* successful */, false /* sync */); 140 case kMockFailingJob: 141 return DoConnect(false /* error */, false /* sync */); 142 case kMockPendingJob: 143 set_load_state(LOAD_STATE_CONNECTING); 144 145 // Depending on execution timings, posting a delayed task can result 146 // in the task getting executed the at the earliest possible 147 // opportunity or only after returning once from the message loop and 148 // then a second call into the message loop. In order to make behavior 149 // more deterministic, we change the default delay to 2ms. This should 150 // always require us to wait for the second call into the message loop. 151 // 152 // N.B. The correct fix for this and similar timing problems is to 153 // abstract time for the purpose of unittests. Unfortunately, we have 154 // a lot of third-party components that directly call the various 155 // time functions, so this change would be rather invasive. 156 MessageLoop::current()->PostDelayedTask( 157 FROM_HERE, 158 method_factory_.NewRunnableMethod( 159 &TestConnectJob::DoConnect, 160 true /* successful */, 161 true /* async */), 162 2); 163 return ERR_IO_PENDING; 164 case kMockPendingFailingJob: 165 set_load_state(LOAD_STATE_CONNECTING); 166 MessageLoop::current()->PostDelayedTask( 167 FROM_HERE, 168 method_factory_.NewRunnableMethod( 169 &TestConnectJob::DoConnect, 170 false /* error */, 171 true /* async */), 172 2); 173 return ERR_IO_PENDING; 174 case kMockWaitingJob: 175 client_socket_factory_->WaitForSignal(this); 176 waiting_success_ = true; 177 return ERR_IO_PENDING; 178 case kMockAdvancingLoadStateJob: 179 MessageLoop::current()->PostDelayedTask( 180 FROM_HERE, 181 method_factory_.NewRunnableMethod( 182 &TestConnectJob::AdvanceLoadState, load_state_), 183 2); 184 return ERR_IO_PENDING; 185 default: 186 NOTREACHED(); 187 set_socket(NULL); 188 return ERR_FAILED; 189 } 190 } 191 192 void set_load_state(LoadState load_state) { load_state_ = load_state; } 193 194 int DoConnect(bool succeed, bool was_async) { 195 int result = ERR_CONNECTION_FAILED; 196 if (succeed) { 197 result = OK; 198 socket()->Connect(NULL, NULL); 199 } else { 200 set_socket(NULL); 201 } 202 203 if (was_async) 204 NotifyDelegateOfCompletion(result); 205 return result; 206 } 207 208 void AdvanceLoadState(LoadState state) { 209 int tmp = state; 210 tmp++; 211 state = static_cast<LoadState>(tmp); 212 set_load_state(state); 213 // Post a delayed task so RunAllPending() won't run it. 214 MessageLoop::current()->PostDelayedTask( 215 FROM_HERE, 216 method_factory_.NewRunnableMethod(&TestConnectJob::AdvanceLoadState, 217 state), 218 1 /* 1ms delay */); 219 } 220 221 bool waiting_success_; 222 const JobType job_type_; 223 MockClientSocketFactory* const client_socket_factory_; 224 ScopedRunnableMethodFactory<TestConnectJob> method_factory_; 225 LoadState load_state_; 226 227 DISALLOW_COPY_AND_ASSIGN(TestConnectJob); 228 }; 229 230 class TestConnectJobFactory 231 : public TestClientSocketPoolBase::ConnectJobFactory { 232 public: 233 explicit TestConnectJobFactory(MockClientSocketFactory* client_socket_factory) 234 : job_type_(TestConnectJob::kMockJob), 235 client_socket_factory_(client_socket_factory) {} 236 237 virtual ~TestConnectJobFactory() {} 238 239 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; } 240 241 void set_timeout_duration(base::TimeDelta timeout_duration) { 242 timeout_duration_ = timeout_duration; 243 } 244 245 // ConnectJobFactory methods: 246 247 virtual ConnectJob* NewConnectJob( 248 const std::string& group_name, 249 const TestClientSocketPoolBase::Request& request, 250 ConnectJob::Delegate* delegate, 251 LoadLog* load_log) const { 252 return new TestConnectJob(job_type_, 253 group_name, 254 request, 255 timeout_duration_, 256 delegate, 257 client_socket_factory_, 258 load_log); 259 } 260 261 private: 262 TestConnectJob::JobType job_type_; 263 base::TimeDelta timeout_duration_; 264 MockClientSocketFactory* const client_socket_factory_; 265 266 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory); 267 }; 268 269 class TestClientSocketPool : public ClientSocketPool { 270 public: 271 TestClientSocketPool( 272 int max_sockets, 273 int max_sockets_per_group, 274 base::TimeDelta unused_idle_socket_timeout, 275 base::TimeDelta used_idle_socket_timeout, 276 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) 277 : base_(max_sockets, max_sockets_per_group, 278 unused_idle_socket_timeout, used_idle_socket_timeout, 279 connect_job_factory, NULL) {} 280 281 virtual int RequestSocket( 282 const std::string& group_name, 283 const void* params, 284 net::RequestPriority priority, 285 ClientSocketHandle* handle, 286 CompletionCallback* callback, 287 LoadLog* load_log) { 288 return base_.RequestSocket( 289 group_name, params, priority, handle, callback, load_log); 290 } 291 292 virtual void CancelRequest( 293 const std::string& group_name, 294 const ClientSocketHandle* handle) { 295 base_.CancelRequest(group_name, handle); 296 } 297 298 virtual void ReleaseSocket( 299 const std::string& group_name, 300 ClientSocket* socket) { 301 base_.ReleaseSocket(group_name, socket); 302 } 303 304 virtual void CloseIdleSockets() { 305 base_.CloseIdleSockets(); 306 } 307 308 virtual int IdleSocketCount() const { return base_.idle_socket_count(); } 309 310 virtual int IdleSocketCountInGroup(const std::string& group_name) const { 311 return base_.IdleSocketCountInGroup(group_name); 312 } 313 314 virtual LoadState GetLoadState(const std::string& group_name, 315 const ClientSocketHandle* handle) const { 316 return base_.GetLoadState(group_name, handle); 317 } 318 319 const TestClientSocketPoolBase* base() const { return &base_; } 320 321 int NumConnectJobsInGroup(const std::string& group_name) const { 322 return base_.NumConnectJobsInGroup(group_name); 323 } 324 325 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); } 326 327 private: 328 ~TestClientSocketPool() {} 329 330 TestClientSocketPoolBase base_; 331 332 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); 333 }; 334 335 } // namespace 336 337 REGISTER_SOCKET_PARAMS_FOR_POOL(TestClientSocketPool, const void*); 338 339 namespace { 340 341 void MockClientSocketFactory::SignalJobs() { 342 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); 343 it != waiting_jobs_.end(); ++it) { 344 (*it)->Signal(); 345 } 346 waiting_jobs_.clear(); 347 } 348 349 class TestConnectJobDelegate : public ConnectJob::Delegate { 350 public: 351 TestConnectJobDelegate() 352 : have_result_(false), waiting_for_result_(false), result_(OK) {} 353 virtual ~TestConnectJobDelegate() {} 354 355 virtual void OnConnectJobComplete(int result, ConnectJob* job) { 356 result_ = result; 357 scoped_ptr<ClientSocket> socket(job->ReleaseSocket()); 358 // socket.get() should be NULL iff result != OK 359 EXPECT_EQ(socket.get() == NULL, result != OK); 360 delete job; 361 have_result_ = true; 362 if (waiting_for_result_) 363 MessageLoop::current()->Quit(); 364 } 365 366 int WaitForResult() { 367 DCHECK(!waiting_for_result_); 368 while (!have_result_) { 369 waiting_for_result_ = true; 370 MessageLoop::current()->Run(); 371 waiting_for_result_ = false; 372 } 373 have_result_ = false; // auto-reset for next callback 374 return result_; 375 } 376 377 private: 378 bool have_result_; 379 bool waiting_for_result_; 380 int result_; 381 }; 382 383 class ClientSocketPoolBaseTest : public ClientSocketPoolTest { 384 protected: 385 ClientSocketPoolBaseTest() {} 386 387 void CreatePool(int max_sockets, int max_sockets_per_group) { 388 CreatePoolWithIdleTimeouts( 389 max_sockets, 390 max_sockets_per_group, 391 base::TimeDelta::FromSeconds(kUnusedIdleSocketTimeout), 392 base::TimeDelta::FromSeconds(kUsedIdleSocketTimeout)); 393 } 394 395 void CreatePoolWithIdleTimeouts( 396 int max_sockets, int max_sockets_per_group, 397 base::TimeDelta unused_idle_socket_timeout, 398 base::TimeDelta used_idle_socket_timeout) { 399 DCHECK(!pool_.get()); 400 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_); 401 pool_ = new TestClientSocketPool(max_sockets, 402 max_sockets_per_group, 403 unused_idle_socket_timeout, 404 used_idle_socket_timeout, 405 connect_job_factory_); 406 } 407 408 int StartRequest(const std::string& group_name, 409 net::RequestPriority priority) { 410 return StartRequestUsingPool<TestClientSocketPool, const void*>( 411 pool_.get(), group_name, priority, NULL); 412 } 413 414 virtual void TearDown() { 415 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 416 // actually become pending until 2ms after they have been created. In order 417 // to flush all tasks, we need to wait so that we know there are no 418 // soon-to-be-pending tasks waiting. 419 PlatformThread::Sleep(10); 420 MessageLoop::current()->RunAllPending(); 421 422 // Need to delete |pool_| before we turn late binding back off. We also need 423 // to delete |requests_| because the pool is reference counted and requests 424 // keep reference to it. 425 // TODO(willchan): Remove this part when late binding becomes the default. 426 pool_ = NULL; 427 requests_.reset(); 428 429 ClientSocketPoolTest::TearDown(); 430 } 431 432 MockClientSocketFactory client_socket_factory_; 433 TestConnectJobFactory* connect_job_factory_; 434 scoped_refptr<TestClientSocketPool> pool_; 435 }; 436 437 // Helper function which explicitly specifies the template parameters, since 438 // the compiler will infer (in this case, incorrectly) that NULL is of type int. 439 int InitHandle(ClientSocketHandle* handle, 440 const std::string& group_name, 441 net::RequestPriority priority, 442 CompletionCallback* callback, 443 TestClientSocketPool* pool, 444 LoadLog* load_log) { 445 return handle->Init<const void*, TestClientSocketPool>( 446 group_name, NULL, priority, callback, pool, load_log); 447 } 448 449 // Even though a timeout is specified, it doesn't time out on a synchronous 450 // completion. 451 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { 452 TestConnectJobDelegate delegate; 453 ClientSocketHandle ignored; 454 TestClientSocketPoolBase::Request request( 455 &ignored, NULL, kDefaultPriority, NULL, NULL); 456 scoped_ptr<TestConnectJob> job( 457 new TestConnectJob(TestConnectJob::kMockJob, 458 "a", 459 request, 460 base::TimeDelta::FromMicroseconds(1), 461 &delegate, 462 &client_socket_factory_, 463 NULL)); 464 EXPECT_EQ(OK, job->Connect()); 465 } 466 467 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { 468 TestConnectJobDelegate delegate; 469 ClientSocketHandle ignored; 470 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 471 TestClientSocketPoolBase::Request request( 472 &ignored, NULL, kDefaultPriority, NULL, NULL); 473 // Deleted by TestConnectJobDelegate. 474 TestConnectJob* job = 475 new TestConnectJob(TestConnectJob::kMockPendingJob, 476 "a", 477 request, 478 base::TimeDelta::FromMicroseconds(1), 479 &delegate, 480 &client_socket_factory_, 481 log); 482 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); 483 PlatformThread::Sleep(1); 484 EXPECT_EQ(ERR_TIMED_OUT, delegate.WaitForResult()); 485 486 EXPECT_EQ(3u, log->entries().size()); 487 EXPECT_TRUE(LogContainsBeginEvent( 488 *log, 0, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 489 EXPECT_TRUE(LogContainsEvent( 490 *log, 1, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT, 491 LoadLog::PHASE_NONE)); 492 EXPECT_TRUE(LogContainsEndEvent( 493 *log, 2, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 494 } 495 496 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { 497 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 498 499 TestCompletionCallback callback; 500 ClientSocketHandle handle; 501 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 502 EXPECT_EQ(OK, InitHandle(&handle, "a", kDefaultPriority, 503 &callback, pool_.get(), log)); 504 EXPECT_TRUE(handle.is_initialized()); 505 EXPECT_TRUE(handle.socket()); 506 handle.Reset(); 507 508 EXPECT_EQ(4u, log->entries().size()); 509 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKET_POOL)); 510 EXPECT_TRUE(LogContainsBeginEvent( 511 *log, 1, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 512 EXPECT_TRUE(LogContainsEndEvent( 513 *log, 2, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 514 EXPECT_TRUE(LogContainsEndEvent(*log, 3, LoadLog::TYPE_SOCKET_POOL)); 515 } 516 517 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { 518 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 519 520 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); 521 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 522 TestSocketRequest req(&request_order_, &completion_count_); 523 EXPECT_EQ(ERR_CONNECTION_FAILED, 524 InitHandle(req.handle(), "a", kDefaultPriority, &req, 525 pool_.get(), log)); 526 527 EXPECT_EQ(4u, log->entries().size()); 528 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKET_POOL)); 529 EXPECT_TRUE(LogContainsBeginEvent( 530 *log, 1, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 531 EXPECT_TRUE(LogContainsEndEvent( 532 *log, 2, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 533 EXPECT_TRUE(LogContainsEndEvent(*log, 3, LoadLog::TYPE_SOCKET_POOL)); 534 } 535 536 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { 537 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 538 539 // TODO(eroman): Check that the LoadLog contains this event. 540 541 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 542 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 543 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority)); 544 EXPECT_EQ(OK, StartRequest("d", kDefaultPriority)); 545 546 EXPECT_EQ(static_cast<int>(requests_.size()), 547 client_socket_factory_.allocation_count()); 548 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_); 549 550 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority)); 551 EXPECT_EQ(ERR_IO_PENDING, StartRequest("f", kDefaultPriority)); 552 EXPECT_EQ(ERR_IO_PENDING, StartRequest("g", kDefaultPriority)); 553 554 ReleaseAllConnections(KEEP_ALIVE); 555 556 EXPECT_EQ(static_cast<int>(requests_.size()), 557 client_socket_factory_.allocation_count()); 558 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_); 559 560 EXPECT_EQ(1, GetOrderOfRequest(1)); 561 EXPECT_EQ(2, GetOrderOfRequest(2)); 562 EXPECT_EQ(3, GetOrderOfRequest(3)); 563 EXPECT_EQ(4, GetOrderOfRequest(4)); 564 EXPECT_EQ(5, GetOrderOfRequest(5)); 565 EXPECT_EQ(6, GetOrderOfRequest(6)); 566 EXPECT_EQ(7, GetOrderOfRequest(7)); 567 568 // Make sure we test order of all requests made. 569 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8)); 570 } 571 572 TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) { 573 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 574 575 // TODO(eroman): Check that the LoadLog contains this event. 576 577 // Reach all limits: max total sockets, and max sockets per group. 578 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 579 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 580 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 581 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 582 583 EXPECT_EQ(static_cast<int>(requests_.size()), 584 client_socket_factory_.allocation_count()); 585 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_); 586 587 // Now create a new group and verify that we don't starve it. 588 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority)); 589 590 ReleaseAllConnections(KEEP_ALIVE); 591 592 EXPECT_EQ(static_cast<int>(requests_.size()), 593 client_socket_factory_.allocation_count()); 594 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_); 595 596 EXPECT_EQ(1, GetOrderOfRequest(1)); 597 EXPECT_EQ(2, GetOrderOfRequest(2)); 598 EXPECT_EQ(3, GetOrderOfRequest(3)); 599 EXPECT_EQ(4, GetOrderOfRequest(4)); 600 EXPECT_EQ(5, GetOrderOfRequest(5)); 601 602 // Make sure we test order of all requests made. 603 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(6)); 604 } 605 606 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) { 607 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 608 609 EXPECT_EQ(OK, StartRequest("b", LOWEST)); 610 EXPECT_EQ(OK, StartRequest("a", MEDIUM)); 611 EXPECT_EQ(OK, StartRequest("b", HIGHEST)); 612 EXPECT_EQ(OK, StartRequest("a", LOWEST)); 613 614 EXPECT_EQ(static_cast<int>(requests_.size()), 615 client_socket_factory_.allocation_count()); 616 617 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", LOWEST)); 618 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 619 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", HIGHEST)); 620 621 ReleaseAllConnections(KEEP_ALIVE); 622 623 // We're re-using one socket for group "a", and one for "b". 624 EXPECT_EQ(static_cast<int>(requests_.size()) - 2, 625 client_socket_factory_.allocation_count()); 626 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_); 627 628 // First 4 requests don't have to wait, and finish in order. 629 EXPECT_EQ(1, GetOrderOfRequest(1)); 630 EXPECT_EQ(2, GetOrderOfRequest(2)); 631 EXPECT_EQ(3, GetOrderOfRequest(3)); 632 EXPECT_EQ(4, GetOrderOfRequest(4)); 633 634 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM), 635 // and then ("c", LOWEST). 636 EXPECT_EQ(7, GetOrderOfRequest(5)); 637 EXPECT_EQ(6, GetOrderOfRequest(6)); 638 EXPECT_EQ(5, GetOrderOfRequest(7)); 639 640 // Make sure we test order of all requests made. 641 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8)); 642 } 643 644 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) { 645 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 646 647 EXPECT_EQ(OK, StartRequest("a", LOWEST)); 648 EXPECT_EQ(OK, StartRequest("a", LOW)); 649 EXPECT_EQ(OK, StartRequest("b", HIGHEST)); 650 EXPECT_EQ(OK, StartRequest("b", MEDIUM)); 651 652 EXPECT_EQ(static_cast<int>(requests_.size()), 653 client_socket_factory_.allocation_count()); 654 655 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", MEDIUM)); 656 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 657 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", HIGHEST)); 658 659 ReleaseAllConnections(KEEP_ALIVE); 660 661 // We're re-using one socket for group "a", and one for "b". 662 EXPECT_EQ(static_cast<int>(requests_.size()) - 2, 663 client_socket_factory_.allocation_count()); 664 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, completion_count_); 665 666 // First 4 requests don't have to wait, and finish in order. 667 EXPECT_EQ(1, GetOrderOfRequest(1)); 668 EXPECT_EQ(2, GetOrderOfRequest(2)); 669 EXPECT_EQ(3, GetOrderOfRequest(3)); 670 EXPECT_EQ(4, GetOrderOfRequest(4)); 671 672 // Request ("b", 7) has the highest priority, but we can't make new socket for 673 // group "b", because it has reached the per-group limit. Then we make 674 // socket for ("c", 6), because it has higher priority than ("a", 4), 675 // and we still can't make a socket for group "b". 676 EXPECT_EQ(5, GetOrderOfRequest(5)); 677 EXPECT_EQ(6, GetOrderOfRequest(6)); 678 EXPECT_EQ(7, GetOrderOfRequest(7)); 679 680 // Make sure we test order of all requests made. 681 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8)); 682 } 683 684 // Make sure that we count connecting sockets against the total limit. 685 TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) { 686 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 687 688 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 689 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 690 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority)); 691 692 // Create one asynchronous request. 693 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 694 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", kDefaultPriority)); 695 696 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 697 // actually become pending until 2ms after they have been created. In order 698 // to flush all tasks, we need to wait so that we know there are no 699 // soon-to-be-pending tasks waiting. 700 PlatformThread::Sleep(10); 701 MessageLoop::current()->RunAllPending(); 702 703 // The next synchronous request should wait for its turn. 704 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 705 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority)); 706 707 ReleaseAllConnections(KEEP_ALIVE); 708 709 EXPECT_EQ(static_cast<int>(requests_.size()), 710 client_socket_factory_.allocation_count()); 711 712 EXPECT_EQ(1, GetOrderOfRequest(1)); 713 EXPECT_EQ(2, GetOrderOfRequest(2)); 714 EXPECT_EQ(3, GetOrderOfRequest(3)); 715 EXPECT_EQ(4, GetOrderOfRequest(4)); 716 EXPECT_EQ(5, GetOrderOfRequest(5)); 717 718 // Make sure we test order of all requests made. 719 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(6)); 720 } 721 722 // Inside ClientSocketPoolBase we have a may_have_stalled_group flag, 723 // which tells it to use more expensive, but accurate, group selection 724 // algorithm. Make sure it doesn't get stuck in the "on" state. 725 TEST_F(ClientSocketPoolBaseTest, MayHaveStalledGroupReset) { 726 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 727 728 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); 729 730 // Reach group socket limit. 731 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 732 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 733 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); 734 735 // Reach total limit, but don't request more sockets. 736 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 737 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 738 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); 739 740 // Request one more socket while we are at the maximum sockets limit. 741 // This should flip the may_have_stalled_group flag. 742 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority)); 743 EXPECT_TRUE(pool_->base()->may_have_stalled_group()); 744 745 // After releasing first connection for "a", we're still at the 746 // maximum sockets limit, but every group's pending queue is empty, 747 // so we reset the flag. 748 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE)); 749 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); 750 751 // Requesting additional socket while at the total limit should 752 // flip the flag back to "on". 753 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority)); 754 EXPECT_TRUE(pool_->base()->may_have_stalled_group()); 755 756 // We'll request one more socket to verify that we don't reset the flag 757 // too eagerly. 758 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", kDefaultPriority)); 759 EXPECT_TRUE(pool_->base()->may_have_stalled_group()); 760 761 // We're at the maximum socket limit, and still have one request pending 762 // for "d". Flag should be "on". 763 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE)); 764 EXPECT_TRUE(pool_->base()->may_have_stalled_group()); 765 766 // Now every group's pending queue should be empty again. 767 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE)); 768 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); 769 770 ReleaseAllConnections(KEEP_ALIVE); 771 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); 772 } 773 774 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { 775 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 776 777 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 778 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 779 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 780 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 781 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 782 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 783 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 784 785 ReleaseAllConnections(KEEP_ALIVE); 786 787 EXPECT_EQ(kDefaultMaxSocketsPerGroup, 788 client_socket_factory_.allocation_count()); 789 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, completion_count_); 790 791 EXPECT_EQ(1, GetOrderOfRequest(1)); 792 EXPECT_EQ(2, GetOrderOfRequest(2)); 793 EXPECT_EQ(6, GetOrderOfRequest(3)); 794 EXPECT_EQ(4, GetOrderOfRequest(4)); 795 EXPECT_EQ(3, GetOrderOfRequest(5)); 796 EXPECT_EQ(5, GetOrderOfRequest(6)); 797 EXPECT_EQ(7, GetOrderOfRequest(7)); 798 799 // Make sure we test order of all requests made. 800 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8)); 801 } 802 803 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) { 804 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 805 806 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 807 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 808 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 809 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 810 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 811 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 812 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 813 814 ReleaseAllConnections(NO_KEEP_ALIVE); 815 816 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i) 817 EXPECT_EQ(OK, requests_[i]->WaitForResult()); 818 819 EXPECT_EQ(static_cast<int>(requests_.size()), 820 client_socket_factory_.allocation_count()); 821 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, completion_count_); 822 } 823 824 // This test will start up a RequestSocket() and then immediately Cancel() it. 825 // The pending connect job will be cancelled and should not call back into 826 // ClientSocketPoolBase. 827 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { 828 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 829 830 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 831 TestSocketRequest req(&request_order_, &completion_count_); 832 EXPECT_EQ(ERR_IO_PENDING, 833 InitHandle(req.handle(), "a", kDefaultPriority, &req, 834 pool_.get(), NULL)); 835 req.handle()->Reset(); 836 } 837 838 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { 839 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 840 841 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 842 ClientSocketHandle handle; 843 TestCompletionCallback callback; 844 TestSocketRequest req(&request_order_, &completion_count_); 845 846 EXPECT_EQ(ERR_IO_PENDING, 847 InitHandle(&handle, "a", kDefaultPriority, &callback, 848 pool_.get(), NULL)); 849 850 handle.Reset(); 851 852 TestCompletionCallback callback2; 853 EXPECT_EQ(ERR_IO_PENDING, 854 InitHandle(&handle, "a", kDefaultPriority, &callback2, 855 pool_.get(), NULL)); 856 857 EXPECT_EQ(OK, callback2.WaitForResult()); 858 EXPECT_FALSE(callback.have_result()); 859 860 handle.Reset(); 861 } 862 863 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { 864 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 865 866 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 867 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 868 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 869 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 870 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 871 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 872 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 873 874 // Cancel a request. 875 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2; 876 EXPECT_FALSE(requests_[index_to_cancel]->handle()->is_initialized()); 877 requests_[index_to_cancel]->handle()->Reset(); 878 879 ReleaseAllConnections(KEEP_ALIVE); 880 881 EXPECT_EQ(kDefaultMaxSocketsPerGroup, 882 client_socket_factory_.allocation_count()); 883 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup - 1, 884 completion_count_); 885 886 EXPECT_EQ(1, GetOrderOfRequest(1)); 887 EXPECT_EQ(2, GetOrderOfRequest(2)); 888 EXPECT_EQ(5, GetOrderOfRequest(3)); 889 EXPECT_EQ(3, GetOrderOfRequest(4)); 890 EXPECT_EQ(kRequestNotFound, GetOrderOfRequest(5)); // Canceled request. 891 EXPECT_EQ(4, GetOrderOfRequest(6)); 892 EXPECT_EQ(6, GetOrderOfRequest(7)); 893 894 // Make sure we test order of all requests made. 895 EXPECT_EQ(kIndexOutOfBounds, GetOrderOfRequest(8)); 896 } 897 898 class RequestSocketCallback : public CallbackRunner< Tuple1<int> > { 899 public: 900 RequestSocketCallback(ClientSocketHandle* handle, 901 TestClientSocketPool* pool, 902 TestConnectJobFactory* test_connect_job_factory, 903 TestConnectJob::JobType next_job_type) 904 : handle_(handle), 905 pool_(pool), 906 within_callback_(false), 907 test_connect_job_factory_(test_connect_job_factory), 908 next_job_type_(next_job_type) {} 909 910 virtual void RunWithParams(const Tuple1<int>& params) { 911 callback_.RunWithParams(params); 912 ASSERT_EQ(OK, params.a); 913 914 if (!within_callback_) { 915 test_connect_job_factory_->set_job_type(next_job_type_); 916 917 // Don't allow reuse of the socket. Disconnect it and then release it and 918 // run through the MessageLoop once to get it completely released. 919 handle_->socket()->Disconnect(); 920 handle_->Reset(); 921 { 922 MessageLoop::ScopedNestableTaskAllower nestable( 923 MessageLoop::current()); 924 MessageLoop::current()->RunAllPending(); 925 } 926 within_callback_ = true; 927 TestCompletionCallback next_job_callback; 928 int rv = InitHandle( 929 handle_, "a", kDefaultPriority, &next_job_callback, pool_.get(), 930 NULL); 931 switch (next_job_type_) { 932 case TestConnectJob::kMockJob: 933 EXPECT_EQ(OK, rv); 934 break; 935 case TestConnectJob::kMockPendingJob: 936 EXPECT_EQ(ERR_IO_PENDING, rv); 937 938 // For pending jobs, wait for new socket to be created. This makes 939 // sure there are no more pending operations nor any unclosed sockets 940 // when the test finishes. 941 // We need to give it a little bit of time to run, so that all the 942 // operations that happen on timers (e.g. cleanup of idle 943 // connections) can execute. 944 { 945 MessageLoop::ScopedNestableTaskAllower nestable( 946 MessageLoop::current()); 947 PlatformThread::Sleep(10); 948 EXPECT_EQ(OK, next_job_callback.WaitForResult()); 949 } 950 break; 951 default: 952 FAIL() << "Unexpected job type: " << next_job_type_; 953 break; 954 } 955 } 956 } 957 958 int WaitForResult() { 959 return callback_.WaitForResult(); 960 } 961 962 private: 963 ClientSocketHandle* const handle_; 964 const scoped_refptr<TestClientSocketPool> pool_; 965 bool within_callback_; 966 TestConnectJobFactory* const test_connect_job_factory_; 967 TestConnectJob::JobType next_job_type_; 968 TestCompletionCallback callback_; 969 }; 970 971 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { 972 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 973 974 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 975 ClientSocketHandle handle; 976 RequestSocketCallback callback( 977 &handle, pool_.get(), connect_job_factory_, 978 TestConnectJob::kMockPendingJob); 979 int rv = InitHandle(&handle, "a", kDefaultPriority, &callback, 980 pool_.get(), NULL); 981 ASSERT_EQ(ERR_IO_PENDING, rv); 982 983 EXPECT_EQ(OK, callback.WaitForResult()); 984 } 985 986 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { 987 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 988 989 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 990 ClientSocketHandle handle; 991 RequestSocketCallback callback( 992 &handle, pool_.get(), connect_job_factory_, TestConnectJob::kMockJob); 993 int rv = InitHandle(&handle, "a", kDefaultPriority, &callback, 994 pool_.get(), NULL); 995 ASSERT_EQ(ERR_IO_PENDING, rv); 996 997 EXPECT_EQ(OK, callback.WaitForResult()); 998 } 999 1000 // Make sure that pending requests get serviced after active requests get 1001 // cancelled. 1002 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { 1003 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1004 1005 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1006 1007 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1008 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1009 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1010 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1011 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1012 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1013 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1014 1015 // Now, kDefaultMaxSocketsPerGroup requests should be active. 1016 // Let's cancel them. 1017 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) { 1018 ASSERT_FALSE(requests_[i]->handle()->is_initialized()); 1019 requests_[i]->handle()->Reset(); 1020 } 1021 1022 // Let's wait for the rest to complete now. 1023 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i) { 1024 EXPECT_EQ(OK, requests_[i]->WaitForResult()); 1025 requests_[i]->handle()->Reset(); 1026 } 1027 1028 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, completion_count_); 1029 } 1030 1031 // Make sure that pending requests get serviced after active requests fail. 1032 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { 1033 const size_t kMaxSockets = 5; 1034 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); 1035 1036 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1037 1038 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; 1039 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang. 1040 1041 // Queue up all the requests 1042 for (size_t i = 0; i < kNumberOfRequests; ++i) 1043 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1044 1045 for (size_t i = 0; i < kNumberOfRequests; ++i) 1046 EXPECT_EQ(ERR_CONNECTION_FAILED, requests_[i]->WaitForResult()); 1047 } 1048 1049 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { 1050 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1051 1052 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1053 1054 TestSocketRequest req(&request_order_, &completion_count_); 1055 int rv = InitHandle(req.handle(), "a", kDefaultPriority, &req, 1056 pool_.get(), NULL); 1057 EXPECT_EQ(ERR_IO_PENDING, rv); 1058 1059 // Cancel the active request. 1060 req.handle()->Reset(); 1061 1062 rv = InitHandle(req.handle(), "a", kDefaultPriority, &req, 1063 pool_.get(), NULL); 1064 EXPECT_EQ(ERR_IO_PENDING, rv); 1065 EXPECT_EQ(OK, req.WaitForResult()); 1066 1067 EXPECT_FALSE(req.handle()->is_reused()); 1068 EXPECT_EQ(1U, completion_count_); 1069 EXPECT_EQ(2, client_socket_factory_.allocation_count()); 1070 } 1071 1072 // Regression test for http://crbug.com/17985. 1073 TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) { 1074 const int kMaxSockets = 3; 1075 const int kMaxSocketsPerGroup = 2; 1076 CreatePool(kMaxSockets, kMaxSocketsPerGroup); 1077 1078 const RequestPriority kHighPriority = HIGHEST; 1079 1080 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1081 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); 1082 1083 // This is going to be a pending request in an otherwise empty group. 1084 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); 1085 1086 // Reach the maximum socket limit. 1087 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); 1088 1089 // Create a stalled group with high priorities. 1090 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority)); 1091 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kHighPriority)); 1092 EXPECT_TRUE(pool_->base()->may_have_stalled_group()); 1093 1094 // Release the first two sockets from "a", which will make room 1095 // for requests from "c". After that "a" will have no active sockets 1096 // and one pending request. 1097 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE)); 1098 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE)); 1099 1100 // Closing idle sockets should not get us into trouble, but in the bug 1101 // we were hitting a CHECK here. 1102 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); 1103 pool_->CloseIdleSockets(); 1104 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 1105 } 1106 1107 class ClientSocketPoolBaseTest_LateBinding : public ClientSocketPoolBaseTest { 1108 protected: 1109 virtual void SetUp() { 1110 ClientSocketPoolBaseTest::SetUp(); 1111 } 1112 }; 1113 1114 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { 1115 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1116 1117 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1118 TestSocketRequest req(&request_order_, &completion_count_); 1119 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 1120 int rv = InitHandle(req.handle(), "a", LOWEST, &req, pool_.get(), log); 1121 EXPECT_EQ(ERR_IO_PENDING, rv); 1122 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", req.handle())); 1123 EXPECT_EQ(OK, req.WaitForResult()); 1124 EXPECT_TRUE(req.handle()->is_initialized()); 1125 EXPECT_TRUE(req.handle()->socket()); 1126 req.handle()->Reset(); 1127 1128 EXPECT_EQ(6u, log->entries().size()); 1129 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKET_POOL)); 1130 EXPECT_TRUE(LogContainsBeginEvent( 1131 *log, 1, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE)); 1132 EXPECT_TRUE(LogContainsEndEvent( 1133 *log, 2, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE)); 1134 EXPECT_TRUE(LogContainsBeginEvent( 1135 *log, 3, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 1136 EXPECT_TRUE(LogContainsEndEvent( 1137 *log, 4, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 1138 EXPECT_TRUE(LogContainsEndEvent( 1139 *log, 5, LoadLog::TYPE_SOCKET_POOL)); 1140 } 1141 1142 TEST_F(ClientSocketPoolBaseTest, 1143 InitConnectionAsynchronousFailure) { 1144 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1145 1146 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1147 TestSocketRequest req(&request_order_, &completion_count_); 1148 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 1149 EXPECT_EQ(ERR_IO_PENDING, 1150 InitHandle(req.handle(), "a", kDefaultPriority, &req, 1151 pool_.get(), log)); 1152 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", req.handle())); 1153 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); 1154 1155 EXPECT_EQ(6u, log->entries().size()); 1156 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKET_POOL)); 1157 EXPECT_TRUE(LogContainsBeginEvent( 1158 *log, 1, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE)); 1159 EXPECT_TRUE(LogContainsEndEvent( 1160 *log, 2, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE)); 1161 EXPECT_TRUE(LogContainsBeginEvent( 1162 *log, 3, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 1163 EXPECT_TRUE(LogContainsEndEvent( 1164 *log, 4, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 1165 EXPECT_TRUE(LogContainsEndEvent(*log, 5, LoadLog::TYPE_SOCKET_POOL)); 1166 } 1167 1168 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { 1169 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1170 1171 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1172 TestSocketRequest req(&request_order_, &completion_count_); 1173 TestSocketRequest req2(&request_order_, &completion_count_); 1174 1175 scoped_refptr<LoadLog> log1(new LoadLog(LoadLog::kUnbounded)); 1176 EXPECT_EQ(ERR_IO_PENDING, 1177 InitHandle(req.handle(), "a", kDefaultPriority, &req, 1178 pool_.get(), log1)); 1179 scoped_refptr<LoadLog> log2(new LoadLog(LoadLog::kUnbounded)); 1180 EXPECT_EQ(ERR_IO_PENDING, 1181 InitHandle(req2.handle(), "a", kDefaultPriority, &req2, 1182 pool_.get(), log2)); 1183 1184 req.handle()->Reset(); 1185 1186 EXPECT_EQ(5u, log1->entries().size()); 1187 EXPECT_TRUE(LogContainsBeginEvent(*log1, 0, LoadLog::TYPE_SOCKET_POOL)); 1188 EXPECT_TRUE(LogContainsBeginEvent( 1189 *log1, 1, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE)); 1190 EXPECT_TRUE(LogContainsEndEvent( 1191 *log1, 2, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE)); 1192 EXPECT_TRUE(LogContainsEvent( 1193 *log1, 3, LoadLog::TYPE_CANCELLED, LoadLog::PHASE_NONE)); 1194 EXPECT_TRUE(LogContainsEndEvent(*log1, 4, LoadLog::TYPE_SOCKET_POOL)); 1195 1196 // At this point, request 2 is just waiting for the connect job to finish. 1197 EXPECT_EQ(2u, log2->entries().size()); 1198 EXPECT_TRUE(LogContainsBeginEvent(*log2, 0, LoadLog::TYPE_SOCKET_POOL)); 1199 EXPECT_TRUE(LogContainsBeginEvent( 1200 *log2, 1, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE)); 1201 1202 EXPECT_EQ(OK, req2.WaitForResult()); 1203 req2.handle()->Reset(); 1204 1205 // Now request 2 has actually finished. 1206 EXPECT_EQ(6u, log2->entries().size()); 1207 EXPECT_TRUE(LogContainsBeginEvent(*log2, 0, LoadLog::TYPE_SOCKET_POOL)); 1208 EXPECT_TRUE(LogContainsBeginEvent( 1209 *log2, 1, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE)); 1210 EXPECT_TRUE(LogContainsEndEvent( 1211 *log1, 2, LoadLog::TYPE_SOCKET_POOL_WAITING_IN_QUEUE)); 1212 EXPECT_TRUE(LogContainsBeginEvent( 1213 *log2, 3, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 1214 EXPECT_TRUE(LogContainsEndEvent( 1215 *log2, 4, LoadLog::TYPE_SOCKET_POOL_CONNECT_JOB)); 1216 EXPECT_TRUE(LogContainsEndEvent(*log2, 5, LoadLog::TYPE_SOCKET_POOL)); 1217 1218 } 1219 1220 TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) { 1221 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1222 1223 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1224 1225 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST)); 1226 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW)); 1227 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM)); 1228 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST)); 1229 1230 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1231 requests_[2]->handle()->Reset(); 1232 requests_[3]->handle()->Reset(); 1233 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1234 1235 requests_[1]->handle()->Reset(); 1236 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a")); 1237 1238 requests_[0]->handle()->Reset(); 1239 EXPECT_EQ(kDefaultMaxSocketsPerGroup - 1, pool_->NumConnectJobsInGroup("a")); 1240 } 1241 1242 // When requests and ConnectJobs are not coupled, the request will get serviced 1243 // by whatever comes first. 1244 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) { 1245 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1246 1247 // Start job 1 (async OK) 1248 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1249 1250 TestSocketRequest req1(&request_order_, &completion_count_); 1251 int rv = InitHandle(req1.handle(), "a", kDefaultPriority, 1252 &req1, pool_.get(), NULL); 1253 EXPECT_EQ(ERR_IO_PENDING, rv); 1254 EXPECT_EQ(OK, req1.WaitForResult()); 1255 1256 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending 1257 // without a job. 1258 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); 1259 1260 TestSocketRequest req2(&request_order_, &completion_count_); 1261 rv = InitHandle(req2.handle(), "a", kDefaultPriority, &req2, 1262 pool_.get(), NULL); 1263 EXPECT_EQ(ERR_IO_PENDING, rv); 1264 TestSocketRequest req3(&request_order_, &completion_count_); 1265 rv = InitHandle( 1266 req3.handle(), "a", kDefaultPriority, &req3, pool_.get(), NULL); 1267 EXPECT_EQ(ERR_IO_PENDING, rv); 1268 1269 // Both Requests 2 and 3 are pending. We release socket 1 which should 1270 // service request 2. Request 3 should still be waiting. 1271 req1.handle()->Reset(); 1272 MessageLoop::current()->RunAllPending(); // Run the DoReleaseSocket() 1273 ASSERT_TRUE(req2.handle()->socket()); 1274 EXPECT_EQ(OK, req2.WaitForResult()); 1275 EXPECT_FALSE(req3.handle()->socket()); 1276 1277 // Signal job 2, which should service request 3. 1278 1279 client_socket_factory_.SignalJobs(); 1280 EXPECT_EQ(OK, req3.WaitForResult()); 1281 1282 ASSERT_EQ(3U, request_order_.size()); 1283 EXPECT_EQ(&req1, request_order_[0]); 1284 EXPECT_EQ(&req2, request_order_[1]); 1285 EXPECT_EQ(&req3, request_order_[2]); 1286 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); 1287 } 1288 1289 // The requests are not coupled to the jobs. So, the requests should finish in 1290 // their priority / insertion order. 1291 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { 1292 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1293 // First two jobs are async. 1294 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); 1295 1296 TestSocketRequest req1(&request_order_, &completion_count_); 1297 int rv = InitHandle( 1298 req1.handle(), "a", kDefaultPriority, &req1, pool_.get(), NULL); 1299 EXPECT_EQ(ERR_IO_PENDING, rv); 1300 1301 TestSocketRequest req2(&request_order_, &completion_count_); 1302 rv = InitHandle(req2.handle(), "a", kDefaultPriority, &req2, 1303 pool_.get(), NULL); 1304 EXPECT_EQ(ERR_IO_PENDING, rv); 1305 1306 // The pending job is sync. 1307 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1308 1309 TestSocketRequest req3(&request_order_, &completion_count_); 1310 rv = InitHandle( 1311 req3.handle(), "a", kDefaultPriority, &req3, pool_.get(), NULL); 1312 EXPECT_EQ(ERR_IO_PENDING, rv); 1313 1314 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); 1315 EXPECT_EQ(OK, req2.WaitForResult()); 1316 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); 1317 1318 ASSERT_EQ(3U, request_order_.size()); 1319 EXPECT_EQ(&req1, request_order_[0]); 1320 EXPECT_EQ(&req2, request_order_[1]); 1321 EXPECT_EQ(&req3, request_order_[2]); 1322 } 1323 1324 TEST_F(ClientSocketPoolBaseTest, DISABLED_LoadState) { 1325 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); 1326 connect_job_factory_->set_job_type( 1327 TestConnectJob::kMockAdvancingLoadStateJob); 1328 1329 TestSocketRequest req1(&request_order_, &completion_count_); 1330 int rv = InitHandle( 1331 req1.handle(), "a", kDefaultPriority, &req1, pool_.get(), NULL); 1332 EXPECT_EQ(ERR_IO_PENDING, rv); 1333 EXPECT_EQ(LOAD_STATE_IDLE, req1.handle()->GetLoadState()); 1334 1335 MessageLoop::current()->RunAllPending(); 1336 1337 TestSocketRequest req2(&request_order_, &completion_count_); 1338 rv = InitHandle(req2.handle(), "a", kDefaultPriority, &req2, 1339 pool_.get(), NULL); 1340 EXPECT_EQ(ERR_IO_PENDING, rv); 1341 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req1.handle()->GetLoadState()); 1342 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req2.handle()->GetLoadState()); 1343 } 1344 1345 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSockets) { 1346 CreatePoolWithIdleTimeouts( 1347 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 1348 base::TimeDelta(), // Time out unused sockets immediately. 1349 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 1350 1351 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); 1352 1353 // Startup two mock pending connect jobs, which will sit in the MessageLoop. 1354 1355 TestSocketRequest req(&request_order_, &completion_count_); 1356 int rv = InitHandle(req.handle(), "a", LOWEST, &req, pool_.get(), NULL); 1357 EXPECT_EQ(ERR_IO_PENDING, rv); 1358 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", req.handle())); 1359 1360 TestSocketRequest req2(&request_order_, &completion_count_); 1361 rv = InitHandle(req2.handle(), "a", LOWEST, &req2, pool_.get(), NULL); 1362 EXPECT_EQ(ERR_IO_PENDING, rv); 1363 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", req2.handle())); 1364 1365 // Cancel one of the requests. Wait for the other, which will get the first 1366 // job. Release the socket. Run the loop again to make sure the second 1367 // socket is sitting idle and the first one is released (since ReleaseSocket() 1368 // just posts a DoReleaseSocket() task). 1369 1370 req.handle()->Reset(); 1371 EXPECT_EQ(OK, req2.WaitForResult()); 1372 req2.handle()->Reset(); 1373 1374 // We post all of our delayed tasks with a 2ms delay. I.e. they don't 1375 // actually become pending until 2ms after they have been created. In order 1376 // to flush all tasks, we need to wait so that we know there are no 1377 // soon-to-be-pending tasks waiting. 1378 PlatformThread::Sleep(10); 1379 MessageLoop::current()->RunAllPending(); 1380 1381 ASSERT_EQ(2, pool_->IdleSocketCount()); 1382 1383 // Invoke the idle socket cleanup check. Only one socket should be left, the 1384 // used socket. Request it to make sure that it's used. 1385 1386 pool_->CleanupTimedOutIdleSockets(); 1387 rv = InitHandle(req.handle(), "a", LOWEST, &req, pool_.get(), NULL); 1388 EXPECT_EQ(OK, rv); 1389 EXPECT_TRUE(req.handle()->is_reused()); 1390 } 1391 1392 // Make sure that we process all pending requests even when we're stalling 1393 // because of multiple releasing disconnected sockets. 1394 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) { 1395 CreatePoolWithIdleTimeouts( 1396 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, 1397 base::TimeDelta(), // Time out unused sockets immediately. 1398 base::TimeDelta::FromDays(1)); // Don't time out used sockets. 1399 1400 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); 1401 1402 // Startup 4 connect jobs. Two of them will be pending. 1403 1404 TestSocketRequest req(&request_order_, &completion_count_); 1405 int rv = InitHandle(req.handle(), "a", LOWEST, &req, pool_.get(), NULL); 1406 EXPECT_EQ(OK, rv); 1407 1408 TestSocketRequest req2(&request_order_, &completion_count_); 1409 rv = InitHandle(req2.handle(), "a", LOWEST, &req2, pool_.get(), NULL); 1410 EXPECT_EQ(OK, rv); 1411 1412 TestSocketRequest req3(&request_order_, &completion_count_); 1413 rv = InitHandle(req3.handle(), "a", LOWEST, &req3, pool_.get(), NULL); 1414 EXPECT_EQ(ERR_IO_PENDING, rv); 1415 1416 TestSocketRequest req4(&request_order_, &completion_count_); 1417 rv = InitHandle(req4.handle(), "a", LOWEST, &req4, pool_.get(), NULL); 1418 EXPECT_EQ(ERR_IO_PENDING, rv); 1419 1420 // Release two disconnected sockets. 1421 1422 req.handle()->socket()->Disconnect(); 1423 req.handle()->Reset(); 1424 req2.handle()->socket()->Disconnect(); 1425 req2.handle()->Reset(); 1426 1427 EXPECT_EQ(OK, req3.WaitForResult()); 1428 EXPECT_FALSE(req3.handle()->is_reused()); 1429 EXPECT_EQ(OK, req4.WaitForResult()); 1430 EXPECT_FALSE(req4.handle()->is_reused()); 1431 } 1432 1433 } // namespace 1434 1435 } // namespace net 1436