OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 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 <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 | 479 |
480 class TestClientSocketPool : public ClientSocketPool { | 480 class TestClientSocketPool : public ClientSocketPool { |
481 public: | 481 public: |
482 TestClientSocketPool( | 482 TestClientSocketPool( |
483 int max_sockets, | 483 int max_sockets, |
484 int max_sockets_per_group, | 484 int max_sockets_per_group, |
485 ClientSocketPoolHistograms* histograms, | 485 ClientSocketPoolHistograms* histograms, |
486 base::TimeDelta unused_idle_socket_timeout, | 486 base::TimeDelta unused_idle_socket_timeout, |
487 base::TimeDelta used_idle_socket_timeout, | 487 base::TimeDelta used_idle_socket_timeout, |
488 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) | 488 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) |
489 : base_(max_sockets, max_sockets_per_group, histograms, | 489 : base_(NULL, max_sockets, max_sockets_per_group, histograms, |
490 unused_idle_socket_timeout, used_idle_socket_timeout, | 490 unused_idle_socket_timeout, used_idle_socket_timeout, |
491 connect_job_factory) {} | 491 connect_job_factory) {} |
492 | 492 |
493 virtual ~TestClientSocketPool() {} | 493 virtual ~TestClientSocketPool() {} |
494 | 494 |
495 virtual int RequestSocket( | 495 virtual int RequestSocket( |
496 const std::string& group_name, | 496 const std::string& group_name, |
497 const void* params, | 497 const void* params, |
498 net::RequestPriority priority, | 498 net::RequestPriority priority, |
499 ClientSocketHandle* handle, | 499 ClientSocketHandle* handle, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 const std::string& group_name) const OVERRIDE { | 548 const std::string& group_name) const OVERRIDE { |
549 return base_.IdleSocketCountInGroup(group_name); | 549 return base_.IdleSocketCountInGroup(group_name); |
550 } | 550 } |
551 | 551 |
552 virtual LoadState GetLoadState( | 552 virtual LoadState GetLoadState( |
553 const std::string& group_name, | 553 const std::string& group_name, |
554 const ClientSocketHandle* handle) const OVERRIDE { | 554 const ClientSocketHandle* handle) const OVERRIDE { |
555 return base_.GetLoadState(group_name, handle); | 555 return base_.GetLoadState(group_name, handle); |
556 } | 556 } |
557 | 557 |
558 virtual void AddLayeredPool(LayeredPool* pool) OVERRIDE { | 558 virtual void AddHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE { |
559 base_.AddLayeredPool(pool); | 559 base_.AddHigherLayeredPool(higher_pool); |
560 } | 560 } |
561 | 561 |
562 virtual void RemoveLayeredPool(LayeredPool* pool) OVERRIDE { | 562 virtual void RemoveHigherLayeredPool( |
563 base_.RemoveLayeredPool(pool); | 563 HigherLayeredPool* higher_pool) OVERRIDE { |
| 564 base_.RemoveHigherLayeredPool(higher_pool); |
564 } | 565 } |
565 | 566 |
566 virtual base::DictionaryValue* GetInfoAsValue( | 567 virtual base::DictionaryValue* GetInfoAsValue( |
567 const std::string& name, | 568 const std::string& name, |
568 const std::string& type, | 569 const std::string& type, |
569 bool include_nested_pools) const OVERRIDE { | 570 bool include_nested_pools) const OVERRIDE { |
570 return base_.GetInfoAsValue(name, type); | 571 return base_.GetInfoAsValue(name, type); |
571 } | 572 } |
572 | 573 |
573 virtual base::TimeDelta ConnectionTimeout() const OVERRIDE { | 574 virtual base::TimeDelta ConnectionTimeout() const OVERRIDE { |
(...skipping 19 matching lines...) Expand all Loading... |
593 } | 594 } |
594 | 595 |
595 bool HasGroup(const std::string& group_name) const { | 596 bool HasGroup(const std::string& group_name) const { |
596 return base_.HasGroup(group_name); | 597 return base_.HasGroup(group_name); |
597 } | 598 } |
598 | 599 |
599 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); } | 600 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); } |
600 | 601 |
601 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); } | 602 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); } |
602 | 603 |
603 bool CloseOneIdleConnectionInLayeredPool() { | 604 bool CloseOneIdleConnectionInHigherLayeredPool() { |
604 return base_.CloseOneIdleConnectionInLayeredPool(); | 605 return base_.CloseOneIdleConnectionInHigherLayeredPool(); |
605 } | 606 } |
606 | 607 |
607 private: | 608 private: |
608 TestClientSocketPoolBase base_; | 609 TestClientSocketPoolBase base_; |
609 | 610 |
610 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); | 611 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); |
611 }; | 612 }; |
612 | 613 |
613 } // namespace | 614 } // namespace |
614 | 615 |
(...skipping 2948 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3563 ASSERT_EQ(OK, callback.WaitForResult()); | 3564 ASSERT_EQ(OK, callback.WaitForResult()); |
3564 | 3565 |
3565 // The hung connect job should still be there, but everything else should be | 3566 // The hung connect job should still be there, but everything else should be |
3566 // complete. | 3567 // complete. |
3567 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3568 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
3568 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3569 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3569 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3570 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3570 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 3571 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
3571 } | 3572 } |
3572 | 3573 |
3573 class MockLayeredPool : public LayeredPool { | 3574 class MockLayeredPool : public HigherLayeredPool { |
3574 public: | 3575 public: |
3575 MockLayeredPool(TestClientSocketPool* pool, | 3576 MockLayeredPool(TestClientSocketPool* pool, |
3576 const std::string& group_name) | 3577 const std::string& group_name) |
3577 : pool_(pool), | 3578 : pool_(pool), |
3578 params_(new TestSocketParams), | 3579 params_(new TestSocketParams), |
3579 group_name_(group_name), | 3580 group_name_(group_name), |
3580 can_release_connection_(true) { | 3581 can_release_connection_(true) { |
3581 pool_->AddLayeredPool(this); | 3582 pool_->AddHigherLayeredPool(this); |
3582 } | 3583 } |
3583 | 3584 |
3584 ~MockLayeredPool() { | 3585 ~MockLayeredPool() { |
3585 pool_->RemoveLayeredPool(this); | 3586 pool_->RemoveHigherLayeredPool(this); |
3586 } | 3587 } |
3587 | 3588 |
3588 int RequestSocket(TestClientSocketPool* pool) { | 3589 int RequestSocket(TestClientSocketPool* pool) { |
3589 return handle_.Init(group_name_, params_, kDefaultPriority, | 3590 return handle_.Init(group_name_, params_, kDefaultPriority, |
3590 callback_.callback(), pool, BoundNetLog()); | 3591 callback_.callback(), pool, BoundNetLog()); |
3591 } | 3592 } |
3592 | 3593 |
3593 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { | 3594 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { |
3594 params_->set_ignore_limits(true); | 3595 params_->set_ignore_limits(true); |
3595 return handle_.Init(group_name_, params_, kDefaultPriority, | 3596 return handle_.Init(group_name_, params_, kDefaultPriority, |
(...skipping 25 matching lines...) Expand all Loading... |
3621 }; | 3622 }; |
3622 | 3623 |
3623 TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) { | 3624 TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) { |
3624 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3625 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
3625 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3626 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3626 | 3627 |
3627 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3628 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
3628 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3629 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
3629 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3630 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
3630 .WillOnce(Return(false)); | 3631 .WillOnce(Return(false)); |
3631 EXPECT_FALSE(pool_->CloseOneIdleConnectionInLayeredPool()); | 3632 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); |
3632 } | 3633 } |
3633 | 3634 |
3634 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) { | 3635 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) { |
3635 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3636 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
3636 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3637 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3637 | 3638 |
3638 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3639 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
3639 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3640 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
3640 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3641 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
3641 .WillOnce(Invoke(&mock_layered_pool, | 3642 .WillOnce(Invoke(&mock_layered_pool, |
3642 &MockLayeredPool::ReleaseOneConnection)); | 3643 &MockLayeredPool::ReleaseOneConnection)); |
3643 EXPECT_TRUE(pool_->CloseOneIdleConnectionInLayeredPool()); | 3644 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); |
3644 } | 3645 } |
3645 | 3646 |
3646 // Tests the basic case of closing an idle socket in a higher layered pool when | 3647 // Tests the basic case of closing an idle socket in a higher layered pool when |
3647 // a new request is issued and the lower layer pool is stalled. | 3648 // a new request is issued and the lower layer pool is stalled. |
3648 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) { | 3649 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) { |
3649 CreatePool(1, 1); | 3650 CreatePool(1, 1); |
3650 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3651 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3651 | 3652 |
3652 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3653 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
3653 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3654 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4010 EXPECT_EQ(1, GetOrderOfRequest(5)); | 4011 EXPECT_EQ(1, GetOrderOfRequest(5)); |
4011 EXPECT_EQ(2, GetOrderOfRequest(3)); | 4012 EXPECT_EQ(2, GetOrderOfRequest(3)); |
4012 EXPECT_EQ(3, GetOrderOfRequest(4)); | 4013 EXPECT_EQ(3, GetOrderOfRequest(4)); |
4013 EXPECT_EQ(4, GetOrderOfRequest(1)); | 4014 EXPECT_EQ(4, GetOrderOfRequest(1)); |
4014 EXPECT_EQ(5, GetOrderOfRequest(2)); | 4015 EXPECT_EQ(5, GetOrderOfRequest(2)); |
4015 } | 4016 } |
4016 | 4017 |
4017 } // namespace | 4018 } // namespace |
4018 | 4019 |
4019 } // namespace net | 4020 } // namespace net |
OLD | NEW |