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 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 public: | 470 public: |
471 typedef TestSocketParams SocketParams; | 471 typedef TestSocketParams SocketParams; |
472 | 472 |
473 TestClientSocketPool( | 473 TestClientSocketPool( |
474 int max_sockets, | 474 int max_sockets, |
475 int max_sockets_per_group, | 475 int max_sockets_per_group, |
476 ClientSocketPoolHistograms* histograms, | 476 ClientSocketPoolHistograms* histograms, |
477 base::TimeDelta unused_idle_socket_timeout, | 477 base::TimeDelta unused_idle_socket_timeout, |
478 base::TimeDelta used_idle_socket_timeout, | 478 base::TimeDelta used_idle_socket_timeout, |
479 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) | 479 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory) |
480 : base_(max_sockets, max_sockets_per_group, histograms, | 480 : base_(NULL, max_sockets, max_sockets_per_group, histograms, |
481 unused_idle_socket_timeout, used_idle_socket_timeout, | 481 unused_idle_socket_timeout, used_idle_socket_timeout, |
482 connect_job_factory) {} | 482 connect_job_factory) {} |
483 | 483 |
484 virtual ~TestClientSocketPool() {} | 484 virtual ~TestClientSocketPool() {} |
485 | 485 |
486 virtual int RequestSocket( | 486 virtual int RequestSocket( |
487 const std::string& group_name, | 487 const std::string& group_name, |
488 const void* params, | 488 const void* params, |
489 net::RequestPriority priority, | 489 net::RequestPriority priority, |
490 ClientSocketHandle* handle, | 490 ClientSocketHandle* handle, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 const std::string& group_name) const OVERRIDE { | 539 const std::string& group_name) const OVERRIDE { |
540 return base_.IdleSocketCountInGroup(group_name); | 540 return base_.IdleSocketCountInGroup(group_name); |
541 } | 541 } |
542 | 542 |
543 virtual LoadState GetLoadState( | 543 virtual LoadState GetLoadState( |
544 const std::string& group_name, | 544 const std::string& group_name, |
545 const ClientSocketHandle* handle) const OVERRIDE { | 545 const ClientSocketHandle* handle) const OVERRIDE { |
546 return base_.GetLoadState(group_name, handle); | 546 return base_.GetLoadState(group_name, handle); |
547 } | 547 } |
548 | 548 |
549 virtual void AddLayeredPool(LayeredPool* pool) OVERRIDE { | 549 virtual void AddHigherLayeredPool(HigherLayeredPool* higher_pool) OVERRIDE { |
550 base_.AddLayeredPool(pool); | 550 base_.AddHigherLayeredPool(higher_pool); |
551 } | 551 } |
552 | 552 |
553 virtual void RemoveLayeredPool(LayeredPool* pool) OVERRIDE { | 553 virtual void RemoveHigherLayeredPool( |
554 base_.RemoveLayeredPool(pool); | 554 HigherLayeredPool* higher_pool) OVERRIDE { |
| 555 base_.RemoveHigherLayeredPool(higher_pool); |
555 } | 556 } |
556 | 557 |
557 virtual base::DictionaryValue* GetInfoAsValue( | 558 virtual base::DictionaryValue* GetInfoAsValue( |
558 const std::string& name, | 559 const std::string& name, |
559 const std::string& type, | 560 const std::string& type, |
560 bool include_nested_pools) const OVERRIDE { | 561 bool include_nested_pools) const OVERRIDE { |
561 return base_.GetInfoAsValue(name, type); | 562 return base_.GetInfoAsValue(name, type); |
562 } | 563 } |
563 | 564 |
564 virtual base::TimeDelta ConnectionTimeout() const OVERRIDE { | 565 virtual base::TimeDelta ConnectionTimeout() const OVERRIDE { |
(...skipping 19 matching lines...) Expand all Loading... |
584 } | 585 } |
585 | 586 |
586 bool HasGroup(const std::string& group_name) const { | 587 bool HasGroup(const std::string& group_name) const { |
587 return base_.HasGroup(group_name); | 588 return base_.HasGroup(group_name); |
588 } | 589 } |
589 | 590 |
590 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); } | 591 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); } |
591 | 592 |
592 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); } | 593 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); } |
593 | 594 |
594 bool CloseOneIdleConnectionInLayeredPool() { | 595 bool CloseOneIdleConnectionInHigherLayeredPool() { |
595 return base_.CloseOneIdleConnectionInLayeredPool(); | 596 return base_.CloseOneIdleConnectionInHigherLayeredPool(); |
596 } | 597 } |
597 | 598 |
598 private: | 599 private: |
599 TestClientSocketPoolBase base_; | 600 TestClientSocketPoolBase base_; |
600 | 601 |
601 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); | 602 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool); |
602 }; | 603 }; |
603 | 604 |
604 } // namespace | 605 } // namespace |
605 | 606 |
(...skipping 3105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3711 ASSERT_EQ(OK, callback.WaitForResult()); | 3712 ASSERT_EQ(OK, callback.WaitForResult()); |
3712 | 3713 |
3713 // The hung connect job should still be there, but everything else should be | 3714 // The hung connect job should still be there, but everything else should be |
3714 // complete. | 3715 // complete. |
3715 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3716 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
3716 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3717 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
3717 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3718 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
3718 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 3719 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
3719 } | 3720 } |
3720 | 3721 |
3721 class MockLayeredPool : public LayeredPool { | 3722 class MockLayeredPool : public HigherLayeredPool { |
3722 public: | 3723 public: |
3723 MockLayeredPool(TestClientSocketPool* pool, | 3724 MockLayeredPool(TestClientSocketPool* pool, |
3724 const std::string& group_name) | 3725 const std::string& group_name) |
3725 : pool_(pool), | 3726 : pool_(pool), |
3726 params_(new TestSocketParams), | 3727 params_(new TestSocketParams), |
3727 group_name_(group_name), | 3728 group_name_(group_name), |
3728 can_release_connection_(true) { | 3729 can_release_connection_(true) { |
3729 pool_->AddLayeredPool(this); | 3730 pool_->AddHigherLayeredPool(this); |
3730 } | 3731 } |
3731 | 3732 |
3732 ~MockLayeredPool() { | 3733 ~MockLayeredPool() { |
3733 pool_->RemoveLayeredPool(this); | 3734 pool_->RemoveHigherLayeredPool(this); |
3734 } | 3735 } |
3735 | 3736 |
3736 int RequestSocket(TestClientSocketPool* pool) { | 3737 int RequestSocket(TestClientSocketPool* pool) { |
3737 return handle_.Init(group_name_, params_, kDefaultPriority, | 3738 return handle_.Init(group_name_, params_, kDefaultPriority, |
3738 callback_.callback(), pool, BoundNetLog()); | 3739 callback_.callback(), pool, BoundNetLog()); |
3739 } | 3740 } |
3740 | 3741 |
3741 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { | 3742 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { |
3742 params_->set_ignore_limits(true); | 3743 params_->set_ignore_limits(true); |
3743 return handle_.Init(group_name_, params_, kDefaultPriority, | 3744 return handle_.Init(group_name_, params_, kDefaultPriority, |
(...skipping 25 matching lines...) Expand all Loading... |
3769 }; | 3770 }; |
3770 | 3771 |
3771 TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) { | 3772 TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) { |
3772 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3773 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
3773 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3774 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3774 | 3775 |
3775 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3776 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
3776 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3777 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
3777 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3778 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
3778 .WillOnce(Return(false)); | 3779 .WillOnce(Return(false)); |
3779 EXPECT_FALSE(pool_->CloseOneIdleConnectionInLayeredPool()); | 3780 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); |
3780 } | 3781 } |
3781 | 3782 |
3782 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) { | 3783 TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) { |
3783 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3784 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
3784 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3785 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3785 | 3786 |
3786 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3787 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
3787 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3788 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
3788 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3789 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
3789 .WillOnce(Invoke(&mock_layered_pool, | 3790 .WillOnce(Invoke(&mock_layered_pool, |
3790 &MockLayeredPool::ReleaseOneConnection)); | 3791 &MockLayeredPool::ReleaseOneConnection)); |
3791 EXPECT_TRUE(pool_->CloseOneIdleConnectionInLayeredPool()); | 3792 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool()); |
3792 } | 3793 } |
3793 | 3794 |
3794 // Tests the basic case of closing an idle socket in a higher layered pool when | 3795 // Tests the basic case of closing an idle socket in a higher layered pool when |
3795 // a new request is issued and the lower layer pool is stalled. | 3796 // a new request is issued and the lower layer pool is stalled. |
3796 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) { | 3797 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) { |
3797 CreatePool(1, 1); | 3798 CreatePool(1, 1); |
3798 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3799 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
3799 | 3800 |
3800 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3801 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
3801 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3802 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4158 EXPECT_EQ(1, GetOrderOfRequest(5)); | 4159 EXPECT_EQ(1, GetOrderOfRequest(5)); |
4159 EXPECT_EQ(2, GetOrderOfRequest(3)); | 4160 EXPECT_EQ(2, GetOrderOfRequest(3)); |
4160 EXPECT_EQ(3, GetOrderOfRequest(4)); | 4161 EXPECT_EQ(3, GetOrderOfRequest(4)); |
4161 EXPECT_EQ(4, GetOrderOfRequest(1)); | 4162 EXPECT_EQ(4, GetOrderOfRequest(1)); |
4162 EXPECT_EQ(5, GetOrderOfRequest(2)); | 4163 EXPECT_EQ(5, GetOrderOfRequest(2)); |
4163 } | 4164 } |
4164 | 4165 |
4165 } // namespace | 4166 } // namespace |
4166 | 4167 |
4167 } // namespace net | 4168 } // namespace net |
OLD | NEW |