| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/socket/client_socket_pool_base.h" | 5 #include "net/socket/client_socket_pool_base.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
| 9 #include "base/scoped_vector.h" | 9 #include "base/scoped_vector.h" |
| 10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
| 11 #include "net/base/test_completion_callback.h" | 11 #include "net/base/test_completion_callback.h" |
| 12 #include "net/socket/client_socket.h" | 12 #include "net/socket/client_socket.h" |
| 13 #include "net/socket/client_socket_factory.h" | 13 #include "net/socket/client_socket_factory.h" |
| 14 #include "net/socket/client_socket_handle.h" | 14 #include "net/socket/client_socket_handle.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 16 |
| 17 namespace net { | 17 namespace net { |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 const int kDefaultMaxSockets = 4; |
| 22 |
| 21 const int kDefaultMaxSocketsPerGroup = 2; | 23 const int kDefaultMaxSocketsPerGroup = 2; |
| 22 | 24 |
| 23 const int kDefaultPriority = 5; | 25 const int kDefaultPriority = 5; |
| 24 | 26 |
| 25 class MockClientSocket : public ClientSocket { | 27 class MockClientSocket : public ClientSocket { |
| 26 public: | 28 public: |
| 27 MockClientSocket() : connected_(false) {} | 29 MockClientSocket() : connected_(false) {} |
| 28 | 30 |
| 29 // Socket methods: | 31 // Socket methods: |
| 30 virtual int Read( | 32 virtual int Read( |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 private: | 250 private: |
| 249 TestConnectJob::JobType job_type_; | 251 TestConnectJob::JobType job_type_; |
| 250 MockClientSocketFactory* const client_socket_factory_; | 252 MockClientSocketFactory* const client_socket_factory_; |
| 251 | 253 |
| 252 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory); | 254 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory); |
| 253 }; | 255 }; |
| 254 | 256 |
| 255 class TestClientSocketPool : public ClientSocketPool { | 257 class TestClientSocketPool : public ClientSocketPool { |
| 256 public: | 258 public: |
| 257 TestClientSocketPool( | 259 TestClientSocketPool( |
| 260 int max_sockets, |
| 258 int max_sockets_per_group, | 261 int max_sockets_per_group, |
| 259 ClientSocketPoolBase::ConnectJobFactory* connect_job_factory) | 262 ClientSocketPoolBase::ConnectJobFactory* connect_job_factory) |
| 260 : base_(new ClientSocketPoolBase( | 263 : base_(new ClientSocketPoolBase( |
| 261 max_sockets_per_group, connect_job_factory)) {} | 264 max_sockets, max_sockets_per_group, connect_job_factory)) {} |
| 262 | 265 |
| 263 virtual int RequestSocket( | 266 virtual int RequestSocket( |
| 264 const std::string& group_name, | 267 const std::string& group_name, |
| 265 const HostResolver::RequestInfo& resolve_info, | 268 const HostResolver::RequestInfo& resolve_info, |
| 266 int priority, | 269 int priority, |
| 267 ClientSocketHandle* handle, | 270 ClientSocketHandle* handle, |
| 268 CompletionCallback* callback) { | 271 CompletionCallback* callback) { |
| 269 return base_->RequestSocket( | 272 return base_->RequestSocket( |
| 270 group_name, resolve_info, priority, handle, callback); | 273 group_name, resolve_info, priority, handle, callback); |
| 271 } | 274 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 290 | 293 |
| 291 virtual int IdleSocketCountInGroup(const std::string& group_name) const { | 294 virtual int IdleSocketCountInGroup(const std::string& group_name) const { |
| 292 return base_->IdleSocketCountInGroup(group_name); | 295 return base_->IdleSocketCountInGroup(group_name); |
| 293 } | 296 } |
| 294 | 297 |
| 295 virtual LoadState GetLoadState(const std::string& group_name, | 298 virtual LoadState GetLoadState(const std::string& group_name, |
| 296 const ClientSocketHandle* handle) const { | 299 const ClientSocketHandle* handle) const { |
| 297 return base_->GetLoadState(group_name, handle); | 300 return base_->GetLoadState(group_name, handle); |
| 298 } | 301 } |
| 299 | 302 |
| 300 int MaxSocketsPerGroup() const { | 303 const ClientSocketPoolBase* base() const { return base_.get(); } |
| 301 return base_->max_sockets_per_group(); | |
| 302 } | |
| 303 | 304 |
| 304 private: | 305 private: |
| 305 const scoped_refptr<ClientSocketPoolBase> base_; | 306 const scoped_refptr<ClientSocketPoolBase> base_; |
| 306 | 307 |
| 307 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); | 308 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); |
| 308 }; | 309 }; |
| 309 | 310 |
| 310 void MockClientSocketFactory::SignalJobs() { | 311 void MockClientSocketFactory::SignalJobs() { |
| 311 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); | 312 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin(); |
| 312 it != waiting_jobs_.end(); ++it) { | 313 it != waiting_jobs_.end(); ++it) { |
| 313 (*it)->Signal(); | 314 (*it)->Signal(); |
| 314 } | 315 } |
| 315 waiting_jobs_.clear(); | 316 waiting_jobs_.clear(); |
| 316 } | 317 } |
| 317 | 318 |
| 318 class ClientSocketPoolBaseTest : public testing::Test { | 319 class ClientSocketPoolBaseTest : public testing::Test { |
| 319 protected: | 320 protected: |
| 320 ClientSocketPoolBaseTest() | 321 ClientSocketPoolBaseTest() |
| 321 : ignored_request_info_("ignored", 80), | 322 : ignored_request_info_("ignored", 80), |
| 322 connect_job_factory_( | 323 connect_job_factory_( |
| 323 new TestConnectJobFactory(&client_socket_factory_)) {} | 324 new TestConnectJobFactory(&client_socket_factory_)) {} |
| 324 | 325 |
| 325 void CreatePool(int max_sockets_per_group) { | 326 void CreatePool(int max_sockets, int max_sockets_per_group) { |
| 326 DCHECK(!pool_.get()); | 327 DCHECK(!pool_.get()); |
| 327 pool_ = new TestClientSocketPool(max_sockets_per_group, | 328 pool_ = new TestClientSocketPool(max_sockets, |
| 329 max_sockets_per_group, |
| 328 connect_job_factory_); | 330 connect_job_factory_); |
| 329 } | 331 } |
| 330 | 332 |
| 331 virtual void SetUp() { | 333 virtual void SetUp() { |
| 332 TestSocketRequest::completion_count = 0; | 334 TestSocketRequest::completion_count = 0; |
| 333 } | 335 } |
| 334 | 336 |
| 335 virtual void TearDown() { | 337 virtual void TearDown() { |
| 336 // The tests often call Reset() on handles at the end which may post | 338 // The tests often call Reset() on handles at the end which may post |
| 337 // DoReleaseSocket() tasks. | 339 // DoReleaseSocket() tasks. |
| 338 MessageLoop::current()->RunAllPending(); | 340 MessageLoop::current()->RunAllPending(); |
| 339 // Need to delete |pool_| before we turn late binding back off. | 341 |
| 340 // TODO(willchan): Remove this line when late binding becomes the default. | 342 // Need to delete |pool_| before we turn late binding back off. We also need |
| 343 // to delete |requests_| because the pool is reference counted and requests |
| 344 // keep reference to it. |
| 345 // TODO(willchan): Remove this part when late binding becomes the default. |
| 341 pool_ = NULL; | 346 pool_ = NULL; |
| 347 requests_.reset(); |
| 348 |
| 342 ClientSocketPoolBase::EnableLateBindingOfSockets(false); | 349 ClientSocketPoolBase::EnableLateBindingOfSockets(false); |
| 343 } | 350 } |
| 344 | 351 |
| 345 int StartRequest(const std::string& group_name, int priority) { | 352 int StartRequest(const std::string& group_name, int priority) { |
| 346 DCHECK(pool_.get()); | 353 DCHECK(pool_.get()); |
| 347 TestSocketRequest* request = new TestSocketRequest(pool_.get(), | 354 TestSocketRequest* request = new TestSocketRequest(pool_.get(), |
| 348 &request_order_); | 355 &request_order_); |
| 349 requests_.push_back(request); | 356 requests_.push_back(request); |
| 350 int rv = request->handle.Init(group_name, ignored_request_info_, priority, | 357 int rv = request->handle.Init(group_name, ignored_request_info_, priority, |
| 351 request); | 358 request); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 367 return i + 1; | 374 return i + 1; |
| 368 | 375 |
| 369 return kRequestNotFound; | 376 return kRequestNotFound; |
| 370 } | 377 } |
| 371 | 378 |
| 372 enum KeepAlive { | 379 enum KeepAlive { |
| 373 KEEP_ALIVE, | 380 KEEP_ALIVE, |
| 374 NO_KEEP_ALIVE, | 381 NO_KEEP_ALIVE, |
| 375 }; | 382 }; |
| 376 | 383 |
| 384 bool ReleaseOneConnection(KeepAlive keep_alive) { |
| 385 ScopedVector<TestSocketRequest>::iterator i; |
| 386 for (i = requests_.begin(); i != requests_.end(); ++i) { |
| 387 if ((*i)->handle.is_initialized()) { |
| 388 if (keep_alive == NO_KEEP_ALIVE) |
| 389 (*i)->handle.socket()->Disconnect(); |
| 390 (*i)->handle.Reset(); |
| 391 MessageLoop::current()->RunAllPending(); |
| 392 return true; |
| 393 } |
| 394 } |
| 395 return false; |
| 396 } |
| 397 |
| 377 void ReleaseAllConnections(KeepAlive keep_alive) { | 398 void ReleaseAllConnections(KeepAlive keep_alive) { |
| 378 bool released_one; | 399 bool released_one; |
| 379 do { | 400 do { |
| 380 released_one = false; | 401 released_one = ReleaseOneConnection(keep_alive); |
| 381 ScopedVector<TestSocketRequest>::iterator i; | |
| 382 for (i = requests_.begin(); i != requests_.end(); ++i) { | |
| 383 if ((*i)->handle.is_initialized()) { | |
| 384 if (keep_alive == NO_KEEP_ALIVE) | |
| 385 (*i)->handle.socket()->Disconnect(); | |
| 386 (*i)->handle.Reset(); | |
| 387 MessageLoop::current()->RunAllPending(); | |
| 388 released_one = true; | |
| 389 } | |
| 390 } | |
| 391 } while (released_one); | 402 } while (released_one); |
| 392 } | 403 } |
| 393 | 404 |
| 394 HostResolver::RequestInfo ignored_request_info_; | 405 HostResolver::RequestInfo ignored_request_info_; |
| 395 MockClientSocketFactory client_socket_factory_; | 406 MockClientSocketFactory client_socket_factory_; |
| 396 TestConnectJobFactory* const connect_job_factory_; | 407 TestConnectJobFactory* const connect_job_factory_; |
| 397 scoped_refptr<TestClientSocketPool> pool_; | 408 scoped_refptr<TestClientSocketPool> pool_; |
| 398 ScopedVector<TestSocketRequest> requests_; | 409 ScopedVector<TestSocketRequest> requests_; |
| 399 std::vector<TestSocketRequest*> request_order_; | 410 std::vector<TestSocketRequest*> request_order_; |
| 400 }; | 411 }; |
| 401 | 412 |
| 402 // static | 413 // static |
| 403 const int ClientSocketPoolBaseTest::kIndexOutOfBounds = -1; | 414 const int ClientSocketPoolBaseTest::kIndexOutOfBounds = -1; |
| 404 | 415 |
| 405 // static | 416 // static |
| 406 const int ClientSocketPoolBaseTest::kRequestNotFound = -2; | 417 const int ClientSocketPoolBaseTest::kRequestNotFound = -2; |
| 407 | 418 |
| 408 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { | 419 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { |
| 409 CreatePool(kDefaultMaxSocketsPerGroup); | 420 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 410 | 421 |
| 411 TestCompletionCallback callback; | 422 TestCompletionCallback callback; |
| 412 ClientSocketHandle handle(pool_.get()); | 423 ClientSocketHandle handle(pool_.get()); |
| 413 EXPECT_EQ(OK, handle.Init("a", ignored_request_info_, kDefaultPriority, | 424 EXPECT_EQ(OK, handle.Init("a", ignored_request_info_, kDefaultPriority, |
| 414 &callback)); | 425 &callback)); |
| 415 EXPECT_TRUE(handle.is_initialized()); | 426 EXPECT_TRUE(handle.is_initialized()); |
| 416 EXPECT_TRUE(handle.socket()); | 427 EXPECT_TRUE(handle.socket()); |
| 417 handle.Reset(); | 428 handle.Reset(); |
| 418 } | 429 } |
| 419 | 430 |
| 420 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { | 431 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { |
| 421 CreatePool(kDefaultMaxSocketsPerGroup); | 432 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 422 | 433 |
| 423 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 434 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 424 TestSocketRequest req(pool_.get(), &request_order_); | 435 TestSocketRequest req(pool_.get(), &request_order_); |
| 425 int rv = req.handle.Init("a", ignored_request_info_, 0, &req); | 436 int rv = req.handle.Init("a", ignored_request_info_, 0, &req); |
| 426 EXPECT_EQ(ERR_IO_PENDING, rv); | 437 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 427 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); | 438 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); |
| 428 EXPECT_EQ(OK, req.WaitForResult()); | 439 EXPECT_EQ(OK, req.WaitForResult()); |
| 429 EXPECT_TRUE(req.handle.is_initialized()); | 440 EXPECT_TRUE(req.handle.is_initialized()); |
| 430 EXPECT_TRUE(req.handle.socket()); | 441 EXPECT_TRUE(req.handle.socket()); |
| 431 req.handle.Reset(); | 442 req.handle.Reset(); |
| 432 } | 443 } |
| 433 | 444 |
| 434 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { | 445 TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) { |
| 435 CreatePool(kDefaultMaxSocketsPerGroup); | 446 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 436 | 447 |
| 437 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); | 448 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); |
| 438 TestSocketRequest req(pool_.get(), &request_order_); | 449 TestSocketRequest req(pool_.get(), &request_order_); |
| 439 EXPECT_EQ(ERR_CONNECTION_FAILED, | 450 EXPECT_EQ(ERR_CONNECTION_FAILED, |
| 440 req.handle.Init("a", ignored_request_info_, | 451 req.handle.Init("a", ignored_request_info_, |
| 441 kDefaultPriority, &req)); | 452 kDefaultPriority, &req)); |
| 442 } | 453 } |
| 443 | 454 |
| 444 TEST_F(ClientSocketPoolBaseTest, InitConnectionAsynchronousFailure) { | 455 TEST_F(ClientSocketPoolBaseTest, InitConnectionAsynchronousFailure) { |
| 445 CreatePool(kDefaultMaxSocketsPerGroup); | 456 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 446 | 457 |
| 447 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 458 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 448 TestSocketRequest req(pool_.get(), &request_order_); | 459 TestSocketRequest req(pool_.get(), &request_order_); |
| 449 EXPECT_EQ(ERR_IO_PENDING, | 460 EXPECT_EQ(ERR_IO_PENDING, |
| 450 req.handle.Init("a", ignored_request_info_, 5, &req)); | 461 req.handle.Init("a", ignored_request_info_, 5, &req)); |
| 451 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); | 462 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); |
| 452 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); | 463 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); |
| 453 } | 464 } |
| 454 | 465 |
| 466 TEST_F(ClientSocketPoolBaseTest, TotalLimit) { |
| 467 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 468 |
| 469 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 470 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); |
| 471 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority)); |
| 472 EXPECT_EQ(OK, StartRequest("d", kDefaultPriority)); |
| 473 |
| 474 EXPECT_EQ(static_cast<int>(requests_.size()), |
| 475 client_socket_factory_.allocation_count()); |
| 476 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, |
| 477 TestSocketRequest::completion_count); |
| 478 |
| 479 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority)); |
| 480 EXPECT_EQ(ERR_IO_PENDING, StartRequest("f", kDefaultPriority)); |
| 481 EXPECT_EQ(ERR_IO_PENDING, StartRequest("g", kDefaultPriority)); |
| 482 |
| 483 ReleaseAllConnections(KEEP_ALIVE); |
| 484 |
| 485 EXPECT_EQ(static_cast<int>(requests_.size()), |
| 486 client_socket_factory_.allocation_count()); |
| 487 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, |
| 488 TestSocketRequest::completion_count); |
| 489 |
| 490 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 491 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 492 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 493 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 494 EXPECT_EQ(5, GetOrderOfRequest(5)); |
| 495 EXPECT_EQ(6, GetOrderOfRequest(6)); |
| 496 EXPECT_EQ(7, GetOrderOfRequest(7)); |
| 497 } |
| 498 |
| 499 TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) { |
| 500 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 501 |
| 502 // Reach all limits: max total sockets, and max sockets per group. |
| 503 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 504 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 505 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); |
| 506 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); |
| 507 |
| 508 EXPECT_EQ(static_cast<int>(requests_.size()), |
| 509 client_socket_factory_.allocation_count()); |
| 510 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, |
| 511 TestSocketRequest::completion_count); |
| 512 |
| 513 // Now create a new group and verify that we don't starve it. |
| 514 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority)); |
| 515 |
| 516 ReleaseAllConnections(KEEP_ALIVE); |
| 517 |
| 518 EXPECT_EQ(static_cast<int>(requests_.size()), |
| 519 client_socket_factory_.allocation_count()); |
| 520 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, |
| 521 TestSocketRequest::completion_count); |
| 522 |
| 523 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 524 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 525 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 526 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 527 EXPECT_EQ(5, GetOrderOfRequest(5)); |
| 528 } |
| 529 |
| 530 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) { |
| 531 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 532 |
| 533 EXPECT_EQ(OK, StartRequest("b", 3)); |
| 534 EXPECT_EQ(OK, StartRequest("a", 3)); |
| 535 EXPECT_EQ(OK, StartRequest("b", 6)); |
| 536 EXPECT_EQ(OK, StartRequest("a", 6)); |
| 537 |
| 538 EXPECT_EQ(static_cast<int>(requests_.size()), |
| 539 client_socket_factory_.allocation_count()); |
| 540 |
| 541 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", 4)); |
| 542 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 5)); |
| 543 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", 7)); |
| 544 |
| 545 ReleaseAllConnections(KEEP_ALIVE); |
| 546 |
| 547 // We're re-using one socket for group "a", and one for "b". |
| 548 EXPECT_EQ(static_cast<int>(requests_.size()) - 2, |
| 549 client_socket_factory_.allocation_count()); |
| 550 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, |
| 551 TestSocketRequest::completion_count); |
| 552 |
| 553 // First 4 requests don't have to wait, and finish in order. |
| 554 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 555 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 556 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 557 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 558 |
| 559 // Request ("b", 7) has the highest priority, then ("a", 5), |
| 560 // and then ("c", 4). |
| 561 EXPECT_EQ(7, GetOrderOfRequest(5)); |
| 562 EXPECT_EQ(6, GetOrderOfRequest(6)); |
| 563 EXPECT_EQ(5, GetOrderOfRequest(7)); |
| 564 } |
| 565 |
| 566 TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) { |
| 567 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 568 |
| 569 EXPECT_EQ(OK, StartRequest("a", 3)); |
| 570 EXPECT_EQ(OK, StartRequest("a", 6)); |
| 571 EXPECT_EQ(OK, StartRequest("b", 3)); |
| 572 EXPECT_EQ(OK, StartRequest("b", 6)); |
| 573 |
| 574 EXPECT_EQ(static_cast<int>(requests_.size()), |
| 575 client_socket_factory_.allocation_count()); |
| 576 |
| 577 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", 6)); |
| 578 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); |
| 579 EXPECT_EQ(ERR_IO_PENDING, StartRequest("b", 7)); |
| 580 |
| 581 ReleaseAllConnections(KEEP_ALIVE); |
| 582 |
| 583 // We're re-using one socket for group "a", and one for "b". |
| 584 EXPECT_EQ(static_cast<int>(requests_.size()) - 2, |
| 585 client_socket_factory_.allocation_count()); |
| 586 EXPECT_EQ(requests_.size() - kDefaultMaxSockets, |
| 587 TestSocketRequest::completion_count); |
| 588 |
| 589 // First 4 requests don't have to wait, and finish in order. |
| 590 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 591 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 592 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 593 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 594 |
| 595 // Request ("b", 7) has the highest priority, but we can't make new socket for |
| 596 // group "b", because it has reached the per-group limit. Then we make |
| 597 // socket for ("c", 6), because it has higher priority than ("a", 4), |
| 598 // and we still can't make a socket for group "b". |
| 599 EXPECT_EQ(5, GetOrderOfRequest(5)); |
| 600 EXPECT_EQ(6, GetOrderOfRequest(6)); |
| 601 EXPECT_EQ(7, GetOrderOfRequest(7)); |
| 602 } |
| 603 |
| 604 // Make sure that we count connecting sockets against the total limit. |
| 605 TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) { |
| 606 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 607 |
| 608 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 609 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); |
| 610 EXPECT_EQ(OK, StartRequest("c", kDefaultPriority)); |
| 611 |
| 612 // Create one asynchronous request. |
| 613 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 614 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", kDefaultPriority)); |
| 615 |
| 616 // The next synchronous request should wait for its turn. |
| 617 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 618 EXPECT_EQ(ERR_IO_PENDING, StartRequest("e", kDefaultPriority)); |
| 619 |
| 620 ReleaseAllConnections(KEEP_ALIVE); |
| 621 |
| 622 EXPECT_EQ(static_cast<int>(requests_.size()), |
| 623 client_socket_factory_.allocation_count()); |
| 624 |
| 625 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 626 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 627 EXPECT_EQ(3, GetOrderOfRequest(3)); |
| 628 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 629 } |
| 630 |
| 631 // Inside ClientSocketPoolBase we have a may_have_stalled_group flag, |
| 632 // which tells it to use more expensive, but accurate, group selection |
| 633 // algorithm. Make sure it doesn't get stuck in the "on" state. |
| 634 TEST_F(ClientSocketPoolBaseTest, MayHaveStalledGroupReset) { |
| 635 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 636 |
| 637 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); |
| 638 |
| 639 // Reach group socket limit. |
| 640 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 641 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 642 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); |
| 643 |
| 644 // Reach total limit, but don't request more sockets. |
| 645 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); |
| 646 EXPECT_EQ(OK, StartRequest("b", kDefaultPriority)); |
| 647 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); |
| 648 |
| 649 // Request one more socket while we are at the maximum sockets limit. |
| 650 // This should flip the may_have_stalled_group flag. |
| 651 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority)); |
| 652 EXPECT_TRUE(pool_->base()->may_have_stalled_group()); |
| 653 |
| 654 // After releasing first connection for "a", we're still at the |
| 655 // maximum sockets limit, but every group's pending queue is empty, |
| 656 // so we reset the flag. |
| 657 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE)); |
| 658 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); |
| 659 |
| 660 // Requesting additional socket while at the total limit should |
| 661 // flip the flag back to "on". |
| 662 EXPECT_EQ(ERR_IO_PENDING, StartRequest("c", kDefaultPriority)); |
| 663 EXPECT_TRUE(pool_->base()->may_have_stalled_group()); |
| 664 |
| 665 // We'll request one more socket to verify that we don't reset the flag |
| 666 // too eagerly. |
| 667 EXPECT_EQ(ERR_IO_PENDING, StartRequest("d", kDefaultPriority)); |
| 668 EXPECT_TRUE(pool_->base()->may_have_stalled_group()); |
| 669 |
| 670 // We're at the maximum socket limit, and still have one request pending |
| 671 // for "d". Flag should be "on". |
| 672 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE)); |
| 673 EXPECT_TRUE(pool_->base()->may_have_stalled_group()); |
| 674 |
| 675 // Now every group's pending queue should be empty again. |
| 676 EXPECT_TRUE(ReleaseOneConnection(KEEP_ALIVE)); |
| 677 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); |
| 678 |
| 679 ReleaseAllConnections(KEEP_ALIVE); |
| 680 EXPECT_FALSE(pool_->base()->may_have_stalled_group()); |
| 681 } |
| 682 |
| 455 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { | 683 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { |
| 456 CreatePool(kDefaultMaxSocketsPerGroup); | 684 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 457 | 685 |
| 458 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 686 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 459 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 687 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 460 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 688 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 461 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); | 689 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); |
| 462 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); | 690 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); |
| 463 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); | 691 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); |
| 464 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 692 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 465 | 693 |
| 466 ReleaseAllConnections(KEEP_ALIVE); | 694 ReleaseAllConnections(KEEP_ALIVE); |
| 467 | 695 |
| 468 EXPECT_EQ(kDefaultMaxSocketsPerGroup, | 696 EXPECT_EQ(kDefaultMaxSocketsPerGroup, |
| 469 client_socket_factory_.allocation_count()); | 697 client_socket_factory_.allocation_count()); |
| 470 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, | 698 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, |
| 471 TestSocketRequest::completion_count); | 699 TestSocketRequest::completion_count); |
| 472 | 700 |
| 473 EXPECT_EQ(1, GetOrderOfRequest(1)); | 701 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 474 EXPECT_EQ(2, GetOrderOfRequest(2)); | 702 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 475 EXPECT_EQ(6, GetOrderOfRequest(3)); | 703 EXPECT_EQ(6, GetOrderOfRequest(3)); |
| 476 EXPECT_EQ(4, GetOrderOfRequest(4)); | 704 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 477 EXPECT_EQ(3, GetOrderOfRequest(5)); | 705 EXPECT_EQ(3, GetOrderOfRequest(5)); |
| 478 EXPECT_EQ(5, GetOrderOfRequest(6)); | 706 EXPECT_EQ(5, GetOrderOfRequest(6)); |
| 479 EXPECT_EQ(7, GetOrderOfRequest(7)); | 707 EXPECT_EQ(7, GetOrderOfRequest(7)); |
| 480 } | 708 } |
| 481 | 709 |
| 482 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) { | 710 TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) { |
| 483 CreatePool(kDefaultMaxSocketsPerGroup); | 711 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 484 | 712 |
| 485 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 713 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 486 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 714 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 487 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 715 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 488 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); | 716 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); |
| 489 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); | 717 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); |
| 490 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); | 718 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); |
| 491 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 719 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 492 | 720 |
| 493 ReleaseAllConnections(NO_KEEP_ALIVE); | 721 ReleaseAllConnections(NO_KEEP_ALIVE); |
| 494 | 722 |
| 495 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i) | 723 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i) |
| 496 EXPECT_EQ(OK, requests_[i]->WaitForResult()); | 724 EXPECT_EQ(OK, requests_[i]->WaitForResult()); |
| 497 | 725 |
| 498 EXPECT_EQ(static_cast<int>(requests_.size()), | 726 EXPECT_EQ(static_cast<int>(requests_.size()), |
| 499 client_socket_factory_.allocation_count()); | 727 client_socket_factory_.allocation_count()); |
| 500 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, | 728 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, |
| 501 TestSocketRequest::completion_count); | 729 TestSocketRequest::completion_count); |
| 502 } | 730 } |
| 503 | 731 |
| 504 // This test will start up a RequestSocket() and then immediately Cancel() it. | 732 // This test will start up a RequestSocket() and then immediately Cancel() it. |
| 505 // The pending connect job will be cancelled and should not call back into | 733 // The pending connect job will be cancelled and should not call back into |
| 506 // ClientSocketPoolBase. | 734 // ClientSocketPoolBase. |
| 507 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { | 735 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { |
| 508 CreatePool(kDefaultMaxSocketsPerGroup); | 736 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 509 | 737 |
| 510 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 738 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 511 TestSocketRequest req(pool_.get(), &request_order_); | 739 TestSocketRequest req(pool_.get(), &request_order_); |
| 512 EXPECT_EQ(ERR_IO_PENDING, | 740 EXPECT_EQ(ERR_IO_PENDING, |
| 513 req.handle.Init("a", ignored_request_info_, | 741 req.handle.Init("a", ignored_request_info_, |
| 514 kDefaultPriority, &req)); | 742 kDefaultPriority, &req)); |
| 515 req.handle.Reset(); | 743 req.handle.Reset(); |
| 516 } | 744 } |
| 517 | 745 |
| 518 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { | 746 TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) { |
| 519 CreatePool(kDefaultMaxSocketsPerGroup); | 747 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 520 | 748 |
| 521 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 749 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 522 TestSocketRequest req(pool_.get(), &request_order_); | 750 TestSocketRequest req(pool_.get(), &request_order_); |
| 523 TestSocketRequest req2(pool_.get(), &request_order_); | 751 TestSocketRequest req2(pool_.get(), &request_order_); |
| 524 | 752 |
| 525 EXPECT_EQ(ERR_IO_PENDING, | 753 EXPECT_EQ(ERR_IO_PENDING, |
| 526 req.handle.Init("a", ignored_request_info_, | 754 req.handle.Init("a", ignored_request_info_, |
| 527 kDefaultPriority, &req)); | 755 kDefaultPriority, &req)); |
| 528 EXPECT_EQ(ERR_IO_PENDING, | 756 EXPECT_EQ(ERR_IO_PENDING, |
| 529 req2.handle.Init("a", ignored_request_info_, | 757 req2.handle.Init("a", ignored_request_info_, |
| 530 kDefaultPriority, &req2)); | 758 kDefaultPriority, &req2)); |
| 531 | 759 |
| 532 req.handle.Reset(); | 760 req.handle.Reset(); |
| 533 | 761 |
| 534 EXPECT_EQ(OK, req2.WaitForResult()); | 762 EXPECT_EQ(OK, req2.WaitForResult()); |
| 535 req2.handle.Reset(); | 763 req2.handle.Reset(); |
| 536 } | 764 } |
| 537 | 765 |
| 538 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { | 766 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { |
| 539 CreatePool(kDefaultMaxSocketsPerGroup); | 767 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 540 | 768 |
| 541 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 769 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 542 ClientSocketHandle handle(pool_.get()); | 770 ClientSocketHandle handle(pool_.get()); |
| 543 TestCompletionCallback callback; | 771 TestCompletionCallback callback; |
| 544 TestSocketRequest req(pool_.get(), &request_order_); | 772 TestSocketRequest req(pool_.get(), &request_order_); |
| 545 | 773 |
| 546 EXPECT_EQ(ERR_IO_PENDING, | 774 EXPECT_EQ(ERR_IO_PENDING, |
| 547 handle.Init("a", ignored_request_info_, | 775 handle.Init("a", ignored_request_info_, |
| 548 kDefaultPriority, &callback)); | 776 kDefaultPriority, &callback)); |
| 549 | 777 |
| 550 handle.Reset(); | 778 handle.Reset(); |
| 551 | 779 |
| 552 TestCompletionCallback callback2; | 780 TestCompletionCallback callback2; |
| 553 EXPECT_EQ(ERR_IO_PENDING, | 781 EXPECT_EQ(ERR_IO_PENDING, |
| 554 handle.Init("a", ignored_request_info_, | 782 handle.Init("a", ignored_request_info_, |
| 555 kDefaultPriority, &callback2)); | 783 kDefaultPriority, &callback2)); |
| 556 | 784 |
| 557 EXPECT_EQ(OK, callback2.WaitForResult()); | 785 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 558 EXPECT_FALSE(callback.have_result()); | 786 EXPECT_FALSE(callback.have_result()); |
| 559 | 787 |
| 560 handle.Reset(); | 788 handle.Reset(); |
| 561 } | 789 } |
| 562 | 790 |
| 563 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { | 791 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { |
| 564 CreatePool(kDefaultMaxSocketsPerGroup); | 792 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 565 | 793 |
| 566 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 794 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 567 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 795 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 568 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 796 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 569 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); | 797 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); |
| 570 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); | 798 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); |
| 571 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); | 799 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); |
| 572 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 800 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 573 | 801 |
| 574 // Cancel a request. | 802 // Cancel a request. |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 | 861 |
| 634 private: | 862 private: |
| 635 ClientSocketHandle* const handle_; | 863 ClientSocketHandle* const handle_; |
| 636 bool within_callback_; | 864 bool within_callback_; |
| 637 TestConnectJobFactory* const test_connect_job_factory_; | 865 TestConnectJobFactory* const test_connect_job_factory_; |
| 638 TestConnectJob::JobType next_job_type_; | 866 TestConnectJob::JobType next_job_type_; |
| 639 TestCompletionCallback callback_; | 867 TestCompletionCallback callback_; |
| 640 }; | 868 }; |
| 641 | 869 |
| 642 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { | 870 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { |
| 643 CreatePool(kDefaultMaxSocketsPerGroup); | 871 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 644 | 872 |
| 645 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 873 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 646 ClientSocketHandle handle(pool_.get()); | 874 ClientSocketHandle handle(pool_.get()); |
| 647 RequestSocketCallback callback( | 875 RequestSocketCallback callback( |
| 648 &handle, connect_job_factory_, TestConnectJob::kMockPendingJob); | 876 &handle, connect_job_factory_, TestConnectJob::kMockPendingJob); |
| 649 int rv = handle.Init( | 877 int rv = handle.Init( |
| 650 "a", ignored_request_info_, kDefaultPriority, &callback); | 878 "a", ignored_request_info_, kDefaultPriority, &callback); |
| 651 ASSERT_EQ(ERR_IO_PENDING, rv); | 879 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 652 | 880 |
| 653 EXPECT_EQ(OK, callback.WaitForResult()); | 881 EXPECT_EQ(OK, callback.WaitForResult()); |
| 654 handle.Reset(); | 882 handle.Reset(); |
| 655 } | 883 } |
| 656 | 884 |
| 657 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { | 885 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { |
| 658 CreatePool(kDefaultMaxSocketsPerGroup); | 886 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 659 | 887 |
| 660 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 888 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 661 ClientSocketHandle handle(pool_.get()); | 889 ClientSocketHandle handle(pool_.get()); |
| 662 RequestSocketCallback callback( | 890 RequestSocketCallback callback( |
| 663 &handle, connect_job_factory_, TestConnectJob::kMockJob); | 891 &handle, connect_job_factory_, TestConnectJob::kMockJob); |
| 664 int rv = handle.Init( | 892 int rv = handle.Init( |
| 665 "a", ignored_request_info_, kDefaultPriority, &callback); | 893 "a", ignored_request_info_, kDefaultPriority, &callback); |
| 666 ASSERT_EQ(ERR_IO_PENDING, rv); | 894 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 667 | 895 |
| 668 EXPECT_EQ(OK, callback.WaitForResult()); | 896 EXPECT_EQ(OK, callback.WaitForResult()); |
| 669 handle.Reset(); | 897 handle.Reset(); |
| 670 } | 898 } |
| 671 | 899 |
| 672 // Make sure that pending requests get serviced after active requests get | 900 // Make sure that pending requests get serviced after active requests get |
| 673 // cancelled. | 901 // cancelled. |
| 674 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { | 902 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) { |
| 675 CreatePool(kDefaultMaxSocketsPerGroup); | 903 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 676 | 904 |
| 677 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 905 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 678 | 906 |
| 679 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 907 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 680 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 908 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 681 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 909 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 682 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 910 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 683 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 911 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 684 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 912 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 685 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 913 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 696 EXPECT_EQ(OK, requests_[i]->WaitForResult()); | 924 EXPECT_EQ(OK, requests_[i]->WaitForResult()); |
| 697 requests_[i]->handle.Reset(); | 925 requests_[i]->handle.Reset(); |
| 698 } | 926 } |
| 699 | 927 |
| 700 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, | 928 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, |
| 701 TestSocketRequest::completion_count); | 929 TestSocketRequest::completion_count); |
| 702 } | 930 } |
| 703 | 931 |
| 704 // Make sure that pending requests get serviced after active requests fail. | 932 // Make sure that pending requests get serviced after active requests fail. |
| 705 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { | 933 TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) { |
| 706 CreatePool(kDefaultMaxSocketsPerGroup); | 934 const size_t kMaxSockets = 5; |
| 935 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); |
| 707 | 936 |
| 708 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 937 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 709 | 938 |
| 710 scoped_ptr<TestSocketRequest> reqs[kDefaultMaxSocketsPerGroup * 2 + 1]; | 939 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; |
| 940 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang. |
| 711 | 941 |
| 712 // Queue up all the requests | 942 // Queue up all the requests |
| 713 for (size_t i = 0; i < arraysize(reqs); ++i) { | 943 for (size_t i = 0; i < kNumberOfRequests; ++i) |
| 714 reqs[i].reset(new TestSocketRequest(pool_.get(), &request_order_)); | 944 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 715 int rv = reqs[i]->handle.Init("a", ignored_request_info_, | |
| 716 kDefaultPriority, reqs[i].get()); | |
| 717 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 718 } | |
| 719 | 945 |
| 720 for (size_t i = 0; i < arraysize(reqs); ++i) | 946 for (size_t i = 0; i < kNumberOfRequests; ++i) |
| 721 EXPECT_EQ(ERR_CONNECTION_FAILED, reqs[i]->WaitForResult()); | 947 EXPECT_EQ(ERR_CONNECTION_FAILED, requests_[i]->WaitForResult()); |
| 722 } | 948 } |
| 723 | 949 |
| 724 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { | 950 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { |
| 725 CreatePool(kDefaultMaxSocketsPerGroup); | 951 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 726 | 952 |
| 727 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 953 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 728 | 954 |
| 729 TestSocketRequest req(pool_.get(), &request_order_); | 955 TestSocketRequest req(pool_.get(), &request_order_); |
| 730 int rv = req.handle.Init( | 956 int rv = req.handle.Init( |
| 731 "a", ignored_request_info_, kDefaultPriority, &req); | 957 "a", ignored_request_info_, kDefaultPriority, &req); |
| 732 EXPECT_EQ(ERR_IO_PENDING, rv); | 958 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 733 | 959 |
| 734 // Cancel the active request. | 960 // Cancel the active request. |
| 735 req.handle.Reset(); | 961 req.handle.Reset(); |
| 736 | 962 |
| 737 rv = req.handle.Init("a", ignored_request_info_, kDefaultPriority, &req); | 963 rv = req.handle.Init("a", ignored_request_info_, kDefaultPriority, &req); |
| 738 EXPECT_EQ(ERR_IO_PENDING, rv); | 964 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 739 EXPECT_EQ(OK, req.WaitForResult()); | 965 EXPECT_EQ(OK, req.WaitForResult()); |
| 740 | 966 |
| 741 EXPECT_FALSE(req.handle.is_reused()); | 967 EXPECT_FALSE(req.handle.is_reused()); |
| 742 EXPECT_EQ(1U, TestSocketRequest::completion_count); | 968 EXPECT_EQ(1U, TestSocketRequest::completion_count); |
| 743 EXPECT_EQ(2, client_socket_factory_.allocation_count()); | 969 EXPECT_EQ(2, client_socket_factory_.allocation_count()); |
| 744 } | 970 } |
| 745 | 971 |
| 746 // A pending asynchronous job completes, which will free up a socket slot. The | 972 // A pending asynchronous job completes, which will free up a socket slot. The |
| 747 // next job finishes synchronously. The callback for the asynchronous job | 973 // next job finishes synchronously. The callback for the asynchronous job |
| 748 // should be first though. | 974 // should be first though. |
| 749 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { | 975 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { |
| 750 CreatePool(kDefaultMaxSocketsPerGroup); | 976 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 751 | 977 |
| 752 // First two jobs are async. | 978 // First two jobs are async. |
| 753 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 979 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 754 | 980 |
| 755 // Start job 1 (async error). | 981 // Start job 1 (async error). |
| 756 TestSocketRequest req1(pool_.get(), &request_order_); | 982 TestSocketRequest req1(pool_.get(), &request_order_); |
| 757 int rv = req1.handle.Init("a", ignored_request_info_, | 983 int rv = req1.handle.Init("a", ignored_request_info_, |
| 758 kDefaultPriority, &req1); | 984 kDefaultPriority, &req1); |
| 759 EXPECT_EQ(ERR_IO_PENDING, rv); | 985 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 760 | 986 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 781 // requests queue, so it starts up job 3 for request 3. This job | 1007 // requests queue, so it starts up job 3 for request 3. This job |
| 782 // synchronously succeeds, so the request order is 1, 3, 2. | 1008 // synchronously succeeds, so the request order is 1, 3, 2. |
| 783 EXPECT_EQ(&req1, request_order_[0]); | 1009 EXPECT_EQ(&req1, request_order_[0]); |
| 784 EXPECT_EQ(&req2, request_order_[2]); | 1010 EXPECT_EQ(&req2, request_order_[2]); |
| 785 EXPECT_EQ(&req3, request_order_[1]); | 1011 EXPECT_EQ(&req3, request_order_[1]); |
| 786 } | 1012 } |
| 787 | 1013 |
| 788 // When a ConnectJob is coupled to a request, even if a free socket becomes | 1014 // When a ConnectJob is coupled to a request, even if a free socket becomes |
| 789 // available, the request will be serviced by the ConnectJob. | 1015 // available, the request will be serviced by the ConnectJob. |
| 790 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) { | 1016 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) { |
| 791 CreatePool(kDefaultMaxSocketsPerGroup); | 1017 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 792 ClientSocketPoolBase::EnableLateBindingOfSockets(false); | 1018 ClientSocketPoolBase::EnableLateBindingOfSockets(false); |
| 793 | 1019 |
| 794 // Start job 1 (async OK) | 1020 // Start job 1 (async OK) |
| 795 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1021 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 796 | 1022 |
| 797 TestSocketRequest req1(pool_.get(), &request_order_); | 1023 TestSocketRequest req1(pool_.get(), &request_order_); |
| 798 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); | 1024 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); |
| 799 EXPECT_EQ(ERR_IO_PENDING, rv); | 1025 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 800 EXPECT_EQ(OK, req1.WaitForResult()); | 1026 EXPECT_EQ(OK, req1.WaitForResult()); |
| 801 | 1027 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 827 | 1053 |
| 828 class ClientSocketPoolBaseTest_LateBinding : public ClientSocketPoolBaseTest { | 1054 class ClientSocketPoolBaseTest_LateBinding : public ClientSocketPoolBaseTest { |
| 829 protected: | 1055 protected: |
| 830 virtual void SetUp() { | 1056 virtual void SetUp() { |
| 831 ClientSocketPoolBaseTest::SetUp(); | 1057 ClientSocketPoolBaseTest::SetUp(); |
| 832 ClientSocketPoolBase::EnableLateBindingOfSockets(true); | 1058 ClientSocketPoolBase::EnableLateBindingOfSockets(true); |
| 833 } | 1059 } |
| 834 }; | 1060 }; |
| 835 | 1061 |
| 836 TEST_F(ClientSocketPoolBaseTest_LateBinding, BasicSynchronous) { | 1062 TEST_F(ClientSocketPoolBaseTest_LateBinding, BasicSynchronous) { |
| 837 CreatePool(kDefaultMaxSocketsPerGroup); | 1063 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 838 | 1064 |
| 839 TestCompletionCallback callback; | 1065 TestCompletionCallback callback; |
| 840 ClientSocketHandle handle(pool_.get()); | 1066 ClientSocketHandle handle(pool_.get()); |
| 841 EXPECT_EQ(OK, handle.Init("a", ignored_request_info_, kDefaultPriority, | 1067 EXPECT_EQ(OK, handle.Init("a", ignored_request_info_, kDefaultPriority, |
| 842 &callback)); | 1068 &callback)); |
| 843 EXPECT_TRUE(handle.is_initialized()); | 1069 EXPECT_TRUE(handle.is_initialized()); |
| 844 EXPECT_TRUE(handle.socket()); | 1070 EXPECT_TRUE(handle.socket()); |
| 845 handle.Reset(); | 1071 handle.Reset(); |
| 846 } | 1072 } |
| 847 | 1073 |
| 848 TEST_F(ClientSocketPoolBaseTest_LateBinding, BasicAsynchronous) { | 1074 TEST_F(ClientSocketPoolBaseTest_LateBinding, BasicAsynchronous) { |
| 849 CreatePool(kDefaultMaxSocketsPerGroup); | 1075 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 850 | 1076 |
| 851 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1077 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 852 TestSocketRequest req(pool_.get(), &request_order_); | 1078 TestSocketRequest req(pool_.get(), &request_order_); |
| 853 int rv = req.handle.Init("a", ignored_request_info_, 0, &req); | 1079 int rv = req.handle.Init("a", ignored_request_info_, 0, &req); |
| 854 EXPECT_EQ(ERR_IO_PENDING, rv); | 1080 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 855 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); | 1081 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); |
| 856 EXPECT_EQ(OK, req.WaitForResult()); | 1082 EXPECT_EQ(OK, req.WaitForResult()); |
| 857 EXPECT_TRUE(req.handle.is_initialized()); | 1083 EXPECT_TRUE(req.handle.is_initialized()); |
| 858 EXPECT_TRUE(req.handle.socket()); | 1084 EXPECT_TRUE(req.handle.socket()); |
| 859 req.handle.Reset(); | 1085 req.handle.Reset(); |
| 860 } | 1086 } |
| 861 | 1087 |
| 862 TEST_F(ClientSocketPoolBaseTest_LateBinding, InitConnectionFailure) { | 1088 TEST_F(ClientSocketPoolBaseTest_LateBinding, InitConnectionFailure) { |
| 863 CreatePool(kDefaultMaxSocketsPerGroup); | 1089 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 864 | 1090 |
| 865 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); | 1091 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); |
| 866 TestSocketRequest req(pool_.get(), &request_order_); | 1092 TestSocketRequest req(pool_.get(), &request_order_); |
| 867 EXPECT_EQ(ERR_CONNECTION_FAILED, | 1093 EXPECT_EQ(ERR_CONNECTION_FAILED, |
| 868 req.handle.Init("a", ignored_request_info_, | 1094 req.handle.Init("a", ignored_request_info_, |
| 869 kDefaultPriority, &req)); | 1095 kDefaultPriority, &req)); |
| 870 } | 1096 } |
| 871 | 1097 |
| 872 TEST_F(ClientSocketPoolBaseTest_LateBinding, | 1098 TEST_F(ClientSocketPoolBaseTest_LateBinding, |
| 873 InitConnectionAsynchronousFailure) { | 1099 InitConnectionAsynchronousFailure) { |
| 874 CreatePool(kDefaultMaxSocketsPerGroup); | 1100 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 875 | 1101 |
| 876 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1102 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 877 TestSocketRequest req(pool_.get(), &request_order_); | 1103 TestSocketRequest req(pool_.get(), &request_order_); |
| 878 EXPECT_EQ(ERR_IO_PENDING, | 1104 EXPECT_EQ(ERR_IO_PENDING, |
| 879 req.handle.Init("a", ignored_request_info_, 5, &req)); | 1105 req.handle.Init("a", ignored_request_info_, 5, &req)); |
| 880 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); | 1106 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &req.handle)); |
| 881 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); | 1107 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); |
| 882 } | 1108 } |
| 883 | 1109 |
| 884 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingRequests) { | 1110 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingRequests) { |
| 885 CreatePool(kDefaultMaxSocketsPerGroup); | 1111 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 886 | 1112 |
| 887 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 1113 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 888 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 1114 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 889 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 1115 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 890 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); | 1116 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); |
| 891 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); | 1117 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); |
| 892 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); | 1118 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); |
| 893 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 1119 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 894 | 1120 |
| 895 ReleaseAllConnections(KEEP_ALIVE); | 1121 ReleaseAllConnections(KEEP_ALIVE); |
| 896 | 1122 |
| 897 EXPECT_EQ(kDefaultMaxSocketsPerGroup, | 1123 EXPECT_EQ(kDefaultMaxSocketsPerGroup, |
| 898 client_socket_factory_.allocation_count()); | 1124 client_socket_factory_.allocation_count()); |
| 899 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, | 1125 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, |
| 900 TestSocketRequest::completion_count); | 1126 TestSocketRequest::completion_count); |
| 901 | 1127 |
| 902 EXPECT_EQ(1, GetOrderOfRequest(1)); | 1128 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 903 EXPECT_EQ(2, GetOrderOfRequest(2)); | 1129 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 904 EXPECT_EQ(6, GetOrderOfRequest(3)); | 1130 EXPECT_EQ(6, GetOrderOfRequest(3)); |
| 905 EXPECT_EQ(4, GetOrderOfRequest(4)); | 1131 EXPECT_EQ(4, GetOrderOfRequest(4)); |
| 906 EXPECT_EQ(3, GetOrderOfRequest(5)); | 1132 EXPECT_EQ(3, GetOrderOfRequest(5)); |
| 907 EXPECT_EQ(5, GetOrderOfRequest(6)); | 1133 EXPECT_EQ(5, GetOrderOfRequest(6)); |
| 908 EXPECT_EQ(7, GetOrderOfRequest(7)); | 1134 EXPECT_EQ(7, GetOrderOfRequest(7)); |
| 909 } | 1135 } |
| 910 | 1136 |
| 911 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingRequests_NoKeepAlive) { | 1137 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingRequests_NoKeepAlive) { |
| 912 CreatePool(kDefaultMaxSocketsPerGroup); | 1138 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 913 | 1139 |
| 914 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 1140 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 915 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 1141 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 916 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 1142 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 917 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); | 1143 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); |
| 918 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); | 1144 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); |
| 919 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); | 1145 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); |
| 920 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 1146 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 921 | 1147 |
| 922 ReleaseAllConnections(NO_KEEP_ALIVE); | 1148 ReleaseAllConnections(NO_KEEP_ALIVE); |
| 923 | 1149 |
| 924 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i) | 1150 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_.size(); ++i) |
| 925 EXPECT_EQ(OK, requests_[i]->WaitForResult()); | 1151 EXPECT_EQ(OK, requests_[i]->WaitForResult()); |
| 926 | 1152 |
| 927 EXPECT_EQ(static_cast<int>(requests_.size()), | 1153 EXPECT_EQ(static_cast<int>(requests_.size()), |
| 928 client_socket_factory_.allocation_count()); | 1154 client_socket_factory_.allocation_count()); |
| 929 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, | 1155 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, |
| 930 TestSocketRequest::completion_count); | 1156 TestSocketRequest::completion_count); |
| 931 } | 1157 } |
| 932 | 1158 |
| 933 // This test will start up a RequestSocket() and then immediately Cancel() it. | 1159 // This test will start up a RequestSocket() and then immediately Cancel() it. |
| 934 // The pending connect job will be cancelled and should not call back into | 1160 // The pending connect job will be cancelled and should not call back into |
| 935 // ClientSocketPoolBase. | 1161 // ClientSocketPoolBase. |
| 936 TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequestClearGroup) { | 1162 TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequestClearGroup) { |
| 937 CreatePool(kDefaultMaxSocketsPerGroup); | 1163 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 938 | 1164 |
| 939 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1165 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 940 TestSocketRequest req(pool_.get(), &request_order_); | 1166 TestSocketRequest req(pool_.get(), &request_order_); |
| 941 EXPECT_EQ(ERR_IO_PENDING, | 1167 EXPECT_EQ(ERR_IO_PENDING, |
| 942 req.handle.Init("a", ignored_request_info_, | 1168 req.handle.Init("a", ignored_request_info_, |
| 943 kDefaultPriority, &req)); | 1169 kDefaultPriority, &req)); |
| 944 req.handle.Reset(); | 1170 req.handle.Reset(); |
| 945 } | 1171 } |
| 946 | 1172 |
| 947 TEST_F(ClientSocketPoolBaseTest_LateBinding, TwoRequestsCancelOne) { | 1173 TEST_F(ClientSocketPoolBaseTest_LateBinding, TwoRequestsCancelOne) { |
| 948 CreatePool(kDefaultMaxSocketsPerGroup); | 1174 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 949 | 1175 |
| 950 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1176 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 951 TestSocketRequest req(pool_.get(), &request_order_); | 1177 TestSocketRequest req(pool_.get(), &request_order_); |
| 952 TestSocketRequest req2(pool_.get(), &request_order_); | 1178 TestSocketRequest req2(pool_.get(), &request_order_); |
| 953 | 1179 |
| 954 EXPECT_EQ(ERR_IO_PENDING, | 1180 EXPECT_EQ(ERR_IO_PENDING, |
| 955 req.handle.Init("a", ignored_request_info_, | 1181 req.handle.Init("a", ignored_request_info_, |
| 956 kDefaultPriority, &req)); | 1182 kDefaultPriority, &req)); |
| 957 EXPECT_EQ(ERR_IO_PENDING, | 1183 EXPECT_EQ(ERR_IO_PENDING, |
| 958 req2.handle.Init("a", ignored_request_info_, | 1184 req2.handle.Init("a", ignored_request_info_, |
| 959 kDefaultPriority, &req2)); | 1185 kDefaultPriority, &req2)); |
| 960 | 1186 |
| 961 req.handle.Reset(); | 1187 req.handle.Reset(); |
| 962 | 1188 |
| 963 EXPECT_EQ(OK, req2.WaitForResult()); | 1189 EXPECT_EQ(OK, req2.WaitForResult()); |
| 964 req2.handle.Reset(); | 1190 req2.handle.Reset(); |
| 965 } | 1191 } |
| 966 | 1192 |
| 967 TEST_F(ClientSocketPoolBaseTest_LateBinding, ConnectCancelConnect) { | 1193 TEST_F(ClientSocketPoolBaseTest_LateBinding, ConnectCancelConnect) { |
| 968 CreatePool(kDefaultMaxSocketsPerGroup); | 1194 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 969 | 1195 |
| 970 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1196 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 971 ClientSocketHandle handle(pool_.get()); | 1197 ClientSocketHandle handle(pool_.get()); |
| 972 TestCompletionCallback callback; | 1198 TestCompletionCallback callback; |
| 973 TestSocketRequest req(pool_.get(), &request_order_); | 1199 TestSocketRequest req(pool_.get(), &request_order_); |
| 974 | 1200 |
| 975 EXPECT_EQ(ERR_IO_PENDING, | 1201 EXPECT_EQ(ERR_IO_PENDING, |
| 976 handle.Init("a", ignored_request_info_, | 1202 handle.Init("a", ignored_request_info_, |
| 977 kDefaultPriority, &callback)); | 1203 kDefaultPriority, &callback)); |
| 978 | 1204 |
| 979 handle.Reset(); | 1205 handle.Reset(); |
| 980 | 1206 |
| 981 TestCompletionCallback callback2; | 1207 TestCompletionCallback callback2; |
| 982 EXPECT_EQ(ERR_IO_PENDING, | 1208 EXPECT_EQ(ERR_IO_PENDING, |
| 983 handle.Init("a", ignored_request_info_, | 1209 handle.Init("a", ignored_request_info_, |
| 984 kDefaultPriority, &callback2)); | 1210 kDefaultPriority, &callback2)); |
| 985 | 1211 |
| 986 EXPECT_EQ(OK, callback2.WaitForResult()); | 1212 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 987 EXPECT_FALSE(callback.have_result()); | 1213 EXPECT_FALSE(callback.have_result()); |
| 988 | 1214 |
| 989 handle.Reset(); | 1215 handle.Reset(); |
| 990 } | 1216 } |
| 991 | 1217 |
| 992 TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequest) { | 1218 TEST_F(ClientSocketPoolBaseTest_LateBinding, CancelRequest) { |
| 993 CreatePool(kDefaultMaxSocketsPerGroup); | 1219 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 994 | 1220 |
| 995 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 1221 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 996 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); | 1222 EXPECT_EQ(OK, StartRequest("a", kDefaultPriority)); |
| 997 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 1223 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 998 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); | 1224 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 3)); |
| 999 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); | 1225 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 4)); |
| 1000 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); | 1226 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 2)); |
| 1001 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); | 1227 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", 1)); |
| 1002 | 1228 |
| 1003 // Cancel a request. | 1229 // Cancel a request. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1015 EXPECT_EQ(1, GetOrderOfRequest(1)); | 1241 EXPECT_EQ(1, GetOrderOfRequest(1)); |
| 1016 EXPECT_EQ(2, GetOrderOfRequest(2)); | 1242 EXPECT_EQ(2, GetOrderOfRequest(2)); |
| 1017 EXPECT_EQ(5, GetOrderOfRequest(3)); | 1243 EXPECT_EQ(5, GetOrderOfRequest(3)); |
| 1018 EXPECT_EQ(3, GetOrderOfRequest(4)); | 1244 EXPECT_EQ(3, GetOrderOfRequest(4)); |
| 1019 EXPECT_EQ(kRequestNotFound, GetOrderOfRequest(5)); // Canceled request. | 1245 EXPECT_EQ(kRequestNotFound, GetOrderOfRequest(5)); // Canceled request. |
| 1020 EXPECT_EQ(4, GetOrderOfRequest(6)); | 1246 EXPECT_EQ(4, GetOrderOfRequest(6)); |
| 1021 EXPECT_EQ(6, GetOrderOfRequest(7)); | 1247 EXPECT_EQ(6, GetOrderOfRequest(7)); |
| 1022 } | 1248 } |
| 1023 | 1249 |
| 1024 TEST_F(ClientSocketPoolBaseTest_LateBinding, RequestPendingJobTwice) { | 1250 TEST_F(ClientSocketPoolBaseTest_LateBinding, RequestPendingJobTwice) { |
| 1025 CreatePool(kDefaultMaxSocketsPerGroup); | 1251 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1026 | 1252 |
| 1027 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1253 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1028 ClientSocketHandle handle(pool_.get()); | 1254 ClientSocketHandle handle(pool_.get()); |
| 1029 RequestSocketCallback callback( | 1255 RequestSocketCallback callback( |
| 1030 &handle, connect_job_factory_, TestConnectJob::kMockPendingJob); | 1256 &handle, connect_job_factory_, TestConnectJob::kMockPendingJob); |
| 1031 int rv = handle.Init( | 1257 int rv = handle.Init( |
| 1032 "a", ignored_request_info_, kDefaultPriority, &callback); | 1258 "a", ignored_request_info_, kDefaultPriority, &callback); |
| 1033 ASSERT_EQ(ERR_IO_PENDING, rv); | 1259 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 1034 | 1260 |
| 1035 EXPECT_EQ(OK, callback.WaitForResult()); | 1261 EXPECT_EQ(OK, callback.WaitForResult()); |
| 1036 handle.Reset(); | 1262 handle.Reset(); |
| 1037 } | 1263 } |
| 1038 | 1264 |
| 1039 TEST_F(ClientSocketPoolBaseTest_LateBinding, RequestPendingJobThenSynchronous) { | 1265 TEST_F(ClientSocketPoolBaseTest_LateBinding, RequestPendingJobThenSynchronous) { |
| 1040 CreatePool(kDefaultMaxSocketsPerGroup); | 1266 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1041 | 1267 |
| 1042 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1268 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1043 ClientSocketHandle handle(pool_.get()); | 1269 ClientSocketHandle handle(pool_.get()); |
| 1044 RequestSocketCallback callback( | 1270 RequestSocketCallback callback( |
| 1045 &handle, connect_job_factory_, TestConnectJob::kMockJob); | 1271 &handle, connect_job_factory_, TestConnectJob::kMockJob); |
| 1046 int rv = handle.Init( | 1272 int rv = handle.Init( |
| 1047 "a", ignored_request_info_, kDefaultPriority, &callback); | 1273 "a", ignored_request_info_, kDefaultPriority, &callback); |
| 1048 ASSERT_EQ(ERR_IO_PENDING, rv); | 1274 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 1049 | 1275 |
| 1050 EXPECT_EQ(OK, callback.WaitForResult()); | 1276 EXPECT_EQ(OK, callback.WaitForResult()); |
| 1051 handle.Reset(); | 1277 handle.Reset(); |
| 1052 } | 1278 } |
| 1053 | 1279 |
| 1054 // Make sure that pending requests get serviced after active requests get | 1280 // Make sure that pending requests get serviced after active requests get |
| 1055 // cancelled. | 1281 // cancelled. |
| 1056 TEST_F(ClientSocketPoolBaseTest_LateBinding, | 1282 TEST_F(ClientSocketPoolBaseTest_LateBinding, |
| 1057 CancelActiveRequestWithPendingRequests) { | 1283 CancelActiveRequestWithPendingRequests) { |
| 1058 CreatePool(kDefaultMaxSocketsPerGroup); | 1284 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1059 | 1285 |
| 1060 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1286 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1061 | 1287 |
| 1062 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 1288 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 1063 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 1289 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 1064 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 1290 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 1065 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 1291 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 1066 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 1292 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 1067 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 1293 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 1068 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); | 1294 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1080 requests_[i]->handle.Reset(); | 1306 requests_[i]->handle.Reset(); |
| 1081 } | 1307 } |
| 1082 | 1308 |
| 1083 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, | 1309 EXPECT_EQ(requests_.size() - kDefaultMaxSocketsPerGroup, |
| 1084 TestSocketRequest::completion_count); | 1310 TestSocketRequest::completion_count); |
| 1085 } | 1311 } |
| 1086 | 1312 |
| 1087 // Make sure that pending requests get serviced after active requests fail. | 1313 // Make sure that pending requests get serviced after active requests fail. |
| 1088 TEST_F(ClientSocketPoolBaseTest_LateBinding, | 1314 TEST_F(ClientSocketPoolBaseTest_LateBinding, |
| 1089 FailingActiveRequestWithPendingRequests) { | 1315 FailingActiveRequestWithPendingRequests) { |
| 1090 CreatePool(kDefaultMaxSocketsPerGroup); | 1316 const int kMaxSockets = 5; |
| 1317 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1091 | 1318 |
| 1092 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1319 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 1093 | 1320 |
| 1094 scoped_ptr<TestSocketRequest> reqs[kDefaultMaxSocketsPerGroup * 2 + 1]; | 1321 const int kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1; |
| 1322 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test hangs. |
| 1095 | 1323 |
| 1096 // Queue up all the requests | 1324 // Queue up all the requests |
| 1097 for (size_t i = 0; i < arraysize(reqs); ++i) { | 1325 for (int i = 0; i < kNumberOfRequests; ++i) |
| 1098 reqs[i].reset(new TestSocketRequest(pool_.get(), &request_order_)); | 1326 EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); |
| 1099 int rv = reqs[i]->handle.Init("a", ignored_request_info_, | |
| 1100 kDefaultPriority, reqs[i].get()); | |
| 1101 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1102 } | |
| 1103 | 1327 |
| 1104 for (size_t i = 0; i < arraysize(reqs); ++i) | 1328 for (int i = 0; i < kNumberOfRequests; ++i) |
| 1105 EXPECT_EQ(ERR_CONNECTION_FAILED, reqs[i]->WaitForResult()); | 1329 EXPECT_EQ(ERR_CONNECTION_FAILED, requests_[i]->WaitForResult()); |
| 1106 } | 1330 } |
| 1107 | 1331 |
| 1108 TEST_F(ClientSocketPoolBaseTest_LateBinding, | 1332 TEST_F(ClientSocketPoolBaseTest_LateBinding, |
| 1109 CancelActiveRequestThenRequestSocket) { | 1333 CancelActiveRequestThenRequestSocket) { |
| 1110 CreatePool(kDefaultMaxSocketsPerGroup); | 1334 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1111 | 1335 |
| 1112 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1336 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1113 | 1337 |
| 1114 TestSocketRequest req(pool_.get(), &request_order_); | 1338 TestSocketRequest req(pool_.get(), &request_order_); |
| 1115 int rv = req.handle.Init( | 1339 int rv = req.handle.Init( |
| 1116 "a", ignored_request_info_, kDefaultPriority, &req); | 1340 "a", ignored_request_info_, kDefaultPriority, &req); |
| 1117 EXPECT_EQ(ERR_IO_PENDING, rv); | 1341 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1118 | 1342 |
| 1119 // Cancel the active request. | 1343 // Cancel the active request. |
| 1120 req.handle.Reset(); | 1344 req.handle.Reset(); |
| 1121 | 1345 |
| 1122 rv = req.handle.Init("a", ignored_request_info_, kDefaultPriority, &req); | 1346 rv = req.handle.Init("a", ignored_request_info_, kDefaultPriority, &req); |
| 1123 EXPECT_EQ(ERR_IO_PENDING, rv); | 1347 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1124 EXPECT_EQ(OK, req.WaitForResult()); | 1348 EXPECT_EQ(OK, req.WaitForResult()); |
| 1125 | 1349 |
| 1126 EXPECT_FALSE(req.handle.is_reused()); | 1350 EXPECT_FALSE(req.handle.is_reused()); |
| 1127 EXPECT_EQ(1U, TestSocketRequest::completion_count); | 1351 EXPECT_EQ(1U, TestSocketRequest::completion_count); |
| 1128 EXPECT_EQ(2, client_socket_factory_.allocation_count()); | 1352 EXPECT_EQ(2, client_socket_factory_.allocation_count()); |
| 1129 } | 1353 } |
| 1130 | 1354 |
| 1131 // When requests and ConnectJobs are not coupled, the request will get serviced | 1355 // When requests and ConnectJobs are not coupled, the request will get serviced |
| 1132 // by whatever comes first. | 1356 // by whatever comes first. |
| 1133 TEST_F(ClientSocketPoolBaseTest_LateBinding, ReleaseSockets) { | 1357 TEST_F(ClientSocketPoolBaseTest_LateBinding, ReleaseSockets) { |
| 1134 CreatePool(kDefaultMaxSocketsPerGroup); | 1358 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1135 | 1359 |
| 1136 // Start job 1 (async OK) | 1360 // Start job 1 (async OK) |
| 1137 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1361 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1138 | 1362 |
| 1139 TestSocketRequest req1(pool_.get(), &request_order_); | 1363 TestSocketRequest req1(pool_.get(), &request_order_); |
| 1140 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); | 1364 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); |
| 1141 EXPECT_EQ(ERR_IO_PENDING, rv); | 1365 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1142 EXPECT_EQ(OK, req1.WaitForResult()); | 1366 EXPECT_EQ(OK, req1.WaitForResult()); |
| 1143 | 1367 |
| 1144 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending | 1368 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1168 ASSERT_EQ(3U, request_order_.size()); | 1392 ASSERT_EQ(3U, request_order_.size()); |
| 1169 EXPECT_EQ(&req1, request_order_[0]); | 1393 EXPECT_EQ(&req1, request_order_[0]); |
| 1170 EXPECT_EQ(&req2, request_order_[1]); | 1394 EXPECT_EQ(&req2, request_order_[1]); |
| 1171 EXPECT_EQ(&req3, request_order_[2]); | 1395 EXPECT_EQ(&req3, request_order_[2]); |
| 1172 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 1396 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 1173 } | 1397 } |
| 1174 | 1398 |
| 1175 // The requests are not coupled to the jobs. So, the requests should finish in | 1399 // The requests are not coupled to the jobs. So, the requests should finish in |
| 1176 // their priority / insertion order. | 1400 // their priority / insertion order. |
| 1177 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingJobCompletionOrder) { | 1401 TEST_F(ClientSocketPoolBaseTest_LateBinding, PendingJobCompletionOrder) { |
| 1178 CreatePool(kDefaultMaxSocketsPerGroup); | 1402 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1179 // First two jobs are async. | 1403 // First two jobs are async. |
| 1180 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1404 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 1181 | 1405 |
| 1182 TestSocketRequest req1(pool_.get(), &request_order_); | 1406 TestSocketRequest req1(pool_.get(), &request_order_); |
| 1183 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); | 1407 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); |
| 1184 EXPECT_EQ(ERR_IO_PENDING, rv); | 1408 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1185 | 1409 |
| 1186 TestSocketRequest req2(pool_.get(), &request_order_); | 1410 TestSocketRequest req2(pool_.get(), &request_order_); |
| 1187 rv = req2.handle.Init("a", ignored_request_info_, 5, &req2); | 1411 rv = req2.handle.Init("a", ignored_request_info_, 5, &req2); |
| 1188 EXPECT_EQ(ERR_IO_PENDING, rv); | 1412 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1189 | 1413 |
| 1190 // The pending job is sync. | 1414 // The pending job is sync. |
| 1191 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1415 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 1192 | 1416 |
| 1193 TestSocketRequest req3(pool_.get(), &request_order_); | 1417 TestSocketRequest req3(pool_.get(), &request_order_); |
| 1194 rv = req3.handle.Init("a", ignored_request_info_, 5, &req3); | 1418 rv = req3.handle.Init("a", ignored_request_info_, 5, &req3); |
| 1195 EXPECT_EQ(ERR_IO_PENDING, rv); | 1419 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1196 | 1420 |
| 1197 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); | 1421 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); |
| 1198 EXPECT_EQ(OK, req2.WaitForResult()); | 1422 EXPECT_EQ(OK, req2.WaitForResult()); |
| 1199 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); | 1423 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); |
| 1200 | 1424 |
| 1201 ASSERT_EQ(3U, request_order_.size()); | 1425 ASSERT_EQ(3U, request_order_.size()); |
| 1202 EXPECT_EQ(&req1, request_order_[0]); | 1426 EXPECT_EQ(&req1, request_order_[0]); |
| 1203 EXPECT_EQ(&req2, request_order_[1]); | 1427 EXPECT_EQ(&req2, request_order_[1]); |
| 1204 EXPECT_EQ(&req3, request_order_[2]); | 1428 EXPECT_EQ(&req3, request_order_[2]); |
| 1205 } | 1429 } |
| 1206 | 1430 |
| 1207 TEST_F(ClientSocketPoolBaseTest_LateBinding, DISABLED_LoadState) { | 1431 TEST_F(ClientSocketPoolBaseTest_LateBinding, DISABLED_LoadState) { |
| 1208 CreatePool(kDefaultMaxSocketsPerGroup); | 1432 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1209 connect_job_factory_->set_job_type( | 1433 connect_job_factory_->set_job_type( |
| 1210 TestConnectJob::kMockAdvancingLoadStateJob); | 1434 TestConnectJob::kMockAdvancingLoadStateJob); |
| 1211 | 1435 |
| 1212 TestSocketRequest req1(pool_.get(), &request_order_); | 1436 TestSocketRequest req1(pool_.get(), &request_order_); |
| 1213 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); | 1437 int rv = req1.handle.Init("a", ignored_request_info_, 5, &req1); |
| 1214 EXPECT_EQ(ERR_IO_PENDING, rv); | 1438 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1215 EXPECT_EQ(LOAD_STATE_IDLE, req1.handle.GetLoadState()); | 1439 EXPECT_EQ(LOAD_STATE_IDLE, req1.handle.GetLoadState()); |
| 1216 | 1440 |
| 1217 MessageLoop::current()->RunAllPending(); | 1441 MessageLoop::current()->RunAllPending(); |
| 1218 | 1442 |
| 1219 TestSocketRequest req2(pool_.get(), &request_order_); | 1443 TestSocketRequest req2(pool_.get(), &request_order_); |
| 1220 rv = req2.handle.Init("a", ignored_request_info_, 5, &req2); | 1444 rv = req2.handle.Init("a", ignored_request_info_, 5, &req2); |
| 1221 EXPECT_EQ(ERR_IO_PENDING, rv); | 1445 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1222 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req1.handle.GetLoadState()); | 1446 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req1.handle.GetLoadState()); |
| 1223 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req2.handle.GetLoadState()); | 1447 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, req2.handle.GetLoadState()); |
| 1224 } | 1448 } |
| 1225 | 1449 |
| 1226 } // namespace | 1450 } // namespace |
| 1227 | 1451 |
| 1228 } // namespace net | 1452 } // namespace net |
| OLD | NEW |