| 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 <stdint.h> | 7 #include <stdint.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 | 100 |
| 101 EXPECT_FALSE(load_timing_info.socket_reused); | 101 EXPECT_FALSE(load_timing_info.socket_reused); |
| 102 EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); | 102 EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); |
| 103 | 103 |
| 104 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); | 104 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); |
| 105 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); | 105 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); |
| 106 } | 106 } |
| 107 | 107 |
| 108 class TestSocketParams : public base::RefCounted<TestSocketParams> { | 108 class TestSocketParams : public base::RefCounted<TestSocketParams> { |
| 109 public: | 109 public: |
| 110 explicit TestSocketParams(bool ignore_limits) | 110 explicit TestSocketParams() {} |
| 111 : ignore_limits_(ignore_limits) {} | |
| 112 | |
| 113 bool ignore_limits() { return ignore_limits_; } | |
| 114 | 111 |
| 115 private: | 112 private: |
| 116 friend class base::RefCounted<TestSocketParams>; | 113 friend class base::RefCounted<TestSocketParams>; |
| 117 ~TestSocketParams() {} | 114 ~TestSocketParams() {} |
| 118 | |
| 119 const bool ignore_limits_; | |
| 120 }; | 115 }; |
| 121 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase; | 116 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase; |
| 122 | 117 |
| 123 class MockClientSocket : public StreamSocket { | 118 class MockClientSocket : public StreamSocket { |
| 124 public: | 119 public: |
| 125 explicit MockClientSocket(net::NetLog* net_log) | 120 explicit MockClientSocket(net::NetLog* net_log) |
| 126 : connected_(false), | 121 : connected_(false), |
| 127 has_unread_data_(false), | 122 has_unread_data_(false), |
| 128 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)), | 123 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)), |
| 129 was_used_to_convey_data_(false) {} | 124 was_used_to_convey_data_(false) {} |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 // to complete. | 266 // to complete. |
| 272 static const int kPendingConnectDelay = 2; | 267 static const int kPendingConnectDelay = 2; |
| 273 | 268 |
| 274 TestConnectJob(JobType job_type, | 269 TestConnectJob(JobType job_type, |
| 275 const std::string& group_name, | 270 const std::string& group_name, |
| 276 const TestClientSocketPoolBase::Request& request, | 271 const TestClientSocketPoolBase::Request& request, |
| 277 base::TimeDelta timeout_duration, | 272 base::TimeDelta timeout_duration, |
| 278 ConnectJob::Delegate* delegate, | 273 ConnectJob::Delegate* delegate, |
| 279 MockClientSocketFactory* client_socket_factory, | 274 MockClientSocketFactory* client_socket_factory, |
| 280 NetLog* net_log) | 275 NetLog* net_log) |
| 281 : ConnectJob(group_name, timeout_duration, request.priority(), delegate, | 276 : ConnectJob(group_name, |
| 277 timeout_duration, |
| 278 request.priority(), |
| 279 request.respect_limits(), |
| 280 delegate, |
| 282 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), | 281 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), |
| 283 job_type_(job_type), | 282 job_type_(job_type), |
| 284 client_socket_factory_(client_socket_factory), | 283 client_socket_factory_(client_socket_factory), |
| 285 load_state_(LOAD_STATE_IDLE), | 284 load_state_(LOAD_STATE_IDLE), |
| 286 store_additional_error_state_(false), | 285 store_additional_error_state_(false), |
| 287 weak_factory_(this) { | 286 weak_factory_(this) {} |
| 288 } | |
| 289 | 287 |
| 290 void Signal() { | 288 void Signal() { |
| 291 DoConnect(waiting_success_, true /* async */, false /* recoverable */); | 289 DoConnect(waiting_success_, true /* async */, false /* recoverable */); |
| 292 } | 290 } |
| 293 | 291 |
| 294 void set_load_state(LoadState load_state) { load_state_ = load_state; } | 292 void set_load_state(LoadState load_state) { load_state_ = load_state; } |
| 295 | 293 |
| 296 // From ConnectJob: | 294 // From ConnectJob: |
| 297 | 295 |
| 298 LoadState GetLoadState() const override { return load_state_; } | 296 LoadState GetLoadState() const override { return load_state_; } |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 max_sockets_per_group, | 496 max_sockets_per_group, |
| 499 unused_idle_socket_timeout, | 497 unused_idle_socket_timeout, |
| 500 used_idle_socket_timeout, | 498 used_idle_socket_timeout, |
| 501 connect_job_factory) {} | 499 connect_job_factory) {} |
| 502 | 500 |
| 503 ~TestClientSocketPool() override {} | 501 ~TestClientSocketPool() override {} |
| 504 | 502 |
| 505 int RequestSocket(const std::string& group_name, | 503 int RequestSocket(const std::string& group_name, |
| 506 const void* params, | 504 const void* params, |
| 507 RequestPriority priority, | 505 RequestPriority priority, |
| 506 RespectLimits respect_limits, |
| 508 ClientSocketHandle* handle, | 507 ClientSocketHandle* handle, |
| 509 const CompletionCallback& callback, | 508 const CompletionCallback& callback, |
| 510 const BoundNetLog& net_log) override { | 509 const BoundNetLog& net_log) override { |
| 511 const scoped_refptr<TestSocketParams>* casted_socket_params = | 510 const scoped_refptr<TestSocketParams>* casted_socket_params = |
| 512 static_cast<const scoped_refptr<TestSocketParams>*>(params); | 511 static_cast<const scoped_refptr<TestSocketParams>*>(params); |
| 513 return base_.RequestSocket(group_name, *casted_socket_params, priority, | 512 return base_.RequestSocket(group_name, *casted_socket_params, priority, |
| 514 handle, callback, net_log); | 513 respect_limits, handle, callback, net_log); |
| 515 } | 514 } |
| 516 | 515 |
| 517 void RequestSockets(const std::string& group_name, | 516 void RequestSockets(const std::string& group_name, |
| 518 const void* params, | 517 const void* params, |
| 519 int num_sockets, | 518 int num_sockets, |
| 520 const BoundNetLog& net_log) override { | 519 const BoundNetLog& net_log) override { |
| 521 const scoped_refptr<TestSocketParams>* casted_params = | 520 const scoped_refptr<TestSocketParams>* casted_params = |
| 522 static_cast<const scoped_refptr<TestSocketParams>*>(params); | 521 static_cast<const scoped_refptr<TestSocketParams>*>(params); |
| 523 | 522 |
| 524 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log); | 523 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log); |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 } | 655 } |
| 657 | 656 |
| 658 private: | 657 private: |
| 659 bool have_result_; | 658 bool have_result_; |
| 660 bool waiting_for_result_; | 659 bool waiting_for_result_; |
| 661 int result_; | 660 int result_; |
| 662 }; | 661 }; |
| 663 | 662 |
| 664 class ClientSocketPoolBaseTest : public testing::Test { | 663 class ClientSocketPoolBaseTest : public testing::Test { |
| 665 protected: | 664 protected: |
| 666 ClientSocketPoolBaseTest() | 665 ClientSocketPoolBaseTest() : params_(new TestSocketParams()) { |
| 667 : params_(new TestSocketParams(false /* ignore_limits */)) { | |
| 668 connect_backup_jobs_enabled_ = | 666 connect_backup_jobs_enabled_ = |
| 669 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled(); | 667 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled(); |
| 670 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true); | 668 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true); |
| 671 cleanup_timer_enabled_ = | 669 cleanup_timer_enabled_ = |
| 672 internal::ClientSocketPoolBaseHelper::cleanup_timer_enabled(); | 670 internal::ClientSocketPoolBaseHelper::cleanup_timer_enabled(); |
| 673 } | 671 } |
| 674 | 672 |
| 675 ~ClientSocketPoolBaseTest() override { | 673 ~ClientSocketPoolBaseTest() override { |
| 676 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( | 674 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled( |
| 677 connect_backup_jobs_enabled_); | 675 connect_backup_jobs_enabled_); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 694 DCHECK(!pool_.get()); | 692 DCHECK(!pool_.get()); |
| 695 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_, | 693 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_, |
| 696 &net_log_); | 694 &net_log_); |
| 697 pool_.reset(new TestClientSocketPool(max_sockets, | 695 pool_.reset(new TestClientSocketPool(max_sockets, |
| 698 max_sockets_per_group, | 696 max_sockets_per_group, |
| 699 unused_idle_socket_timeout, | 697 unused_idle_socket_timeout, |
| 700 used_idle_socket_timeout, | 698 used_idle_socket_timeout, |
| 701 connect_job_factory_)); | 699 connect_job_factory_)); |
| 702 } | 700 } |
| 703 | 701 |
| 704 int StartRequestWithParams( | 702 int StartRequestWithIgnoreLimits( |
| 705 const std::string& group_name, | 703 const std::string& group_name, |
| 706 RequestPriority priority, | 704 RequestPriority priority, |
| 707 const scoped_refptr<TestSocketParams>& params) { | 705 ClientSocketPool::RespectLimits respect_limits) { |
| 708 return test_base_.StartRequestUsingPool( | 706 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority, |
| 709 pool_.get(), group_name, priority, params); | 707 respect_limits, params_); |
| 710 } | 708 } |
| 711 | 709 |
| 712 int StartRequest(const std::string& group_name, RequestPriority priority) { | 710 int StartRequest(const std::string& group_name, RequestPriority priority) { |
| 713 return StartRequestWithParams(group_name, priority, params_); | 711 return StartRequestWithIgnoreLimits( |
| 712 group_name, priority, ClientSocketPool::RespectLimits::ENABLED); |
| 714 } | 713 } |
| 715 | 714 |
| 716 int GetOrderOfRequest(size_t index) const { | 715 int GetOrderOfRequest(size_t index) const { |
| 717 return test_base_.GetOrderOfRequest(index); | 716 return test_base_.GetOrderOfRequest(index); |
| 718 } | 717 } |
| 719 | 718 |
| 720 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) { | 719 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) { |
| 721 return test_base_.ReleaseOneConnection(keep_alive); | 720 return test_base_.ReleaseOneConnection(keep_alive); |
| 722 } | 721 } |
| 723 | 722 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 742 ClientSocketPoolTest test_base_; | 741 ClientSocketPoolTest test_base_; |
| 743 }; | 742 }; |
| 744 | 743 |
| 745 // Even though a timeout is specified, it doesn't time out on a synchronous | 744 // Even though a timeout is specified, it doesn't time out on a synchronous |
| 746 // completion. | 745 // completion. |
| 747 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { | 746 TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) { |
| 748 TestConnectJobDelegate delegate; | 747 TestConnectJobDelegate delegate; |
| 749 ClientSocketHandle ignored; | 748 ClientSocketHandle ignored; |
| 750 TestClientSocketPoolBase::Request request( | 749 TestClientSocketPoolBase::Request request( |
| 751 &ignored, CompletionCallback(), DEFAULT_PRIORITY, | 750 &ignored, CompletionCallback(), DEFAULT_PRIORITY, |
| 752 internal::ClientSocketPoolBaseHelper::NORMAL, | 751 ClientSocketPool::RespectLimits::ENABLED, |
| 753 false, params_, BoundNetLog()); | 752 internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog()); |
| 754 scoped_ptr<TestConnectJob> job( | 753 scoped_ptr<TestConnectJob> job( |
| 755 new TestConnectJob(TestConnectJob::kMockJob, | 754 new TestConnectJob(TestConnectJob::kMockJob, |
| 756 "a", | 755 "a", |
| 757 request, | 756 request, |
| 758 base::TimeDelta::FromMicroseconds(1), | 757 base::TimeDelta::FromMicroseconds(1), |
| 759 &delegate, | 758 &delegate, |
| 760 &client_socket_factory_, | 759 &client_socket_factory_, |
| 761 NULL)); | 760 NULL)); |
| 762 EXPECT_EQ(OK, job->Connect()); | 761 EXPECT_EQ(OK, job->Connect()); |
| 763 } | 762 } |
| 764 | 763 |
| 765 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { | 764 TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) { |
| 766 TestConnectJobDelegate delegate; | 765 TestConnectJobDelegate delegate; |
| 767 ClientSocketHandle ignored; | 766 ClientSocketHandle ignored; |
| 768 TestNetLog log; | 767 TestNetLog log; |
| 769 | 768 |
| 770 TestClientSocketPoolBase::Request request( | 769 TestClientSocketPoolBase::Request request( |
| 771 &ignored, CompletionCallback(), DEFAULT_PRIORITY, | 770 &ignored, CompletionCallback(), DEFAULT_PRIORITY, |
| 772 internal::ClientSocketPoolBaseHelper::NORMAL, | 771 ClientSocketPool::RespectLimits::ENABLED, |
| 773 false, params_, BoundNetLog()); | 772 internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog()); |
| 774 // Deleted by TestConnectJobDelegate. | 773 // Deleted by TestConnectJobDelegate. |
| 775 TestConnectJob* job = | 774 TestConnectJob* job = |
| 776 new TestConnectJob(TestConnectJob::kMockPendingJob, | 775 new TestConnectJob(TestConnectJob::kMockPendingJob, |
| 777 "a", | 776 "a", |
| 778 request, | 777 request, |
| 779 base::TimeDelta::FromMicroseconds(1), | 778 base::TimeDelta::FromMicroseconds(1), |
| 780 &delegate, | 779 &delegate, |
| 781 &client_socket_factory_, | 780 &client_socket_factory_, |
| 782 &log); | 781 &log); |
| 783 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); | 782 ASSERT_EQ(ERR_IO_PENDING, job->Connect()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 805 } | 804 } |
| 806 | 805 |
| 807 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { | 806 TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) { |
| 808 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 807 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 809 | 808 |
| 810 TestCompletionCallback callback; | 809 TestCompletionCallback callback; |
| 811 ClientSocketHandle handle; | 810 ClientSocketHandle handle; |
| 812 BoundTestNetLog log; | 811 BoundTestNetLog log; |
| 813 TestLoadTimingInfoNotConnected(handle); | 812 TestLoadTimingInfoNotConnected(handle); |
| 814 | 813 |
| 815 EXPECT_EQ(OK, | 814 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, |
| 816 handle.Init("a", | 815 ClientSocketPool::RespectLimits::ENABLED, |
| 817 params_, | 816 callback.callback(), pool_.get(), log.bound())); |
| 818 DEFAULT_PRIORITY, | |
| 819 callback.callback(), | |
| 820 pool_.get(), | |
| 821 log.bound())); | |
| 822 EXPECT_TRUE(handle.is_initialized()); | 817 EXPECT_TRUE(handle.is_initialized()); |
| 823 EXPECT_TRUE(handle.socket()); | 818 EXPECT_TRUE(handle.socket()); |
| 824 TestLoadTimingInfoConnectedNotReused(handle); | 819 TestLoadTimingInfoConnectedNotReused(handle); |
| 825 | 820 |
| 826 handle.Reset(); | 821 handle.Reset(); |
| 827 TestLoadTimingInfoNotConnected(handle); | 822 TestLoadTimingInfoNotConnected(handle); |
| 828 | 823 |
| 829 TestNetLogEntry::List entries; | 824 TestNetLogEntry::List entries; |
| 830 log.GetEntries(&entries); | 825 log.GetEntries(&entries); |
| 831 | 826 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 849 BoundTestNetLog log; | 844 BoundTestNetLog log; |
| 850 | 845 |
| 851 ClientSocketHandle handle; | 846 ClientSocketHandle handle; |
| 852 TestCompletionCallback callback; | 847 TestCompletionCallback callback; |
| 853 // Set the additional error state members to ensure that they get cleared. | 848 // Set the additional error state members to ensure that they get cleared. |
| 854 handle.set_is_ssl_error(true); | 849 handle.set_is_ssl_error(true); |
| 855 HttpResponseInfo info; | 850 HttpResponseInfo info; |
| 856 info.headers = new HttpResponseHeaders(std::string()); | 851 info.headers = new HttpResponseHeaders(std::string()); |
| 857 handle.set_ssl_error_response_info(info); | 852 handle.set_ssl_error_response_info(info); |
| 858 EXPECT_EQ(ERR_CONNECTION_FAILED, | 853 EXPECT_EQ(ERR_CONNECTION_FAILED, |
| 859 handle.Init("a", | 854 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 860 params_, | 855 ClientSocketPool::RespectLimits::ENABLED, |
| 861 DEFAULT_PRIORITY, | 856 callback.callback(), pool_.get(), log.bound())); |
| 862 callback.callback(), | |
| 863 pool_.get(), | |
| 864 log.bound())); | |
| 865 EXPECT_FALSE(handle.socket()); | 857 EXPECT_FALSE(handle.socket()); |
| 866 EXPECT_FALSE(handle.is_ssl_error()); | 858 EXPECT_FALSE(handle.is_ssl_error()); |
| 867 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); | 859 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); |
| 868 TestLoadTimingInfoNotConnected(handle); | 860 TestLoadTimingInfoNotConnected(handle); |
| 869 | 861 |
| 870 TestNetLogEntry::List entries; | 862 TestNetLogEntry::List entries; |
| 871 log.GetEntries(&entries); | 863 log.GetEntries(&entries); |
| 872 | 864 |
| 873 EXPECT_EQ(3u, entries.size()); | 865 EXPECT_EQ(3u, entries.size()); |
| 874 EXPECT_TRUE(LogContainsBeginEvent( | 866 EXPECT_TRUE(LogContainsBeginEvent( |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1089 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); | 1081 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count()); |
| 1090 } | 1082 } |
| 1091 | 1083 |
| 1092 TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) { | 1084 TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) { |
| 1093 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 1085 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
| 1094 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1086 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1095 | 1087 |
| 1096 ClientSocketHandle handle; | 1088 ClientSocketHandle handle; |
| 1097 TestCompletionCallback callback; | 1089 TestCompletionCallback callback; |
| 1098 EXPECT_EQ(ERR_IO_PENDING, | 1090 EXPECT_EQ(ERR_IO_PENDING, |
| 1099 handle.Init("a", | 1091 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1100 params_, | 1092 ClientSocketPool::RespectLimits::ENABLED, |
| 1101 DEFAULT_PRIORITY, | 1093 callback.callback(), pool_.get(), BoundNetLog())); |
| 1102 callback.callback(), | |
| 1103 pool_.get(), | |
| 1104 BoundNetLog())); | |
| 1105 | 1094 |
| 1106 ClientSocketHandle handles[4]; | 1095 ClientSocketHandle handles[4]; |
| 1107 for (size_t i = 0; i < arraysize(handles); ++i) { | 1096 for (size_t i = 0; i < arraysize(handles); ++i) { |
| 1108 TestCompletionCallback callback; | 1097 TestCompletionCallback callback; |
| 1109 EXPECT_EQ(ERR_IO_PENDING, | 1098 EXPECT_EQ(ERR_IO_PENDING, |
| 1110 handles[i].Init("b", | 1099 handles[i].Init("b", params_, DEFAULT_PRIORITY, |
| 1111 params_, | 1100 ClientSocketPool::RespectLimits::ENABLED, |
| 1112 DEFAULT_PRIORITY, | 1101 callback.callback(), pool_.get(), BoundNetLog())); |
| 1113 callback.callback(), | |
| 1114 pool_.get(), | |
| 1115 BoundNetLog())); | |
| 1116 } | 1102 } |
| 1117 | 1103 |
| 1118 // One will be stalled, cancel all the handles now. | 1104 // One will be stalled, cancel all the handles now. |
| 1119 // This should hit the OnAvailableSocketSlot() code where we previously had | 1105 // This should hit the OnAvailableSocketSlot() code where we previously had |
| 1120 // stalled groups, but no longer have any. | 1106 // stalled groups, but no longer have any. |
| 1121 for (size_t i = 0; i < arraysize(handles); ++i) | 1107 for (size_t i = 0; i < arraysize(handles); ++i) |
| 1122 handles[i].Reset(); | 1108 handles[i].Reset(); |
| 1123 } | 1109 } |
| 1124 | 1110 |
| 1125 TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) { | 1111 TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) { |
| 1126 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1112 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1127 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1113 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 1128 | 1114 |
| 1129 { | 1115 { |
| 1130 ClientSocketHandle handles[kDefaultMaxSockets]; | 1116 ClientSocketHandle handles[kDefaultMaxSockets]; |
| 1131 TestCompletionCallback callbacks[kDefaultMaxSockets]; | 1117 TestCompletionCallback callbacks[kDefaultMaxSockets]; |
| 1132 for (int i = 0; i < kDefaultMaxSockets; ++i) { | 1118 for (int i = 0; i < kDefaultMaxSockets; ++i) { |
| 1133 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), | 1119 EXPECT_EQ(OK, handles[i].Init( |
| 1134 params_, | 1120 base::IntToString(i), params_, DEFAULT_PRIORITY, |
| 1135 DEFAULT_PRIORITY, | 1121 ClientSocketPool::RespectLimits::ENABLED, |
| 1136 callbacks[i].callback(), | 1122 callbacks[i].callback(), pool_.get(), BoundNetLog())); |
| 1137 pool_.get(), | |
| 1138 BoundNetLog())); | |
| 1139 } | 1123 } |
| 1140 | 1124 |
| 1141 // Force a stalled group. | 1125 // Force a stalled group. |
| 1142 ClientSocketHandle stalled_handle; | 1126 ClientSocketHandle stalled_handle; |
| 1143 TestCompletionCallback callback; | 1127 TestCompletionCallback callback; |
| 1144 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", | 1128 EXPECT_EQ( |
| 1145 params_, | 1129 ERR_IO_PENDING, |
| 1146 DEFAULT_PRIORITY, | 1130 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, |
| 1147 callback.callback(), | 1131 ClientSocketPool::RespectLimits::ENABLED, |
| 1148 pool_.get(), | 1132 callback.callback(), pool_.get(), BoundNetLog())); |
| 1149 BoundNetLog())); | |
| 1150 | 1133 |
| 1151 // Cancel the stalled request. | 1134 // Cancel the stalled request. |
| 1152 stalled_handle.Reset(); | 1135 stalled_handle.Reset(); |
| 1153 | 1136 |
| 1154 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1137 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
| 1155 EXPECT_EQ(0, pool_->IdleSocketCount()); | 1138 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 1156 | 1139 |
| 1157 // Dropping out of scope will close all handles and return them to idle. | 1140 // Dropping out of scope will close all handles and return them to idle. |
| 1158 } | 1141 } |
| 1159 | 1142 |
| 1160 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1143 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
| 1161 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount()); | 1144 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount()); |
| 1162 } | 1145 } |
| 1163 | 1146 |
| 1164 TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) { | 1147 TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) { |
| 1165 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1148 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1166 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1149 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1167 | 1150 |
| 1168 { | 1151 { |
| 1169 ClientSocketHandle handles[kDefaultMaxSockets]; | 1152 ClientSocketHandle handles[kDefaultMaxSockets]; |
| 1170 for (int i = 0; i < kDefaultMaxSockets; ++i) { | 1153 for (int i = 0; i < kDefaultMaxSockets; ++i) { |
| 1171 TestCompletionCallback callback; | 1154 TestCompletionCallback callback; |
| 1172 EXPECT_EQ(ERR_IO_PENDING, handles[i].Init(base::IntToString(i), | 1155 EXPECT_EQ( |
| 1173 params_, | 1156 ERR_IO_PENDING, |
| 1174 DEFAULT_PRIORITY, | 1157 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY, |
| 1175 callback.callback(), | 1158 ClientSocketPool::RespectLimits::ENABLED, |
| 1176 pool_.get(), | 1159 callback.callback(), pool_.get(), BoundNetLog())); |
| 1177 BoundNetLog())); | |
| 1178 } | 1160 } |
| 1179 | 1161 |
| 1180 // Force a stalled group. | 1162 // Force a stalled group. |
| 1181 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1163 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1182 ClientSocketHandle stalled_handle; | 1164 ClientSocketHandle stalled_handle; |
| 1183 TestCompletionCallback callback; | 1165 TestCompletionCallback callback; |
| 1184 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", | 1166 EXPECT_EQ( |
| 1185 params_, | 1167 ERR_IO_PENDING, |
| 1186 DEFAULT_PRIORITY, | 1168 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, |
| 1187 callback.callback(), | 1169 ClientSocketPool::RespectLimits::ENABLED, |
| 1188 pool_.get(), | 1170 callback.callback(), pool_.get(), BoundNetLog())); |
| 1189 BoundNetLog())); | |
| 1190 | 1171 |
| 1191 // Since it is stalled, it should have no connect jobs. | 1172 // Since it is stalled, it should have no connect jobs. |
| 1192 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); | 1173 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); |
| 1193 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); | 1174 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo")); |
| 1194 | 1175 |
| 1195 // Cancel the stalled request. | 1176 // Cancel the stalled request. |
| 1196 handles[0].Reset(); | 1177 handles[0].Reset(); |
| 1197 | 1178 |
| 1198 // Now we should have a connect job. | 1179 // Now we should have a connect job. |
| 1199 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo")); | 1180 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo")); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1218 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1199 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1219 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1200 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 1220 | 1201 |
| 1221 ClientSocketHandle stalled_handle; | 1202 ClientSocketHandle stalled_handle; |
| 1222 TestCompletionCallback callback; | 1203 TestCompletionCallback callback; |
| 1223 { | 1204 { |
| 1224 EXPECT_FALSE(pool_->IsStalled()); | 1205 EXPECT_FALSE(pool_->IsStalled()); |
| 1225 ClientSocketHandle handles[kDefaultMaxSockets]; | 1206 ClientSocketHandle handles[kDefaultMaxSockets]; |
| 1226 for (int i = 0; i < kDefaultMaxSockets; ++i) { | 1207 for (int i = 0; i < kDefaultMaxSockets; ++i) { |
| 1227 TestCompletionCallback callback; | 1208 TestCompletionCallback callback; |
| 1228 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf( | 1209 EXPECT_EQ( |
| 1229 "Take 2: %d", i), | 1210 OK, handles[i].Init(base::StringPrintf("Take 2: %d", i), params_, |
| 1230 params_, | 1211 DEFAULT_PRIORITY, |
| 1231 DEFAULT_PRIORITY, | 1212 ClientSocketPool::RespectLimits::ENABLED, |
| 1232 callback.callback(), | 1213 callback.callback(), pool_.get(), BoundNetLog())); |
| 1233 pool_.get(), | |
| 1234 BoundNetLog())); | |
| 1235 } | 1214 } |
| 1236 | 1215 |
| 1237 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1216 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
| 1238 EXPECT_EQ(0, pool_->IdleSocketCount()); | 1217 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 1239 EXPECT_FALSE(pool_->IsStalled()); | 1218 EXPECT_FALSE(pool_->IsStalled()); |
| 1240 | 1219 |
| 1241 // Now we will hit the socket limit. | 1220 // Now we will hit the socket limit. |
| 1242 EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", | 1221 EXPECT_EQ( |
| 1243 params_, | 1222 ERR_IO_PENDING, |
| 1244 DEFAULT_PRIORITY, | 1223 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, |
| 1245 callback.callback(), | 1224 ClientSocketPool::RespectLimits::ENABLED, |
| 1246 pool_.get(), | 1225 callback.callback(), pool_.get(), BoundNetLog())); |
| 1247 BoundNetLog())); | |
| 1248 EXPECT_TRUE(pool_->IsStalled()); | 1226 EXPECT_TRUE(pool_->IsStalled()); |
| 1249 | 1227 |
| 1250 // Dropping out of scope will close all handles and return them to idle. | 1228 // Dropping out of scope will close all handles and return them to idle. |
| 1251 } | 1229 } |
| 1252 | 1230 |
| 1253 // But if we wait for it, the released idle sockets will be closed in | 1231 // But if we wait for it, the released idle sockets will be closed in |
| 1254 // preference of the waiting request. | 1232 // preference of the waiting request. |
| 1255 EXPECT_EQ(OK, callback.WaitForResult()); | 1233 EXPECT_EQ(OK, callback.WaitForResult()); |
| 1256 | 1234 |
| 1257 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); | 1235 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count()); |
| 1258 EXPECT_EQ(3, pool_->IdleSocketCount()); | 1236 EXPECT_EQ(3, pool_->IdleSocketCount()); |
| 1259 } | 1237 } |
| 1260 | 1238 |
| 1261 // Regression test for http://crbug.com/40952. | 1239 // Regression test for http://crbug.com/40952. |
| 1262 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) { | 1240 TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) { |
| 1263 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1241 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1264 pool_->EnableConnectBackupJobs(); | 1242 pool_->EnableConnectBackupJobs(); |
| 1265 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1243 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 1266 | 1244 |
| 1267 for (int i = 0; i < kDefaultMaxSockets; ++i) { | 1245 for (int i = 0; i < kDefaultMaxSockets; ++i) { |
| 1268 ClientSocketHandle handle; | 1246 ClientSocketHandle handle; |
| 1269 TestCompletionCallback callback; | 1247 TestCompletionCallback callback; |
| 1270 EXPECT_EQ(OK, handle.Init(base::IntToString(i), | 1248 EXPECT_EQ(OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY, |
| 1271 params_, | 1249 ClientSocketPool::RespectLimits::ENABLED, |
| 1272 DEFAULT_PRIORITY, | 1250 callback.callback(), pool_.get(), BoundNetLog())); |
| 1273 callback.callback(), | |
| 1274 pool_.get(), | |
| 1275 BoundNetLog())); | |
| 1276 } | 1251 } |
| 1277 | 1252 |
| 1278 // Flush all the DoReleaseSocket tasks. | 1253 // Flush all the DoReleaseSocket tasks. |
| 1279 base::MessageLoop::current()->RunUntilIdle(); | 1254 base::MessageLoop::current()->RunUntilIdle(); |
| 1280 | 1255 |
| 1281 // Stall a group. Set a pending job so it'll trigger a backup job if we don't | 1256 // Stall a group. Set a pending job so it'll trigger a backup job if we don't |
| 1282 // reuse a socket. | 1257 // reuse a socket. |
| 1283 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1258 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1284 ClientSocketHandle handle; | 1259 ClientSocketHandle handle; |
| 1285 TestCompletionCallback callback; | 1260 TestCompletionCallback callback; |
| 1286 | 1261 |
| 1287 // "0" is special here, since it should be the first entry in the sorted map, | 1262 // "0" is special here, since it should be the first entry in the sorted map, |
| 1288 // which is the one which we would close an idle socket for. We shouldn't | 1263 // which is the one which we would close an idle socket for. We shouldn't |
| 1289 // close an idle socket though, since we should reuse the idle socket. | 1264 // close an idle socket though, since we should reuse the idle socket. |
| 1290 EXPECT_EQ(OK, handle.Init("0", | 1265 EXPECT_EQ(OK, handle.Init("0", params_, DEFAULT_PRIORITY, |
| 1291 params_, | 1266 ClientSocketPool::RespectLimits::ENABLED, |
| 1292 DEFAULT_PRIORITY, | 1267 callback.callback(), pool_.get(), BoundNetLog())); |
| 1293 callback.callback(), | |
| 1294 pool_.get(), | |
| 1295 BoundNetLog())); | |
| 1296 | 1268 |
| 1297 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 1269 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
| 1298 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); | 1270 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); |
| 1299 } | 1271 } |
| 1300 | 1272 |
| 1301 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { | 1273 TEST_F(ClientSocketPoolBaseTest, PendingRequests) { |
| 1302 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1274 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1303 | 1275 |
| 1304 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1276 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); |
| 1305 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 1277 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1354 | 1326 |
| 1355 // This test will start up a RequestSocket() and then immediately Cancel() it. | 1327 // This test will start up a RequestSocket() and then immediately Cancel() it. |
| 1356 // The pending connect job will be cancelled and should not call back into | 1328 // The pending connect job will be cancelled and should not call back into |
| 1357 // ClientSocketPoolBase. | 1329 // ClientSocketPoolBase. |
| 1358 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { | 1330 TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) { |
| 1359 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1331 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1360 | 1332 |
| 1361 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1333 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1362 ClientSocketHandle handle; | 1334 ClientSocketHandle handle; |
| 1363 TestCompletionCallback callback; | 1335 TestCompletionCallback callback; |
| 1364 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 1336 EXPECT_EQ(ERR_IO_PENDING, |
| 1365 params_, | 1337 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1366 DEFAULT_PRIORITY, | 1338 ClientSocketPool::RespectLimits::ENABLED, |
| 1367 callback.callback(), | 1339 callback.callback(), pool_.get(), BoundNetLog())); |
| 1368 pool_.get(), | |
| 1369 BoundNetLog())); | |
| 1370 handle.Reset(); | 1340 handle.Reset(); |
| 1371 } | 1341 } |
| 1372 | 1342 |
| 1373 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { | 1343 TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) { |
| 1374 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1344 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1375 | 1345 |
| 1376 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1346 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1377 ClientSocketHandle handle; | 1347 ClientSocketHandle handle; |
| 1378 TestCompletionCallback callback; | 1348 TestCompletionCallback callback; |
| 1379 | 1349 |
| 1380 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 1350 EXPECT_EQ(ERR_IO_PENDING, |
| 1381 params_, | 1351 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1382 DEFAULT_PRIORITY, | 1352 ClientSocketPool::RespectLimits::ENABLED, |
| 1383 callback.callback(), | 1353 callback.callback(), pool_.get(), BoundNetLog())); |
| 1384 pool_.get(), | |
| 1385 BoundNetLog())); | |
| 1386 | 1354 |
| 1387 handle.Reset(); | 1355 handle.Reset(); |
| 1388 | 1356 |
| 1389 TestCompletionCallback callback2; | 1357 TestCompletionCallback callback2; |
| 1390 EXPECT_EQ(ERR_IO_PENDING, | 1358 EXPECT_EQ(ERR_IO_PENDING, |
| 1391 handle.Init("a", | 1359 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1392 params_, | 1360 ClientSocketPool::RespectLimits::ENABLED, |
| 1393 DEFAULT_PRIORITY, | 1361 callback2.callback(), pool_.get(), BoundNetLog())); |
| 1394 callback2.callback(), | |
| 1395 pool_.get(), | |
| 1396 BoundNetLog())); | |
| 1397 | 1362 |
| 1398 EXPECT_EQ(OK, callback2.WaitForResult()); | 1363 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 1399 EXPECT_FALSE(callback.have_result()); | 1364 EXPECT_FALSE(callback.have_result()); |
| 1400 | 1365 |
| 1401 handle.Reset(); | 1366 handle.Reset(); |
| 1402 } | 1367 } |
| 1403 | 1368 |
| 1404 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { | 1369 TEST_F(ClientSocketPoolBaseTest, CancelRequest) { |
| 1405 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1370 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1406 | 1371 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1450 int first_request_result) { | 1415 int first_request_result) { |
| 1451 EXPECT_EQ(OK, first_request_result); | 1416 EXPECT_EQ(OK, first_request_result); |
| 1452 | 1417 |
| 1453 test_connect_job_factory->set_job_type(next_job_type); | 1418 test_connect_job_factory->set_job_type(next_job_type); |
| 1454 | 1419 |
| 1455 // Don't allow reuse of the socket. Disconnect it and then release it. | 1420 // Don't allow reuse of the socket. Disconnect it and then release it. |
| 1456 if (handle->socket()) | 1421 if (handle->socket()) |
| 1457 handle->socket()->Disconnect(); | 1422 handle->socket()->Disconnect(); |
| 1458 handle->Reset(); | 1423 handle->Reset(); |
| 1459 | 1424 |
| 1460 scoped_refptr<TestSocketParams> params( | 1425 scoped_refptr<TestSocketParams> params(new TestSocketParams()); |
| 1461 new TestSocketParams(false /* ignore_limits */)); | |
| 1462 TestCompletionCallback callback; | 1426 TestCompletionCallback callback; |
| 1463 int rv = | 1427 int rv = handle->Init("a", params, LOWEST, |
| 1464 handle->Init("a", params, LOWEST, nested_callback, pool, BoundNetLog()); | 1428 ClientSocketPool::RespectLimits::ENABLED, |
| 1429 nested_callback, pool, BoundNetLog()); |
| 1465 if (rv != ERR_IO_PENDING) { | 1430 if (rv != ERR_IO_PENDING) { |
| 1466 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type); | 1431 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type); |
| 1467 nested_callback.Run(rv); | 1432 nested_callback.Run(rv); |
| 1468 } else { | 1433 } else { |
| 1469 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type); | 1434 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type); |
| 1470 } | 1435 } |
| 1471 } | 1436 } |
| 1472 | 1437 |
| 1473 // Tests the case where a second socket is requested in a completion callback, | 1438 // Tests the case where a second socket is requested in a completion callback, |
| 1474 // and the second socket connects asynchronously. Reuses the same | 1439 // and the second socket connects asynchronously. Reuses the same |
| 1475 // ClientSocketHandle for the second socket, after disconnecting the first. | 1440 // ClientSocketHandle for the second socket, after disconnecting the first. |
| 1476 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { | 1441 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) { |
| 1477 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1442 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1478 | 1443 |
| 1479 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1444 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1480 ClientSocketHandle handle; | 1445 ClientSocketHandle handle; |
| 1481 TestCompletionCallback second_result_callback; | 1446 TestCompletionCallback second_result_callback; |
| 1482 int rv = handle.Init( | 1447 int rv = handle.Init( |
| 1483 "a", params_, DEFAULT_PRIORITY, | 1448 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED, |
| 1484 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(), | 1449 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(), |
| 1485 connect_job_factory_, TestConnectJob::kMockPendingJob, | 1450 connect_job_factory_, TestConnectJob::kMockPendingJob, |
| 1486 second_result_callback.callback()), | 1451 second_result_callback.callback()), |
| 1487 pool_.get(), BoundNetLog()); | 1452 pool_.get(), BoundNetLog()); |
| 1488 ASSERT_EQ(ERR_IO_PENDING, rv); | 1453 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 1489 | 1454 |
| 1490 EXPECT_EQ(OK, second_result_callback.WaitForResult()); | 1455 EXPECT_EQ(OK, second_result_callback.WaitForResult()); |
| 1491 } | 1456 } |
| 1492 | 1457 |
| 1493 // Tests the case where a second socket is requested in a completion callback, | 1458 // Tests the case where a second socket is requested in a completion callback, |
| 1494 // and the second socket connects synchronously. Reuses the same | 1459 // and the second socket connects synchronously. Reuses the same |
| 1495 // ClientSocketHandle for the second socket, after disconnecting the first. | 1460 // ClientSocketHandle for the second socket, after disconnecting the first. |
| 1496 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { | 1461 TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) { |
| 1497 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1462 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1498 | 1463 |
| 1499 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1464 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1500 ClientSocketHandle handle; | 1465 ClientSocketHandle handle; |
| 1501 TestCompletionCallback second_result_callback; | 1466 TestCompletionCallback second_result_callback; |
| 1502 int rv = handle.Init( | 1467 int rv = handle.Init( |
| 1503 "a", params_, DEFAULT_PRIORITY, | 1468 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED, |
| 1504 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(), | 1469 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(), |
| 1505 connect_job_factory_, TestConnectJob::kMockPendingJob, | 1470 connect_job_factory_, TestConnectJob::kMockPendingJob, |
| 1506 second_result_callback.callback()), | 1471 second_result_callback.callback()), |
| 1507 pool_.get(), BoundNetLog()); | 1472 pool_.get(), BoundNetLog()); |
| 1508 ASSERT_EQ(ERR_IO_PENDING, rv); | 1473 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 1509 | 1474 |
| 1510 EXPECT_EQ(OK, second_result_callback.WaitForResult()); | 1475 EXPECT_EQ(OK, second_result_callback.WaitForResult()); |
| 1511 } | 1476 } |
| 1512 | 1477 |
| 1513 // Make sure that pending requests get serviced after active requests get | 1478 // Make sure that pending requests get serviced after active requests get |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1560 EXPECT_EQ(ERR_CONNECTION_FAILED, request(i)->WaitForResult()); | 1525 EXPECT_EQ(ERR_CONNECTION_FAILED, request(i)->WaitForResult()); |
| 1561 } | 1526 } |
| 1562 | 1527 |
| 1563 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { | 1528 TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) { |
| 1564 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1529 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1565 | 1530 |
| 1566 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1531 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1567 | 1532 |
| 1568 ClientSocketHandle handle; | 1533 ClientSocketHandle handle; |
| 1569 TestCompletionCallback callback; | 1534 TestCompletionCallback callback; |
| 1570 int rv = handle.Init("a", | 1535 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1571 params_, | 1536 ClientSocketPool::RespectLimits::ENABLED, |
| 1572 DEFAULT_PRIORITY, | 1537 callback.callback(), pool_.get(), BoundNetLog()); |
| 1573 callback.callback(), | |
| 1574 pool_.get(), | |
| 1575 BoundNetLog()); | |
| 1576 EXPECT_EQ(ERR_IO_PENDING, rv); | 1538 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1577 | 1539 |
| 1578 // Cancel the active request. | 1540 // Cancel the active request. |
| 1579 handle.Reset(); | 1541 handle.Reset(); |
| 1580 | 1542 |
| 1581 rv = handle.Init("a", | 1543 rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1582 params_, | 1544 ClientSocketPool::RespectLimits::ENABLED, |
| 1583 DEFAULT_PRIORITY, | 1545 callback.callback(), pool_.get(), BoundNetLog()); |
| 1584 callback.callback(), | |
| 1585 pool_.get(), | |
| 1586 BoundNetLog()); | |
| 1587 EXPECT_EQ(ERR_IO_PENDING, rv); | 1546 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1588 EXPECT_EQ(OK, callback.WaitForResult()); | 1547 EXPECT_EQ(OK, callback.WaitForResult()); |
| 1589 | 1548 |
| 1590 EXPECT_FALSE(handle.is_reused()); | 1549 EXPECT_FALSE(handle.is_reused()); |
| 1591 TestLoadTimingInfoConnectedNotReused(handle); | 1550 TestLoadTimingInfoConnectedNotReused(handle); |
| 1592 EXPECT_EQ(2, client_socket_factory_.allocation_count()); | 1551 EXPECT_EQ(2, client_socket_factory_.allocation_count()); |
| 1593 } | 1552 } |
| 1594 | 1553 |
| 1595 // Regression test for http://crbug.com/17985. | 1554 // Regression test for http://crbug.com/17985. |
| 1596 TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) { | 1555 TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1629 base::MessageLoop::current()->RunUntilIdle(); | 1588 base::MessageLoop::current()->RunUntilIdle(); |
| 1630 } | 1589 } |
| 1631 | 1590 |
| 1632 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { | 1591 TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) { |
| 1633 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1592 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1634 | 1593 |
| 1635 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1594 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1636 ClientSocketHandle handle; | 1595 ClientSocketHandle handle; |
| 1637 TestCompletionCallback callback; | 1596 TestCompletionCallback callback; |
| 1638 BoundTestNetLog log; | 1597 BoundTestNetLog log; |
| 1639 int rv = handle.Init("a", | 1598 int rv = handle.Init("a", params_, LOWEST, |
| 1640 params_, | 1599 ClientSocketPool::RespectLimits::ENABLED, |
| 1641 LOWEST, | 1600 callback.callback(), pool_.get(), log.bound()); |
| 1642 callback.callback(), | |
| 1643 pool_.get(), | |
| 1644 log.bound()); | |
| 1645 EXPECT_EQ(ERR_IO_PENDING, rv); | 1601 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1646 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 1602 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 1647 TestLoadTimingInfoNotConnected(handle); | 1603 TestLoadTimingInfoNotConnected(handle); |
| 1648 | 1604 |
| 1649 EXPECT_EQ(OK, callback.WaitForResult()); | 1605 EXPECT_EQ(OK, callback.WaitForResult()); |
| 1650 EXPECT_TRUE(handle.is_initialized()); | 1606 EXPECT_TRUE(handle.is_initialized()); |
| 1651 EXPECT_TRUE(handle.socket()); | 1607 EXPECT_TRUE(handle.socket()); |
| 1652 TestLoadTimingInfoConnectedNotReused(handle); | 1608 TestLoadTimingInfoConnectedNotReused(handle); |
| 1653 | 1609 |
| 1654 handle.Reset(); | 1610 handle.Reset(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1676 | 1632 |
| 1677 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1633 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 1678 ClientSocketHandle handle; | 1634 ClientSocketHandle handle; |
| 1679 TestCompletionCallback callback; | 1635 TestCompletionCallback callback; |
| 1680 BoundTestNetLog log; | 1636 BoundTestNetLog log; |
| 1681 // Set the additional error state members to ensure that they get cleared. | 1637 // Set the additional error state members to ensure that they get cleared. |
| 1682 handle.set_is_ssl_error(true); | 1638 handle.set_is_ssl_error(true); |
| 1683 HttpResponseInfo info; | 1639 HttpResponseInfo info; |
| 1684 info.headers = new HttpResponseHeaders(std::string()); | 1640 info.headers = new HttpResponseHeaders(std::string()); |
| 1685 handle.set_ssl_error_response_info(info); | 1641 handle.set_ssl_error_response_info(info); |
| 1686 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 1642 EXPECT_EQ(ERR_IO_PENDING, |
| 1687 params_, | 1643 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1688 DEFAULT_PRIORITY, | 1644 ClientSocketPool::RespectLimits::ENABLED, |
| 1689 callback.callback(), | 1645 callback.callback(), pool_.get(), log.bound())); |
| 1690 pool_.get(), | |
| 1691 log.bound())); | |
| 1692 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 1646 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 1693 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | 1647 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); |
| 1694 EXPECT_FALSE(handle.is_ssl_error()); | 1648 EXPECT_FALSE(handle.is_ssl_error()); |
| 1695 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); | 1649 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); |
| 1696 | 1650 |
| 1697 TestNetLogEntry::List entries; | 1651 TestNetLogEntry::List entries; |
| 1698 log.GetEntries(&entries); | 1652 log.GetEntries(&entries); |
| 1699 | 1653 |
| 1700 EXPECT_EQ(3u, entries.size()); | 1654 EXPECT_EQ(3u, entries.size()); |
| 1701 EXPECT_TRUE(LogContainsBeginEvent( | 1655 EXPECT_TRUE(LogContainsBeginEvent( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1728 // ordering is difficult, and some may fire during destructor. | 1682 // ordering is difficult, and some may fire during destructor. |
| 1729 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1683 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1730 | 1684 |
| 1731 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1685 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1732 ClientSocketHandle handle; | 1686 ClientSocketHandle handle; |
| 1733 TestCompletionCallback callback; | 1687 TestCompletionCallback callback; |
| 1734 ClientSocketHandle handle2; | 1688 ClientSocketHandle handle2; |
| 1735 TestCompletionCallback callback2; | 1689 TestCompletionCallback callback2; |
| 1736 | 1690 |
| 1737 EXPECT_EQ(ERR_IO_PENDING, | 1691 EXPECT_EQ(ERR_IO_PENDING, |
| 1738 handle.Init("a", | 1692 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1739 params_, | 1693 ClientSocketPool::RespectLimits::ENABLED, |
| 1740 DEFAULT_PRIORITY, | 1694 callback.callback(), pool_.get(), BoundNetLog())); |
| 1741 callback.callback(), | |
| 1742 pool_.get(), | |
| 1743 BoundNetLog())); | |
| 1744 BoundTestNetLog log2; | 1695 BoundTestNetLog log2; |
| 1745 EXPECT_EQ(ERR_IO_PENDING, | 1696 EXPECT_EQ(ERR_IO_PENDING, |
| 1746 handle2.Init("a", | 1697 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 1747 params_, | 1698 ClientSocketPool::RespectLimits::ENABLED, |
| 1748 DEFAULT_PRIORITY, | 1699 callback2.callback(), pool_.get(), BoundNetLog())); |
| 1749 callback2.callback(), | |
| 1750 pool_.get(), | |
| 1751 BoundNetLog())); | |
| 1752 | 1700 |
| 1753 handle.Reset(); | 1701 handle.Reset(); |
| 1754 | 1702 |
| 1755 | 1703 |
| 1756 // At this point, request 2 is just waiting for the connect job to finish. | 1704 // At this point, request 2 is just waiting for the connect job to finish. |
| 1757 | 1705 |
| 1758 EXPECT_EQ(OK, callback2.WaitForResult()); | 1706 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 1759 handle2.Reset(); | 1707 handle2.Reset(); |
| 1760 | 1708 |
| 1761 // Now request 2 has actually finished. | 1709 // Now request 2 has actually finished. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1788 // by whatever comes first. | 1736 // by whatever comes first. |
| 1789 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) { | 1737 TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) { |
| 1790 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1738 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1791 | 1739 |
| 1792 // Start job 1 (async OK) | 1740 // Start job 1 (async OK) |
| 1793 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 1741 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 1794 | 1742 |
| 1795 std::vector<TestSocketRequest*> request_order; | 1743 std::vector<TestSocketRequest*> request_order; |
| 1796 size_t completion_count; // unused | 1744 size_t completion_count; // unused |
| 1797 TestSocketRequest req1(&request_order, &completion_count); | 1745 TestSocketRequest req1(&request_order, &completion_count); |
| 1798 int rv = req1.handle()->Init("a", | 1746 int rv = req1.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1799 params_, | 1747 ClientSocketPool::RespectLimits::ENABLED, |
| 1800 DEFAULT_PRIORITY, | 1748 req1.callback(), pool_.get(), BoundNetLog()); |
| 1801 req1.callback(), pool_.get(), | |
| 1802 BoundNetLog()); | |
| 1803 EXPECT_EQ(ERR_IO_PENDING, rv); | 1749 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1804 EXPECT_EQ(OK, req1.WaitForResult()); | 1750 EXPECT_EQ(OK, req1.WaitForResult()); |
| 1805 | 1751 |
| 1806 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending | 1752 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending |
| 1807 // without a job. | 1753 // without a job. |
| 1808 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1754 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1809 | 1755 |
| 1810 TestSocketRequest req2(&request_order, &completion_count); | 1756 TestSocketRequest req2(&request_order, &completion_count); |
| 1811 rv = req2.handle()->Init("a", | 1757 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1812 params_, | 1758 ClientSocketPool::RespectLimits::ENABLED, |
| 1813 DEFAULT_PRIORITY, | 1759 req2.callback(), pool_.get(), BoundNetLog()); |
| 1814 req2.callback(), | |
| 1815 pool_.get(), | |
| 1816 BoundNetLog()); | |
| 1817 EXPECT_EQ(ERR_IO_PENDING, rv); | 1760 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1818 TestSocketRequest req3(&request_order, &completion_count); | 1761 TestSocketRequest req3(&request_order, &completion_count); |
| 1819 rv = req3.handle()->Init("a", | 1762 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1820 params_, | 1763 ClientSocketPool::RespectLimits::ENABLED, |
| 1821 DEFAULT_PRIORITY, | 1764 req3.callback(), pool_.get(), BoundNetLog()); |
| 1822 req3.callback(), | |
| 1823 pool_.get(), | |
| 1824 BoundNetLog()); | |
| 1825 EXPECT_EQ(ERR_IO_PENDING, rv); | 1765 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1826 | 1766 |
| 1827 // Both Requests 2 and 3 are pending. We release socket 1 which should | 1767 // Both Requests 2 and 3 are pending. We release socket 1 which should |
| 1828 // service request 2. Request 3 should still be waiting. | 1768 // service request 2. Request 3 should still be waiting. |
| 1829 req1.handle()->Reset(); | 1769 req1.handle()->Reset(); |
| 1830 // Run the released socket wakeups. | 1770 // Run the released socket wakeups. |
| 1831 base::MessageLoop::current()->RunUntilIdle(); | 1771 base::MessageLoop::current()->RunUntilIdle(); |
| 1832 ASSERT_TRUE(req2.handle()->socket()); | 1772 ASSERT_TRUE(req2.handle()->socket()); |
| 1833 EXPECT_EQ(OK, req2.WaitForResult()); | 1773 EXPECT_EQ(OK, req2.WaitForResult()); |
| 1834 EXPECT_FALSE(req3.handle()->socket()); | 1774 EXPECT_FALSE(req3.handle()->socket()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1848 // The requests are not coupled to the jobs. So, the requests should finish in | 1788 // The requests are not coupled to the jobs. So, the requests should finish in |
| 1849 // their priority / insertion order. | 1789 // their priority / insertion order. |
| 1850 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { | 1790 TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) { |
| 1851 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1791 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1852 // First two jobs are async. | 1792 // First two jobs are async. |
| 1853 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 1793 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 1854 | 1794 |
| 1855 std::vector<TestSocketRequest*> request_order; | 1795 std::vector<TestSocketRequest*> request_order; |
| 1856 size_t completion_count; // unused | 1796 size_t completion_count; // unused |
| 1857 TestSocketRequest req1(&request_order, &completion_count); | 1797 TestSocketRequest req1(&request_order, &completion_count); |
| 1858 int rv = req1.handle()->Init("a", | 1798 int rv = req1.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1859 params_, | 1799 ClientSocketPool::RespectLimits::ENABLED, |
| 1860 DEFAULT_PRIORITY, | 1800 req1.callback(), pool_.get(), BoundNetLog()); |
| 1861 req1.callback(), | |
| 1862 pool_.get(), | |
| 1863 BoundNetLog()); | |
| 1864 EXPECT_EQ(ERR_IO_PENDING, rv); | 1801 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1865 | 1802 |
| 1866 TestSocketRequest req2(&request_order, &completion_count); | 1803 TestSocketRequest req2(&request_order, &completion_count); |
| 1867 rv = req2.handle()->Init("a", | 1804 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1868 params_, | 1805 ClientSocketPool::RespectLimits::ENABLED, |
| 1869 DEFAULT_PRIORITY, | 1806 req2.callback(), pool_.get(), BoundNetLog()); |
| 1870 req2.callback(), | |
| 1871 pool_.get(), | |
| 1872 BoundNetLog()); | |
| 1873 EXPECT_EQ(ERR_IO_PENDING, rv); | 1807 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1874 | 1808 |
| 1875 // The pending job is sync. | 1809 // The pending job is sync. |
| 1876 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 1810 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 1877 | 1811 |
| 1878 TestSocketRequest req3(&request_order, &completion_count); | 1812 TestSocketRequest req3(&request_order, &completion_count); |
| 1879 rv = req3.handle()->Init("a", | 1813 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 1880 params_, | 1814 ClientSocketPool::RespectLimits::ENABLED, |
| 1881 DEFAULT_PRIORITY, | 1815 req3.callback(), pool_.get(), BoundNetLog()); |
| 1882 req3.callback(), | |
| 1883 pool_.get(), | |
| 1884 BoundNetLog()); | |
| 1885 EXPECT_EQ(ERR_IO_PENDING, rv); | 1816 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1886 | 1817 |
| 1887 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); | 1818 EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); |
| 1888 EXPECT_EQ(OK, req2.WaitForResult()); | 1819 EXPECT_EQ(OK, req2.WaitForResult()); |
| 1889 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); | 1820 EXPECT_EQ(ERR_CONNECTION_FAILED, req3.WaitForResult()); |
| 1890 | 1821 |
| 1891 ASSERT_EQ(3U, request_order.size()); | 1822 ASSERT_EQ(3U, request_order.size()); |
| 1892 EXPECT_EQ(&req1, request_order[0]); | 1823 EXPECT_EQ(&req1, request_order[0]); |
| 1893 EXPECT_EQ(&req2, request_order[1]); | 1824 EXPECT_EQ(&req2, request_order[1]); |
| 1894 EXPECT_EQ(&req3, request_order[2]); | 1825 EXPECT_EQ(&req3, request_order[2]); |
| 1895 } | 1826 } |
| 1896 | 1827 |
| 1897 // Test GetLoadState in the case there's only one socket request. | 1828 // Test GetLoadState in the case there's only one socket request. |
| 1898 TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) { | 1829 TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) { |
| 1899 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 1830 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 1900 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1831 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1901 | 1832 |
| 1902 ClientSocketHandle handle; | 1833 ClientSocketHandle handle; |
| 1903 TestCompletionCallback callback; | 1834 TestCompletionCallback callback; |
| 1904 int rv = handle.Init("a", | 1835 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1905 params_, | 1836 ClientSocketPool::RespectLimits::ENABLED, |
| 1906 DEFAULT_PRIORITY, | 1837 callback.callback(), pool_.get(), BoundNetLog()); |
| 1907 callback.callback(), | |
| 1908 pool_.get(), | |
| 1909 BoundNetLog()); | |
| 1910 EXPECT_EQ(ERR_IO_PENDING, rv); | 1838 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1911 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1839 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1912 | 1840 |
| 1913 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); | 1841 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); |
| 1914 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); | 1842 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); |
| 1915 | 1843 |
| 1916 // No point in completing the connection, since ClientSocketHandles only | 1844 // No point in completing the connection, since ClientSocketHandles only |
| 1917 // expect the LoadState to be checked while connecting. | 1845 // expect the LoadState to be checked while connecting. |
| 1918 } | 1846 } |
| 1919 | 1847 |
| 1920 // Test GetLoadState in the case there are two socket requests. | 1848 // Test GetLoadState in the case there are two socket requests. |
| 1921 // Only the first connection in the pool should affect the pool's load status. | 1849 // Only the first connection in the pool should affect the pool's load status. |
| 1922 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) { | 1850 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) { |
| 1923 CreatePool(2, 2); | 1851 CreatePool(2, 2); |
| 1924 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1852 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1925 | 1853 |
| 1926 ClientSocketHandle handle; | 1854 ClientSocketHandle handle; |
| 1927 TestCompletionCallback callback; | 1855 TestCompletionCallback callback; |
| 1928 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(), | 1856 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1929 pool_.get(), BoundNetLog()); | 1857 ClientSocketPool::RespectLimits::ENABLED, |
| 1858 callback.callback(), pool_.get(), BoundNetLog()); |
| 1930 EXPECT_EQ(ERR_IO_PENDING, rv); | 1859 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1931 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST); | 1860 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST); |
| 1932 | 1861 |
| 1933 ClientSocketHandle handle2; | 1862 ClientSocketHandle handle2; |
| 1934 TestCompletionCallback callback2; | 1863 TestCompletionCallback callback2; |
| 1935 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, callback2.callback(), | 1864 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 1936 pool_.get(), BoundNetLog()); | 1865 ClientSocketPool::RespectLimits::ENABLED, |
| 1866 callback2.callback(), pool_.get(), BoundNetLog()); |
| 1937 EXPECT_EQ(ERR_IO_PENDING, rv); | 1867 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1938 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST); | 1868 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST); |
| 1939 | 1869 |
| 1940 // Check that both handles report the state of the first job. | 1870 // Check that both handles report the state of the first job. |
| 1941 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState()); | 1871 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState()); |
| 1942 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState()); | 1872 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState()); |
| 1943 | 1873 |
| 1944 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING); | 1874 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING); |
| 1945 | 1875 |
| 1946 // Check that both handles change to LOAD_STATE_CONNECTING. | 1876 // Check that both handles change to LOAD_STATE_CONNECTING. |
| 1947 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1877 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1948 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | 1878 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); |
| 1949 } | 1879 } |
| 1950 | 1880 |
| 1951 // Test that the second connection request does not affect the pool's load | 1881 // Test that the second connection request does not affect the pool's load |
| 1952 // status. | 1882 // status. |
| 1953 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) { | 1883 TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) { |
| 1954 CreatePool(2, 2); | 1884 CreatePool(2, 2); |
| 1955 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1885 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1956 | 1886 |
| 1957 ClientSocketHandle handle; | 1887 ClientSocketHandle handle; |
| 1958 TestCompletionCallback callback; | 1888 TestCompletionCallback callback; |
| 1959 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(), | 1889 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 1960 pool_.get(), BoundNetLog()); | 1890 ClientSocketPool::RespectLimits::ENABLED, |
| 1891 callback.callback(), pool_.get(), BoundNetLog()); |
| 1961 EXPECT_EQ(ERR_IO_PENDING, rv); | 1892 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1962 | 1893 |
| 1963 ClientSocketHandle handle2; | 1894 ClientSocketHandle handle2; |
| 1964 TestCompletionCallback callback2; | 1895 TestCompletionCallback callback2; |
| 1965 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, callback2.callback(), | 1896 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 1966 pool_.get(), BoundNetLog()); | 1897 ClientSocketPool::RespectLimits::ENABLED, |
| 1898 callback2.callback(), pool_.get(), BoundNetLog()); |
| 1967 EXPECT_EQ(ERR_IO_PENDING, rv); | 1899 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1968 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST); | 1900 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST); |
| 1969 | 1901 |
| 1970 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1902 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1971 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | 1903 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); |
| 1972 | 1904 |
| 1973 // First job connects and the first request gets the socket. The | 1905 // First job connects and the first request gets the socket. The |
| 1974 // second handle switches to the state of the remaining ConnectJob. | 1906 // second handle switches to the state of the remaining ConnectJob. |
| 1975 client_socket_factory_.SignalJob(0); | 1907 client_socket_factory_.SignalJob(0); |
| 1976 EXPECT_EQ(OK, callback.WaitForResult()); | 1908 EXPECT_EQ(OK, callback.WaitForResult()); |
| 1977 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState()); | 1909 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState()); |
| 1978 } | 1910 } |
| 1979 | 1911 |
| 1980 // Test GetLoadState in the case the per-group limit is reached. | 1912 // Test GetLoadState in the case the per-group limit is reached. |
| 1981 TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) { | 1913 TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) { |
| 1982 CreatePool(2, 1); | 1914 CreatePool(2, 1); |
| 1983 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1915 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 1984 | 1916 |
| 1985 ClientSocketHandle handle; | 1917 ClientSocketHandle handle; |
| 1986 TestCompletionCallback callback; | 1918 TestCompletionCallback callback; |
| 1987 int rv = handle.Init("a", | 1919 int rv = handle.Init("a", params_, MEDIUM, |
| 1988 params_, | 1920 ClientSocketPool::RespectLimits::ENABLED, |
| 1989 MEDIUM, | 1921 callback.callback(), pool_.get(), BoundNetLog()); |
| 1990 callback.callback(), | |
| 1991 pool_.get(), | |
| 1992 BoundNetLog()); | |
| 1993 EXPECT_EQ(ERR_IO_PENDING, rv); | 1922 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1994 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1923 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 1995 | 1924 |
| 1996 // Request another socket from the same pool, buth with a higher priority. | 1925 // Request another socket from the same pool, buth with a higher priority. |
| 1997 // The first request should now be stalled at the socket group limit. | 1926 // The first request should now be stalled at the socket group limit. |
| 1998 ClientSocketHandle handle2; | 1927 ClientSocketHandle handle2; |
| 1999 TestCompletionCallback callback2; | 1928 TestCompletionCallback callback2; |
| 2000 rv = handle2.Init("a", | 1929 rv = handle2.Init("a", params_, HIGHEST, |
| 2001 params_, | 1930 ClientSocketPool::RespectLimits::ENABLED, |
| 2002 HIGHEST, | 1931 callback2.callback(), pool_.get(), BoundNetLog()); |
| 2003 callback2.callback(), | |
| 2004 pool_.get(), | |
| 2005 BoundNetLog()); | |
| 2006 EXPECT_EQ(ERR_IO_PENDING, rv); | 1932 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2007 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | 1933 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); |
| 2008 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); | 1934 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); |
| 2009 | 1935 |
| 2010 // The first handle should remain stalled as the other socket goes through | 1936 // The first handle should remain stalled as the other socket goes through |
| 2011 // the connect process. | 1937 // the connect process. |
| 2012 | 1938 |
| 2013 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); | 1939 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); |
| 2014 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | 1940 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); |
| 2015 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); | 1941 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState()); |
| 2016 | 1942 |
| 2017 client_socket_factory_.SignalJob(0); | 1943 client_socket_factory_.SignalJob(0); |
| 2018 EXPECT_EQ(OK, callback2.WaitForResult()); | 1944 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 2019 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); | 1945 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); |
| 2020 | 1946 |
| 2021 // Closing the second socket should cause the stalled handle to finally get a | 1947 // Closing the second socket should cause the stalled handle to finally get a |
| 2022 // ConnectJob. | 1948 // ConnectJob. |
| 2023 handle2.socket()->Disconnect(); | 1949 handle2.socket()->Disconnect(); |
| 2024 handle2.Reset(); | 1950 handle2.Reset(); |
| 2025 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1951 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 2026 } | 1952 } |
| 2027 | 1953 |
| 2028 // Test GetLoadState in the case the per-pool limit is reached. | 1954 // Test GetLoadState in the case the per-pool limit is reached. |
| 2029 TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) { | 1955 TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) { |
| 2030 CreatePool(2, 2); | 1956 CreatePool(2, 2); |
| 2031 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 1957 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2032 | 1958 |
| 2033 ClientSocketHandle handle; | 1959 ClientSocketHandle handle; |
| 2034 TestCompletionCallback callback; | 1960 TestCompletionCallback callback; |
| 2035 int rv = handle.Init("a", | 1961 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2036 params_, | 1962 ClientSocketPool::RespectLimits::ENABLED, |
| 2037 DEFAULT_PRIORITY, | 1963 callback.callback(), pool_.get(), BoundNetLog()); |
| 2038 callback.callback(), | |
| 2039 pool_.get(), | |
| 2040 BoundNetLog()); | |
| 2041 EXPECT_EQ(ERR_IO_PENDING, rv); | 1964 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2042 | 1965 |
| 2043 // Request for socket from another pool. | 1966 // Request for socket from another pool. |
| 2044 ClientSocketHandle handle2; | 1967 ClientSocketHandle handle2; |
| 2045 TestCompletionCallback callback2; | 1968 TestCompletionCallback callback2; |
| 2046 rv = handle2.Init("b", | 1969 rv = handle2.Init("b", params_, DEFAULT_PRIORITY, |
| 2047 params_, | 1970 ClientSocketPool::RespectLimits::ENABLED, |
| 2048 DEFAULT_PRIORITY, | 1971 callback2.callback(), pool_.get(), BoundNetLog()); |
| 2049 callback2.callback(), | |
| 2050 pool_.get(), | |
| 2051 BoundNetLog()); | |
| 2052 EXPECT_EQ(ERR_IO_PENDING, rv); | 1972 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2053 | 1973 |
| 2054 // Request another socket from the first pool. Request should stall at the | 1974 // Request another socket from the first pool. Request should stall at the |
| 2055 // socket pool limit. | 1975 // socket pool limit. |
| 2056 ClientSocketHandle handle3; | 1976 ClientSocketHandle handle3; |
| 2057 TestCompletionCallback callback3; | 1977 TestCompletionCallback callback3; |
| 2058 rv = handle3.Init("a", | 1978 rv = handle3.Init("a", params_, DEFAULT_PRIORITY, |
| 2059 params_, | 1979 ClientSocketPool::RespectLimits::ENABLED, |
| 2060 DEFAULT_PRIORITY, | 1980 callback2.callback(), pool_.get(), BoundNetLog()); |
| 2061 callback2.callback(), | |
| 2062 pool_.get(), | |
| 2063 BoundNetLog()); | |
| 2064 EXPECT_EQ(ERR_IO_PENDING, rv); | 1981 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2065 | 1982 |
| 2066 // The third handle should remain stalled as the other sockets in its group | 1983 // The third handle should remain stalled as the other sockets in its group |
| 2067 // goes through the connect process. | 1984 // goes through the connect process. |
| 2068 | 1985 |
| 2069 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); | 1986 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); |
| 2070 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); | 1987 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState()); |
| 2071 | 1988 |
| 2072 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); | 1989 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE); |
| 2073 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); | 1990 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2084 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState()); | 2001 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState()); |
| 2085 } | 2002 } |
| 2086 | 2003 |
| 2087 TEST_F(ClientSocketPoolBaseTest, Recoverable) { | 2004 TEST_F(ClientSocketPoolBaseTest, Recoverable) { |
| 2088 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2005 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2089 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob); | 2006 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob); |
| 2090 | 2007 |
| 2091 ClientSocketHandle handle; | 2008 ClientSocketHandle handle; |
| 2092 TestCompletionCallback callback; | 2009 TestCompletionCallback callback; |
| 2093 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, | 2010 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, |
| 2094 handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(), | 2011 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2095 pool_.get(), BoundNetLog())); | 2012 ClientSocketPool::RespectLimits::ENABLED, |
| 2013 callback.callback(), pool_.get(), BoundNetLog())); |
| 2096 EXPECT_TRUE(handle.is_initialized()); | 2014 EXPECT_TRUE(handle.is_initialized()); |
| 2097 EXPECT_TRUE(handle.socket()); | 2015 EXPECT_TRUE(handle.socket()); |
| 2098 } | 2016 } |
| 2099 | 2017 |
| 2100 TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) { | 2018 TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) { |
| 2101 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2019 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2102 | 2020 |
| 2103 connect_job_factory_->set_job_type( | 2021 connect_job_factory_->set_job_type( |
| 2104 TestConnectJob::kMockPendingRecoverableJob); | 2022 TestConnectJob::kMockPendingRecoverableJob); |
| 2105 ClientSocketHandle handle; | 2023 ClientSocketHandle handle; |
| 2106 TestCompletionCallback callback; | 2024 TestCompletionCallback callback; |
| 2107 EXPECT_EQ(ERR_IO_PENDING, | 2025 EXPECT_EQ(ERR_IO_PENDING, |
| 2108 handle.Init("a", | 2026 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2109 params_, | 2027 ClientSocketPool::RespectLimits::ENABLED, |
| 2110 DEFAULT_PRIORITY, | 2028 callback.callback(), pool_.get(), BoundNetLog())); |
| 2111 callback.callback(), | |
| 2112 pool_.get(), | |
| 2113 BoundNetLog())); | |
| 2114 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2029 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 2115 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); | 2030 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); |
| 2116 EXPECT_TRUE(handle.is_initialized()); | 2031 EXPECT_TRUE(handle.is_initialized()); |
| 2117 EXPECT_TRUE(handle.socket()); | 2032 EXPECT_TRUE(handle.socket()); |
| 2118 } | 2033 } |
| 2119 | 2034 |
| 2120 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) { | 2035 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) { |
| 2121 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2036 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2122 connect_job_factory_->set_job_type( | 2037 connect_job_factory_->set_job_type( |
| 2123 TestConnectJob::kMockAdditionalErrorStateJob); | 2038 TestConnectJob::kMockAdditionalErrorStateJob); |
| 2124 | 2039 |
| 2125 ClientSocketHandle handle; | 2040 ClientSocketHandle handle; |
| 2126 TestCompletionCallback callback; | 2041 TestCompletionCallback callback; |
| 2127 EXPECT_EQ(ERR_CONNECTION_FAILED, | 2042 EXPECT_EQ(ERR_CONNECTION_FAILED, |
| 2128 handle.Init("a", | 2043 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2129 params_, | 2044 ClientSocketPool::RespectLimits::ENABLED, |
| 2130 DEFAULT_PRIORITY, | 2045 callback.callback(), pool_.get(), BoundNetLog())); |
| 2131 callback.callback(), | |
| 2132 pool_.get(), | |
| 2133 BoundNetLog())); | |
| 2134 EXPECT_FALSE(handle.is_initialized()); | 2046 EXPECT_FALSE(handle.is_initialized()); |
| 2135 EXPECT_FALSE(handle.socket()); | 2047 EXPECT_FALSE(handle.socket()); |
| 2136 EXPECT_TRUE(handle.is_ssl_error()); | 2048 EXPECT_TRUE(handle.is_ssl_error()); |
| 2137 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); | 2049 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); |
| 2138 } | 2050 } |
| 2139 | 2051 |
| 2140 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) { | 2052 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) { |
| 2141 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2053 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2142 | 2054 |
| 2143 connect_job_factory_->set_job_type( | 2055 connect_job_factory_->set_job_type( |
| 2144 TestConnectJob::kMockPendingAdditionalErrorStateJob); | 2056 TestConnectJob::kMockPendingAdditionalErrorStateJob); |
| 2145 ClientSocketHandle handle; | 2057 ClientSocketHandle handle; |
| 2146 TestCompletionCallback callback; | 2058 TestCompletionCallback callback; |
| 2147 EXPECT_EQ(ERR_IO_PENDING, | 2059 EXPECT_EQ(ERR_IO_PENDING, |
| 2148 handle.Init("a", | 2060 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2149 params_, | 2061 ClientSocketPool::RespectLimits::ENABLED, |
| 2150 DEFAULT_PRIORITY, | 2062 callback.callback(), pool_.get(), BoundNetLog())); |
| 2151 callback.callback(), | |
| 2152 pool_.get(), | |
| 2153 BoundNetLog())); | |
| 2154 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2063 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 2155 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); | 2064 EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); |
| 2156 EXPECT_FALSE(handle.is_initialized()); | 2065 EXPECT_FALSE(handle.is_initialized()); |
| 2157 EXPECT_FALSE(handle.socket()); | 2066 EXPECT_FALSE(handle.socket()); |
| 2158 EXPECT_TRUE(handle.is_ssl_error()); | 2067 EXPECT_TRUE(handle.is_ssl_error()); |
| 2159 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); | 2068 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL); |
| 2160 } | 2069 } |
| 2161 | 2070 |
| 2162 // Make sure we can reuse sockets when the cleanup timer is disabled. | 2071 // Make sure we can reuse sockets when the cleanup timer is disabled. |
| 2163 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerReuse) { | 2072 TEST_F(ClientSocketPoolBaseTest, DisableCleanupTimerReuse) { |
| 2164 // Disable cleanup timer. | 2073 // Disable cleanup timer. |
| 2165 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); | 2074 internal::ClientSocketPoolBaseHelper::set_cleanup_timer_enabled(false); |
| 2166 | 2075 |
| 2167 CreatePoolWithIdleTimeouts( | 2076 CreatePoolWithIdleTimeouts( |
| 2168 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, | 2077 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, |
| 2169 base::TimeDelta(), // Time out unused sockets immediately. | 2078 base::TimeDelta(), // Time out unused sockets immediately. |
| 2170 base::TimeDelta::FromDays(1)); // Don't time out used sockets. | 2079 base::TimeDelta::FromDays(1)); // Don't time out used sockets. |
| 2171 | 2080 |
| 2172 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2081 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2173 | 2082 |
| 2174 ClientSocketHandle handle; | 2083 ClientSocketHandle handle; |
| 2175 TestCompletionCallback callback; | 2084 TestCompletionCallback callback; |
| 2176 int rv = handle.Init("a", | 2085 int rv = handle.Init("a", params_, LOWEST, |
| 2177 params_, | 2086 ClientSocketPool::RespectLimits::ENABLED, |
| 2178 LOWEST, | 2087 callback.callback(), pool_.get(), BoundNetLog()); |
| 2179 callback.callback(), | |
| 2180 pool_.get(), | |
| 2181 BoundNetLog()); | |
| 2182 ASSERT_EQ(ERR_IO_PENDING, rv); | 2088 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 2183 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2089 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 2184 ASSERT_EQ(OK, callback.WaitForResult()); | 2090 ASSERT_EQ(OK, callback.WaitForResult()); |
| 2185 | 2091 |
| 2186 // Use and release the socket. | 2092 // Use and release the socket. |
| 2187 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback())); | 2093 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback())); |
| 2188 TestLoadTimingInfoConnectedNotReused(handle); | 2094 TestLoadTimingInfoConnectedNotReused(handle); |
| 2189 handle.Reset(); | 2095 handle.Reset(); |
| 2190 | 2096 |
| 2191 // Should now have one idle socket. | 2097 // Should now have one idle socket. |
| 2192 ASSERT_EQ(1, pool_->IdleSocketCount()); | 2098 ASSERT_EQ(1, pool_->IdleSocketCount()); |
| 2193 | 2099 |
| 2194 // Request a new socket. This should reuse the old socket and complete | 2100 // Request a new socket. This should reuse the old socket and complete |
| 2195 // synchronously. | 2101 // synchronously. |
| 2196 BoundTestNetLog log; | 2102 BoundTestNetLog log; |
| 2197 rv = handle.Init("a", | 2103 rv = handle.Init("a", params_, LOWEST, |
| 2198 params_, | 2104 ClientSocketPool::RespectLimits::ENABLED, |
| 2199 LOWEST, | 2105 CompletionCallback(), pool_.get(), log.bound()); |
| 2200 CompletionCallback(), | |
| 2201 pool_.get(), | |
| 2202 log.bound()); | |
| 2203 ASSERT_EQ(OK, rv); | 2106 ASSERT_EQ(OK, rv); |
| 2204 EXPECT_TRUE(handle.is_reused()); | 2107 EXPECT_TRUE(handle.is_reused()); |
| 2205 TestLoadTimingInfoConnectedReused(handle); | 2108 TestLoadTimingInfoConnectedReused(handle); |
| 2206 | 2109 |
| 2207 ASSERT_TRUE(pool_->HasGroup("a")); | 2110 ASSERT_TRUE(pool_->HasGroup("a")); |
| 2208 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2111 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 2209 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 2112 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
| 2210 | 2113 |
| 2211 TestNetLogEntry::List entries; | 2114 TestNetLogEntry::List entries; |
| 2212 log.GetEntries(&entries); | 2115 log.GetEntries(&entries); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2229 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, | 2132 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, |
| 2230 base::TimeDelta(), // Time out unused sockets immediately | 2133 base::TimeDelta(), // Time out unused sockets immediately |
| 2231 base::TimeDelta()); // Time out used sockets immediately | 2134 base::TimeDelta()); // Time out used sockets immediately |
| 2232 | 2135 |
| 2233 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2136 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2234 | 2137 |
| 2235 // Startup two mock pending connect jobs, which will sit in the MessageLoop. | 2138 // Startup two mock pending connect jobs, which will sit in the MessageLoop. |
| 2236 | 2139 |
| 2237 ClientSocketHandle handle; | 2140 ClientSocketHandle handle; |
| 2238 TestCompletionCallback callback; | 2141 TestCompletionCallback callback; |
| 2239 int rv = handle.Init("a", | 2142 int rv = handle.Init("a", params_, LOWEST, |
| 2240 params_, | 2143 ClientSocketPool::RespectLimits::ENABLED, |
| 2241 LOWEST, | 2144 callback.callback(), pool_.get(), BoundNetLog()); |
| 2242 callback.callback(), | |
| 2243 pool_.get(), | |
| 2244 BoundNetLog()); | |
| 2245 ASSERT_EQ(ERR_IO_PENDING, rv); | 2145 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 2246 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2146 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 2247 | 2147 |
| 2248 ClientSocketHandle handle2; | 2148 ClientSocketHandle handle2; |
| 2249 TestCompletionCallback callback2; | 2149 TestCompletionCallback callback2; |
| 2250 rv = handle2.Init("a", | 2150 rv = handle2.Init("a", params_, LOWEST, |
| 2251 params_, | 2151 ClientSocketPool::RespectLimits::ENABLED, |
| 2252 LOWEST, | 2152 callback2.callback(), pool_.get(), BoundNetLog()); |
| 2253 callback2.callback(), | |
| 2254 pool_.get(), | |
| 2255 BoundNetLog()); | |
| 2256 ASSERT_EQ(ERR_IO_PENDING, rv); | 2153 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 2257 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); | 2154 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); |
| 2258 | 2155 |
| 2259 // Cancel one of the requests. Wait for the other, which will get the first | 2156 // Cancel one of the requests. Wait for the other, which will get the first |
| 2260 // job. Release the socket. Run the loop again to make sure the second | 2157 // job. Release the socket. Run the loop again to make sure the second |
| 2261 // socket is sitting idle and the first one is released (since ReleaseSocket() | 2158 // socket is sitting idle and the first one is released (since ReleaseSocket() |
| 2262 // just posts a DoReleaseSocket() task). | 2159 // just posts a DoReleaseSocket() task). |
| 2263 | 2160 |
| 2264 handle.Reset(); | 2161 handle.Reset(); |
| 2265 ASSERT_EQ(OK, callback2.WaitForResult()); | 2162 ASSERT_EQ(OK, callback2.WaitForResult()); |
| 2266 // Use the socket. | 2163 // Use the socket. |
| 2267 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); | 2164 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); |
| 2268 handle2.Reset(); | 2165 handle2.Reset(); |
| 2269 | 2166 |
| 2270 // We post all of our delayed tasks with a 2ms delay. I.e. they don't | 2167 // We post all of our delayed tasks with a 2ms delay. I.e. they don't |
| 2271 // actually become pending until 2ms after they have been created. In order | 2168 // actually become pending until 2ms after they have been created. In order |
| 2272 // to flush all tasks, we need to wait so that we know there are no | 2169 // to flush all tasks, we need to wait so that we know there are no |
| 2273 // soon-to-be-pending tasks waiting. | 2170 // soon-to-be-pending tasks waiting. |
| 2274 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); | 2171 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); |
| 2275 base::MessageLoop::current()->RunUntilIdle(); | 2172 base::MessageLoop::current()->RunUntilIdle(); |
| 2276 | 2173 |
| 2277 // Both sockets should now be idle. | 2174 // Both sockets should now be idle. |
| 2278 ASSERT_EQ(2, pool_->IdleSocketCount()); | 2175 ASSERT_EQ(2, pool_->IdleSocketCount()); |
| 2279 | 2176 |
| 2280 // Request a new socket. This should cleanup the unused and timed out ones. | 2177 // Request a new socket. This should cleanup the unused and timed out ones. |
| 2281 // A new socket will be created rather than reusing the idle one. | 2178 // A new socket will be created rather than reusing the idle one. |
| 2282 BoundTestNetLog log; | 2179 BoundTestNetLog log; |
| 2283 TestCompletionCallback callback3; | 2180 TestCompletionCallback callback3; |
| 2284 rv = handle.Init("a", | 2181 rv = handle.Init("a", params_, LOWEST, |
| 2285 params_, | 2182 ClientSocketPool::RespectLimits::ENABLED, |
| 2286 LOWEST, | 2183 callback3.callback(), pool_.get(), log.bound()); |
| 2287 callback3.callback(), | |
| 2288 pool_.get(), | |
| 2289 log.bound()); | |
| 2290 ASSERT_EQ(ERR_IO_PENDING, rv); | 2184 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 2291 ASSERT_EQ(OK, callback3.WaitForResult()); | 2185 ASSERT_EQ(OK, callback3.WaitForResult()); |
| 2292 EXPECT_FALSE(handle.is_reused()); | 2186 EXPECT_FALSE(handle.is_reused()); |
| 2293 | 2187 |
| 2294 // Make sure the idle socket is closed. | 2188 // Make sure the idle socket is closed. |
| 2295 ASSERT_TRUE(pool_->HasGroup("a")); | 2189 ASSERT_TRUE(pool_->HasGroup("a")); |
| 2296 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2190 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 2297 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 2191 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
| 2298 | 2192 |
| 2299 TestNetLogEntry::List entries; | 2193 TestNetLogEntry::List entries; |
| 2300 log.GetEntries(&entries); | 2194 log.GetEntries(&entries); |
| 2301 EXPECT_FALSE(LogContainsEntryWithType( | 2195 EXPECT_FALSE(LogContainsEntryWithType( |
| 2302 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); | 2196 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); |
| 2303 } | 2197 } |
| 2304 | 2198 |
| 2305 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSockets) { | 2199 TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSockets) { |
| 2306 CreatePoolWithIdleTimeouts( | 2200 CreatePoolWithIdleTimeouts( |
| 2307 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, | 2201 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, |
| 2308 base::TimeDelta(), // Time out unused sockets immediately. | 2202 base::TimeDelta(), // Time out unused sockets immediately. |
| 2309 base::TimeDelta::FromDays(1)); // Don't time out used sockets. | 2203 base::TimeDelta::FromDays(1)); // Don't time out used sockets. |
| 2310 | 2204 |
| 2311 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2205 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2312 | 2206 |
| 2313 // Startup two mock pending connect jobs, which will sit in the MessageLoop. | 2207 // Startup two mock pending connect jobs, which will sit in the MessageLoop. |
| 2314 | 2208 |
| 2315 ClientSocketHandle handle; | 2209 ClientSocketHandle handle; |
| 2316 TestCompletionCallback callback; | 2210 TestCompletionCallback callback; |
| 2317 int rv = handle.Init("a", | 2211 int rv = handle.Init("a", params_, LOWEST, |
| 2318 params_, | 2212 ClientSocketPool::RespectLimits::ENABLED, |
| 2319 LOWEST, | 2213 callback.callback(), pool_.get(), BoundNetLog()); |
| 2320 callback.callback(), | |
| 2321 pool_.get(), | |
| 2322 BoundNetLog()); | |
| 2323 EXPECT_EQ(ERR_IO_PENDING, rv); | 2214 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2324 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); | 2215 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); |
| 2325 | 2216 |
| 2326 ClientSocketHandle handle2; | 2217 ClientSocketHandle handle2; |
| 2327 TestCompletionCallback callback2; | 2218 TestCompletionCallback callback2; |
| 2328 rv = handle2.Init("a", | 2219 rv = handle2.Init("a", params_, LOWEST, |
| 2329 params_, | 2220 ClientSocketPool::RespectLimits::ENABLED, |
| 2330 LOWEST, | 2221 callback2.callback(), pool_.get(), BoundNetLog()); |
| 2331 callback2.callback(), | |
| 2332 pool_.get(), | |
| 2333 BoundNetLog()); | |
| 2334 EXPECT_EQ(ERR_IO_PENDING, rv); | 2222 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2335 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); | 2223 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); |
| 2336 | 2224 |
| 2337 // Cancel one of the requests. Wait for the other, which will get the first | 2225 // Cancel one of the requests. Wait for the other, which will get the first |
| 2338 // job. Release the socket. Run the loop again to make sure the second | 2226 // job. Release the socket. Run the loop again to make sure the second |
| 2339 // socket is sitting idle and the first one is released (since ReleaseSocket() | 2227 // socket is sitting idle and the first one is released (since ReleaseSocket() |
| 2340 // just posts a DoReleaseSocket() task). | 2228 // just posts a DoReleaseSocket() task). |
| 2341 | 2229 |
| 2342 handle.Reset(); | 2230 handle.Reset(); |
| 2343 EXPECT_EQ(OK, callback2.WaitForResult()); | 2231 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 2344 // Use the socket. | 2232 // Use the socket. |
| 2345 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); | 2233 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback())); |
| 2346 handle2.Reset(); | 2234 handle2.Reset(); |
| 2347 | 2235 |
| 2348 // We post all of our delayed tasks with a 2ms delay. I.e. they don't | 2236 // We post all of our delayed tasks with a 2ms delay. I.e. they don't |
| 2349 // actually become pending until 2ms after they have been created. In order | 2237 // actually become pending until 2ms after they have been created. In order |
| 2350 // to flush all tasks, we need to wait so that we know there are no | 2238 // to flush all tasks, we need to wait so that we know there are no |
| 2351 // soon-to-be-pending tasks waiting. | 2239 // soon-to-be-pending tasks waiting. |
| 2352 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); | 2240 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); |
| 2353 base::MessageLoop::current()->RunUntilIdle(); | 2241 base::MessageLoop::current()->RunUntilIdle(); |
| 2354 | 2242 |
| 2355 ASSERT_EQ(2, pool_->IdleSocketCount()); | 2243 ASSERT_EQ(2, pool_->IdleSocketCount()); |
| 2356 | 2244 |
| 2357 // Invoke the idle socket cleanup check. Only one socket should be left, the | 2245 // Invoke the idle socket cleanup check. Only one socket should be left, the |
| 2358 // used socket. Request it to make sure that it's used. | 2246 // used socket. Request it to make sure that it's used. |
| 2359 | 2247 |
| 2360 pool_->CleanupTimedOutIdleSockets(); | 2248 pool_->CleanupTimedOutIdleSockets(); |
| 2361 BoundTestNetLog log; | 2249 BoundTestNetLog log; |
| 2362 rv = handle.Init("a", | 2250 rv = handle.Init("a", params_, LOWEST, |
| 2363 params_, | 2251 ClientSocketPool::RespectLimits::ENABLED, |
| 2364 LOWEST, | 2252 callback.callback(), pool_.get(), log.bound()); |
| 2365 callback.callback(), | |
| 2366 pool_.get(), | |
| 2367 log.bound()); | |
| 2368 EXPECT_EQ(OK, rv); | 2253 EXPECT_EQ(OK, rv); |
| 2369 EXPECT_TRUE(handle.is_reused()); | 2254 EXPECT_TRUE(handle.is_reused()); |
| 2370 | 2255 |
| 2371 TestNetLogEntry::List entries; | 2256 TestNetLogEntry::List entries; |
| 2372 log.GetEntries(&entries); | 2257 log.GetEntries(&entries); |
| 2373 EXPECT_TRUE(LogContainsEntryWithType( | 2258 EXPECT_TRUE(LogContainsEntryWithType( |
| 2374 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); | 2259 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET)); |
| 2375 } | 2260 } |
| 2376 | 2261 |
| 2377 // Make sure that we process all pending requests even when we're stalling | 2262 // Make sure that we process all pending requests even when we're stalling |
| 2378 // because of multiple releasing disconnected sockets. | 2263 // because of multiple releasing disconnected sockets. |
| 2379 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) { | 2264 TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) { |
| 2380 CreatePoolWithIdleTimeouts( | 2265 CreatePoolWithIdleTimeouts( |
| 2381 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, | 2266 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup, |
| 2382 base::TimeDelta(), // Time out unused sockets immediately. | 2267 base::TimeDelta(), // Time out unused sockets immediately. |
| 2383 base::TimeDelta::FromDays(1)); // Don't time out used sockets. | 2268 base::TimeDelta::FromDays(1)); // Don't time out used sockets. |
| 2384 | 2269 |
| 2385 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 2270 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 2386 | 2271 |
| 2387 // Startup 4 connect jobs. Two of them will be pending. | 2272 // Startup 4 connect jobs. Two of them will be pending. |
| 2388 | 2273 |
| 2389 ClientSocketHandle handle; | 2274 ClientSocketHandle handle; |
| 2390 TestCompletionCallback callback; | 2275 TestCompletionCallback callback; |
| 2391 int rv = handle.Init("a", | 2276 int rv = handle.Init("a", params_, LOWEST, |
| 2392 params_, | 2277 ClientSocketPool::RespectLimits::ENABLED, |
| 2393 LOWEST, | 2278 callback.callback(), pool_.get(), BoundNetLog()); |
| 2394 callback.callback(), | |
| 2395 pool_.get(), | |
| 2396 BoundNetLog()); | |
| 2397 EXPECT_EQ(OK, rv); | 2279 EXPECT_EQ(OK, rv); |
| 2398 | 2280 |
| 2399 ClientSocketHandle handle2; | 2281 ClientSocketHandle handle2; |
| 2400 TestCompletionCallback callback2; | 2282 TestCompletionCallback callback2; |
| 2401 rv = handle2.Init("a", | 2283 rv = handle2.Init("a", params_, LOWEST, |
| 2402 params_, | 2284 ClientSocketPool::RespectLimits::ENABLED, |
| 2403 LOWEST, | 2285 callback2.callback(), pool_.get(), BoundNetLog()); |
| 2404 callback2.callback(), | |
| 2405 pool_.get(), | |
| 2406 BoundNetLog()); | |
| 2407 EXPECT_EQ(OK, rv); | 2286 EXPECT_EQ(OK, rv); |
| 2408 | 2287 |
| 2409 ClientSocketHandle handle3; | 2288 ClientSocketHandle handle3; |
| 2410 TestCompletionCallback callback3; | 2289 TestCompletionCallback callback3; |
| 2411 rv = handle3.Init("a", | 2290 rv = handle3.Init("a", params_, LOWEST, |
| 2412 params_, | 2291 ClientSocketPool::RespectLimits::ENABLED, |
| 2413 LOWEST, | 2292 callback3.callback(), pool_.get(), BoundNetLog()); |
| 2414 callback3.callback(), | |
| 2415 pool_.get(), | |
| 2416 BoundNetLog()); | |
| 2417 EXPECT_EQ(ERR_IO_PENDING, rv); | 2293 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2418 | 2294 |
| 2419 ClientSocketHandle handle4; | 2295 ClientSocketHandle handle4; |
| 2420 TestCompletionCallback callback4; | 2296 TestCompletionCallback callback4; |
| 2421 rv = handle4.Init("a", | 2297 rv = handle4.Init("a", params_, LOWEST, |
| 2422 params_, | 2298 ClientSocketPool::RespectLimits::ENABLED, |
| 2423 LOWEST, | 2299 callback4.callback(), pool_.get(), BoundNetLog()); |
| 2424 callback4.callback(), | |
| 2425 pool_.get(), | |
| 2426 BoundNetLog()); | |
| 2427 EXPECT_EQ(ERR_IO_PENDING, rv); | 2300 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2428 | 2301 |
| 2429 // Release two disconnected sockets. | 2302 // Release two disconnected sockets. |
| 2430 | 2303 |
| 2431 handle.socket()->Disconnect(); | 2304 handle.socket()->Disconnect(); |
| 2432 handle.Reset(); | 2305 handle.Reset(); |
| 2433 handle2.socket()->Disconnect(); | 2306 handle2.socket()->Disconnect(); |
| 2434 handle2.Reset(); | 2307 handle2.Reset(); |
| 2435 | 2308 |
| 2436 EXPECT_EQ(OK, callback3.WaitForResult()); | 2309 EXPECT_EQ(OK, callback3.WaitForResult()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2451 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 2324 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 2452 | 2325 |
| 2453 // Max out the socket limit with 2 per group. | 2326 // Max out the socket limit with 2 per group. |
| 2454 | 2327 |
| 2455 ClientSocketHandle handle_a[4]; | 2328 ClientSocketHandle handle_a[4]; |
| 2456 TestCompletionCallback callback_a[4]; | 2329 TestCompletionCallback callback_a[4]; |
| 2457 ClientSocketHandle handle_b[4]; | 2330 ClientSocketHandle handle_b[4]; |
| 2458 TestCompletionCallback callback_b[4]; | 2331 TestCompletionCallback callback_b[4]; |
| 2459 | 2332 |
| 2460 for (int i = 0; i < 2; ++i) { | 2333 for (int i = 0; i < 2; ++i) { |
| 2461 EXPECT_EQ(OK, handle_a[i].Init("a", | 2334 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST, |
| 2462 params_, | 2335 ClientSocketPool::RespectLimits::ENABLED, |
| 2463 LOWEST, | 2336 callback_a[i].callback(), pool_.get(), |
| 2464 callback_a[i].callback(), | |
| 2465 pool_.get(), | |
| 2466 BoundNetLog())); | 2337 BoundNetLog())); |
| 2467 EXPECT_EQ(OK, handle_b[i].Init("b", | 2338 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST, |
| 2468 params_, | 2339 ClientSocketPool::RespectLimits::ENABLED, |
| 2469 LOWEST, | 2340 callback_b[i].callback(), pool_.get(), |
| 2470 callback_b[i].callback(), | |
| 2471 pool_.get(), | |
| 2472 BoundNetLog())); | 2341 BoundNetLog())); |
| 2473 } | 2342 } |
| 2474 | 2343 |
| 2475 // Make 4 pending requests, 2 per group. | 2344 // Make 4 pending requests, 2 per group. |
| 2476 | 2345 |
| 2477 for (int i = 2; i < 4; ++i) { | 2346 for (int i = 2; i < 4; ++i) { |
| 2478 EXPECT_EQ(ERR_IO_PENDING, | 2347 EXPECT_EQ( |
| 2479 handle_a[i].Init("a", | 2348 ERR_IO_PENDING, |
| 2480 params_, | 2349 handle_a[i].Init("a", params_, LOWEST, |
| 2481 LOWEST, | 2350 ClientSocketPool::RespectLimits::ENABLED, |
| 2482 callback_a[i].callback(), | 2351 callback_a[i].callback(), pool_.get(), BoundNetLog())); |
| 2483 pool_.get(), | 2352 EXPECT_EQ( |
| 2484 BoundNetLog())); | 2353 ERR_IO_PENDING, |
| 2485 EXPECT_EQ(ERR_IO_PENDING, | 2354 handle_b[i].Init("b", params_, LOWEST, |
| 2486 handle_b[i].Init("b", | 2355 ClientSocketPool::RespectLimits::ENABLED, |
| 2487 params_, | 2356 callback_b[i].callback(), pool_.get(), BoundNetLog())); |
| 2488 LOWEST, | |
| 2489 callback_b[i].callback(), | |
| 2490 pool_.get(), | |
| 2491 BoundNetLog())); | |
| 2492 } | 2357 } |
| 2493 | 2358 |
| 2494 // Release b's socket first. The order is important, because in | 2359 // Release b's socket first. The order is important, because in |
| 2495 // DoReleaseSocket(), we'll process b's released socket, and since both b and | 2360 // DoReleaseSocket(), we'll process b's released socket, and since both b and |
| 2496 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a' | 2361 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a' |
| 2497 // first, which has a releasing socket, so it refuses to start up another | 2362 // first, which has a releasing socket, so it refuses to start up another |
| 2498 // ConnectJob. So, we used to infinite loop on this. | 2363 // ConnectJob. So, we used to infinite loop on this. |
| 2499 handle_b[0].socket()->Disconnect(); | 2364 handle_b[0].socket()->Disconnect(); |
| 2500 handle_b[0].Reset(); | 2365 handle_b[0].Reset(); |
| 2501 handle_a[0].socket()->Disconnect(); | 2366 handle_a[0].socket()->Disconnect(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2564 ClientSocketHandle* handle() { return &handle_; } | 2429 ClientSocketHandle* handle() { return &handle_; } |
| 2565 | 2430 |
| 2566 const CompletionCallback& callback() const { return callback_; } | 2431 const CompletionCallback& callback() const { return callback_; } |
| 2567 | 2432 |
| 2568 private: | 2433 private: |
| 2569 void OnComplete(int result) { | 2434 void OnComplete(int result) { |
| 2570 SetResult(result); | 2435 SetResult(result); |
| 2571 if (reset_releasing_handle_) | 2436 if (reset_releasing_handle_) |
| 2572 handle_.Reset(); | 2437 handle_.Reset(); |
| 2573 | 2438 |
| 2574 scoped_refptr<TestSocketParams> con_params( | 2439 scoped_refptr<TestSocketParams> con_params(new TestSocketParams()); |
| 2575 new TestSocketParams(false /* ignore_limits */)); | |
| 2576 EXPECT_EQ(expected_result_, | 2440 EXPECT_EQ(expected_result_, |
| 2577 handle2_.Init("a", con_params, DEFAULT_PRIORITY, | 2441 handle2_.Init("a", con_params, DEFAULT_PRIORITY, |
| 2442 ClientSocketPool::RespectLimits::ENABLED, |
| 2578 callback2_.callback(), pool_, BoundNetLog())); | 2443 callback2_.callback(), pool_, BoundNetLog())); |
| 2579 } | 2444 } |
| 2580 | 2445 |
| 2581 TestClientSocketPool* const pool_; | 2446 TestClientSocketPool* const pool_; |
| 2582 int expected_result_; | 2447 int expected_result_; |
| 2583 bool reset_releasing_handle_; | 2448 bool reset_releasing_handle_; |
| 2584 ClientSocketHandle handle_; | 2449 ClientSocketHandle handle_; |
| 2585 ClientSocketHandle handle2_; | 2450 ClientSocketHandle handle2_; |
| 2586 CompletionCallback callback_; | 2451 CompletionCallback callback_; |
| 2587 TestCompletionCallback callback2_; | 2452 TestCompletionCallback callback2_; |
| 2588 }; | 2453 }; |
| 2589 | 2454 |
| 2590 | 2455 |
| 2591 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) { | 2456 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) { |
| 2592 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2457 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2593 | 2458 |
| 2594 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 2459 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); |
| 2595 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); | 2460 EXPECT_EQ(OK, StartRequest("a", DEFAULT_PRIORITY)); |
| 2596 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); | 2461 EXPECT_EQ(OK, StartRequest("b", DEFAULT_PRIORITY)); |
| 2597 | 2462 |
| 2598 EXPECT_EQ(static_cast<int>(requests_size()), | 2463 EXPECT_EQ(static_cast<int>(requests_size()), |
| 2599 client_socket_factory_.allocation_count()); | 2464 client_socket_factory_.allocation_count()); |
| 2600 | 2465 |
| 2601 connect_job_factory_->set_job_type( | 2466 connect_job_factory_->set_job_type( |
| 2602 TestConnectJob::kMockPendingAdditionalErrorStateJob); | 2467 TestConnectJob::kMockPendingAdditionalErrorStateJob); |
| 2603 TestReleasingSocketRequest req(pool_.get(), OK, false); | 2468 TestReleasingSocketRequest req(pool_.get(), OK, false); |
| 2604 EXPECT_EQ(ERR_IO_PENDING, | 2469 EXPECT_EQ(ERR_IO_PENDING, |
| 2605 req.handle()->Init("a", params_, DEFAULT_PRIORITY, req.callback(), | 2470 req.handle()->Init("a", params_, DEFAULT_PRIORITY, |
| 2606 pool_.get(), BoundNetLog())); | 2471 ClientSocketPool::RespectLimits::ENABLED, |
| 2472 req.callback(), pool_.get(), BoundNetLog())); |
| 2607 // The next job should complete synchronously | 2473 // The next job should complete synchronously |
| 2608 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 2474 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 2609 | 2475 |
| 2610 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); | 2476 EXPECT_EQ(ERR_CONNECTION_FAILED, req.WaitForResult()); |
| 2611 EXPECT_FALSE(req.handle()->is_initialized()); | 2477 EXPECT_FALSE(req.handle()->is_initialized()); |
| 2612 EXPECT_FALSE(req.handle()->socket()); | 2478 EXPECT_FALSE(req.handle()->socket()); |
| 2613 EXPECT_TRUE(req.handle()->is_ssl_error()); | 2479 EXPECT_TRUE(req.handle()->is_ssl_error()); |
| 2614 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL); | 2480 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL); |
| 2615 } | 2481 } |
| 2616 | 2482 |
| 2617 // http://crbug.com/44724 regression test. | 2483 // http://crbug.com/44724 regression test. |
| 2618 // We start releasing the pool when we flush on network change. When that | 2484 // We start releasing the pool when we flush on network change. When that |
| 2619 // happens, the only active references are in the ClientSocketHandles. When a | 2485 // happens, the only active references are in the ClientSocketHandles. When a |
| 2620 // ConnectJob completes and calls back into the last ClientSocketHandle, that | 2486 // ConnectJob completes and calls back into the last ClientSocketHandle, that |
| 2621 // callback can release the last reference and delete the pool. After the | 2487 // callback can release the last reference and delete the pool. After the |
| 2622 // callback finishes, we go back to the stack frame within the now-deleted pool. | 2488 // callback finishes, we go back to the stack frame within the now-deleted pool. |
| 2623 // Executing any code that refers to members of the now-deleted pool can cause | 2489 // Executing any code that refers to members of the now-deleted pool can cause |
| 2624 // crashes. | 2490 // crashes. |
| 2625 TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) { | 2491 TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) { |
| 2626 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2492 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2627 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 2493 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 2628 | 2494 |
| 2629 ClientSocketHandle handle; | 2495 ClientSocketHandle handle; |
| 2630 TestCompletionCallback callback; | 2496 TestCompletionCallback callback; |
| 2631 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 2497 EXPECT_EQ(ERR_IO_PENDING, |
| 2632 params_, | 2498 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2633 DEFAULT_PRIORITY, | 2499 ClientSocketPool::RespectLimits::ENABLED, |
| 2634 callback.callback(), | 2500 callback.callback(), pool_.get(), BoundNetLog())); |
| 2635 pool_.get(), | |
| 2636 BoundNetLog())); | |
| 2637 | 2501 |
| 2638 pool_->FlushWithError(ERR_NETWORK_CHANGED); | 2502 pool_->FlushWithError(ERR_NETWORK_CHANGED); |
| 2639 | 2503 |
| 2640 // We'll call back into this now. | 2504 // We'll call back into this now. |
| 2641 callback.WaitForResult(); | 2505 callback.WaitForResult(); |
| 2642 } | 2506 } |
| 2643 | 2507 |
| 2644 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) { | 2508 TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) { |
| 2645 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2509 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2646 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2510 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2647 | 2511 |
| 2648 ClientSocketHandle handle; | 2512 ClientSocketHandle handle; |
| 2649 TestCompletionCallback callback; | 2513 TestCompletionCallback callback; |
| 2650 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 2514 EXPECT_EQ(ERR_IO_PENDING, |
| 2651 params_, | 2515 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2652 DEFAULT_PRIORITY, | 2516 ClientSocketPool::RespectLimits::ENABLED, |
| 2653 callback.callback(), | 2517 callback.callback(), pool_.get(), BoundNetLog())); |
| 2654 pool_.get(), | |
| 2655 BoundNetLog())); | |
| 2656 EXPECT_EQ(OK, callback.WaitForResult()); | 2518 EXPECT_EQ(OK, callback.WaitForResult()); |
| 2657 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); | 2519 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); |
| 2658 | 2520 |
| 2659 pool_->FlushWithError(ERR_NETWORK_CHANGED); | 2521 pool_->FlushWithError(ERR_NETWORK_CHANGED); |
| 2660 | 2522 |
| 2661 handle.Reset(); | 2523 handle.Reset(); |
| 2662 base::MessageLoop::current()->RunUntilIdle(); | 2524 base::MessageLoop::current()->RunUntilIdle(); |
| 2663 | 2525 |
| 2664 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 2526 EXPECT_EQ(ERR_IO_PENDING, |
| 2665 params_, | 2527 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2666 DEFAULT_PRIORITY, | 2528 ClientSocketPool::RespectLimits::ENABLED, |
| 2667 callback.callback(), | 2529 callback.callback(), pool_.get(), BoundNetLog())); |
| 2668 pool_.get(), | |
| 2669 BoundNetLog())); | |
| 2670 EXPECT_EQ(OK, callback.WaitForResult()); | 2530 EXPECT_EQ(OK, callback.WaitForResult()); |
| 2671 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); | 2531 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); |
| 2672 } | 2532 } |
| 2673 | 2533 |
| 2674 class ConnectWithinCallback : public TestCompletionCallbackBase { | 2534 class ConnectWithinCallback : public TestCompletionCallbackBase { |
| 2675 public: | 2535 public: |
| 2676 ConnectWithinCallback( | 2536 ConnectWithinCallback( |
| 2677 const std::string& group_name, | 2537 const std::string& group_name, |
| 2678 const scoped_refptr<TestSocketParams>& params, | 2538 const scoped_refptr<TestSocketParams>& params, |
| 2679 TestClientSocketPool* pool) | 2539 TestClientSocketPool* pool) |
| 2680 : group_name_(group_name), | 2540 : group_name_(group_name), |
| 2681 params_(params), | 2541 params_(params), |
| 2682 pool_(pool), | 2542 pool_(pool), |
| 2683 callback_(base::Bind(&ConnectWithinCallback::OnComplete, | 2543 callback_(base::Bind(&ConnectWithinCallback::OnComplete, |
| 2684 base::Unretained(this))) { | 2544 base::Unretained(this))) { |
| 2685 } | 2545 } |
| 2686 | 2546 |
| 2687 ~ConnectWithinCallback() override {} | 2547 ~ConnectWithinCallback() override {} |
| 2688 | 2548 |
| 2689 int WaitForNestedResult() { | 2549 int WaitForNestedResult() { |
| 2690 return nested_callback_.WaitForResult(); | 2550 return nested_callback_.WaitForResult(); |
| 2691 } | 2551 } |
| 2692 | 2552 |
| 2693 const CompletionCallback& callback() const { return callback_; } | 2553 const CompletionCallback& callback() const { return callback_; } |
| 2694 | 2554 |
| 2695 private: | 2555 private: |
| 2696 void OnComplete(int result) { | 2556 void OnComplete(int result) { |
| 2697 SetResult(result); | 2557 SetResult(result); |
| 2698 EXPECT_EQ(ERR_IO_PENDING, | 2558 EXPECT_EQ(ERR_IO_PENDING, |
| 2699 handle_.Init(group_name_, | 2559 handle_.Init(group_name_, params_, DEFAULT_PRIORITY, |
| 2700 params_, | 2560 ClientSocketPool::RespectLimits::ENABLED, |
| 2701 DEFAULT_PRIORITY, | 2561 nested_callback_.callback(), pool_, BoundNetLog())); |
| 2702 nested_callback_.callback(), | |
| 2703 pool_, | |
| 2704 BoundNetLog())); | |
| 2705 } | 2562 } |
| 2706 | 2563 |
| 2707 const std::string group_name_; | 2564 const std::string group_name_; |
| 2708 const scoped_refptr<TestSocketParams> params_; | 2565 const scoped_refptr<TestSocketParams> params_; |
| 2709 TestClientSocketPool* const pool_; | 2566 TestClientSocketPool* const pool_; |
| 2710 ClientSocketHandle handle_; | 2567 ClientSocketHandle handle_; |
| 2711 CompletionCallback callback_; | 2568 CompletionCallback callback_; |
| 2712 TestCompletionCallback nested_callback_; | 2569 TestCompletionCallback nested_callback_; |
| 2713 | 2570 |
| 2714 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback); | 2571 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback); |
| 2715 }; | 2572 }; |
| 2716 | 2573 |
| 2717 TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) { | 2574 TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) { |
| 2718 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2575 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2719 | 2576 |
| 2720 // First job will be waiting until it gets aborted. | 2577 // First job will be waiting until it gets aborted. |
| 2721 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2578 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2722 | 2579 |
| 2723 ClientSocketHandle handle; | 2580 ClientSocketHandle handle; |
| 2724 ConnectWithinCallback callback("a", params_, pool_.get()); | 2581 ConnectWithinCallback callback("a", params_, pool_.get()); |
| 2725 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 2582 EXPECT_EQ(ERR_IO_PENDING, |
| 2726 params_, | 2583 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 2727 DEFAULT_PRIORITY, | 2584 ClientSocketPool::RespectLimits::ENABLED, |
| 2728 callback.callback(), | 2585 callback.callback(), pool_.get(), BoundNetLog())); |
| 2729 pool_.get(), | |
| 2730 BoundNetLog())); | |
| 2731 | 2586 |
| 2732 // Second job will be started during the first callback, and will | 2587 // Second job will be started during the first callback, and will |
| 2733 // asynchronously complete with OK. | 2588 // asynchronously complete with OK. |
| 2734 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2589 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2735 pool_->FlushWithError(ERR_NETWORK_CHANGED); | 2590 pool_->FlushWithError(ERR_NETWORK_CHANGED); |
| 2736 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult()); | 2591 EXPECT_EQ(ERR_NETWORK_CHANGED, callback.WaitForResult()); |
| 2737 EXPECT_EQ(OK, callback.WaitForNestedResult()); | 2592 EXPECT_EQ(OK, callback.WaitForNestedResult()); |
| 2738 } | 2593 } |
| 2739 | 2594 |
| 2740 // Cancel a pending socket request while we're at max sockets, | 2595 // Cancel a pending socket request while we're at max sockets, |
| 2741 // and verify that the backup socket firing doesn't cause a crash. | 2596 // and verify that the backup socket firing doesn't cause a crash. |
| 2742 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) { | 2597 TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) { |
| 2743 // Max 4 sockets globally, max 4 sockets per group. | 2598 // Max 4 sockets globally, max 4 sockets per group. |
| 2744 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 2599 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
| 2745 pool_->EnableConnectBackupJobs(); | 2600 pool_->EnableConnectBackupJobs(); |
| 2746 | 2601 |
| 2747 // Create the first socket and set to ERR_IO_PENDING. This starts the backup | 2602 // Create the first socket and set to ERR_IO_PENDING. This starts the backup |
| 2748 // timer. | 2603 // timer. |
| 2749 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2604 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2750 ClientSocketHandle handle; | 2605 ClientSocketHandle handle; |
| 2751 TestCompletionCallback callback; | 2606 TestCompletionCallback callback; |
| 2752 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", | 2607 EXPECT_EQ(ERR_IO_PENDING, |
| 2753 params_, | 2608 handle.Init("bar", params_, DEFAULT_PRIORITY, |
| 2754 DEFAULT_PRIORITY, | 2609 ClientSocketPool::RespectLimits::ENABLED, |
| 2755 callback.callback(), | 2610 callback.callback(), pool_.get(), BoundNetLog())); |
| 2756 pool_.get(), | |
| 2757 BoundNetLog())); | |
| 2758 | 2611 |
| 2759 // Start (MaxSockets - 1) connected sockets to reach max sockets. | 2612 // Start (MaxSockets - 1) connected sockets to reach max sockets. |
| 2760 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 2613 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 2761 ClientSocketHandle handles[kDefaultMaxSockets]; | 2614 ClientSocketHandle handles[kDefaultMaxSockets]; |
| 2762 for (int i = 1; i < kDefaultMaxSockets; ++i) { | 2615 for (int i = 1; i < kDefaultMaxSockets; ++i) { |
| 2763 TestCompletionCallback callback; | 2616 TestCompletionCallback callback; |
| 2764 EXPECT_EQ(OK, handles[i].Init("bar", | 2617 EXPECT_EQ(OK, |
| 2765 params_, | 2618 handles[i].Init("bar", params_, DEFAULT_PRIORITY, |
| 2766 DEFAULT_PRIORITY, | 2619 ClientSocketPool::RespectLimits::ENABLED, |
| 2767 callback.callback(), | 2620 callback.callback(), pool_.get(), BoundNetLog())); |
| 2768 pool_.get(), | |
| 2769 BoundNetLog())); | |
| 2770 } | 2621 } |
| 2771 | 2622 |
| 2772 base::MessageLoop::current()->RunUntilIdle(); | 2623 base::MessageLoop::current()->RunUntilIdle(); |
| 2773 | 2624 |
| 2774 // Cancel the pending request. | 2625 // Cancel the pending request. |
| 2775 handle.Reset(); | 2626 handle.Reset(); |
| 2776 | 2627 |
| 2777 // Wait for the backup timer to fire (add some slop to ensure it fires) | 2628 // Wait for the backup timer to fire (add some slop to ensure it fires) |
| 2778 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 2629 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
| 2779 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); | 2630 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); |
| 2780 | 2631 |
| 2781 base::MessageLoop::current()->RunUntilIdle(); | 2632 base::MessageLoop::current()->RunUntilIdle(); |
| 2782 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); | 2633 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); |
| 2783 } | 2634 } |
| 2784 | 2635 |
| 2785 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) { | 2636 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) { |
| 2786 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 2637 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
| 2787 pool_->EnableConnectBackupJobs(); | 2638 pool_->EnableConnectBackupJobs(); |
| 2788 | 2639 |
| 2789 // Create the first socket and set to ERR_IO_PENDING. This starts the backup | 2640 // Create the first socket and set to ERR_IO_PENDING. This starts the backup |
| 2790 // timer. | 2641 // timer. |
| 2791 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2642 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2792 ClientSocketHandle handle; | 2643 ClientSocketHandle handle; |
| 2793 TestCompletionCallback callback; | 2644 TestCompletionCallback callback; |
| 2794 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", | 2645 EXPECT_EQ(ERR_IO_PENDING, |
| 2795 params_, | 2646 handle.Init("bar", params_, DEFAULT_PRIORITY, |
| 2796 DEFAULT_PRIORITY, | 2647 ClientSocketPool::RespectLimits::ENABLED, |
| 2797 callback.callback(), | 2648 callback.callback(), pool_.get(), BoundNetLog())); |
| 2798 pool_.get(), | |
| 2799 BoundNetLog())); | |
| 2800 ASSERT_TRUE(pool_->HasGroup("bar")); | 2649 ASSERT_TRUE(pool_->HasGroup("bar")); |
| 2801 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); | 2650 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); |
| 2802 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar")); | 2651 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar")); |
| 2803 | 2652 |
| 2804 // Cancel the socket request. This should cancel the backup timer. Wait for | 2653 // Cancel the socket request. This should cancel the backup timer. Wait for |
| 2805 // the backup time to see if it indeed got canceled. | 2654 // the backup time to see if it indeed got canceled. |
| 2806 handle.Reset(); | 2655 handle.Reset(); |
| 2807 // Wait for the backup timer to fire (add some slop to ensure it fires) | 2656 // Wait for the backup timer to fire (add some slop to ensure it fires) |
| 2808 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 2657 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
| 2809 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); | 2658 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); |
| 2810 base::MessageLoop::current()->RunUntilIdle(); | 2659 base::MessageLoop::current()->RunUntilIdle(); |
| 2811 ASSERT_TRUE(pool_->HasGroup("bar")); | 2660 ASSERT_TRUE(pool_->HasGroup("bar")); |
| 2812 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); | 2661 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); |
| 2813 } | 2662 } |
| 2814 | 2663 |
| 2815 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) { | 2664 TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) { |
| 2816 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 2665 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
| 2817 pool_->EnableConnectBackupJobs(); | 2666 pool_->EnableConnectBackupJobs(); |
| 2818 | 2667 |
| 2819 // Create the first socket and set to ERR_IO_PENDING. This starts the backup | 2668 // Create the first socket and set to ERR_IO_PENDING. This starts the backup |
| 2820 // timer. | 2669 // timer. |
| 2821 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2670 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2822 ClientSocketHandle handle; | 2671 ClientSocketHandle handle; |
| 2823 TestCompletionCallback callback; | 2672 TestCompletionCallback callback; |
| 2824 EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", | 2673 EXPECT_EQ(ERR_IO_PENDING, |
| 2825 params_, | 2674 handle.Init("bar", params_, DEFAULT_PRIORITY, |
| 2826 DEFAULT_PRIORITY, | 2675 ClientSocketPool::RespectLimits::ENABLED, |
| 2827 callback.callback(), | 2676 callback.callback(), pool_.get(), BoundNetLog())); |
| 2828 pool_.get(), | |
| 2829 BoundNetLog())); | |
| 2830 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2677 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2831 ClientSocketHandle handle2; | 2678 ClientSocketHandle handle2; |
| 2832 TestCompletionCallback callback2; | 2679 TestCompletionCallback callback2; |
| 2833 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("bar", | 2680 EXPECT_EQ(ERR_IO_PENDING, |
| 2834 params_, | 2681 handle2.Init("bar", params_, DEFAULT_PRIORITY, |
| 2835 DEFAULT_PRIORITY, | 2682 ClientSocketPool::RespectLimits::ENABLED, |
| 2836 callback2.callback(), | 2683 callback2.callback(), pool_.get(), BoundNetLog())); |
| 2837 pool_.get(), | |
| 2838 BoundNetLog())); | |
| 2839 ASSERT_TRUE(pool_->HasGroup("bar")); | 2684 ASSERT_TRUE(pool_->HasGroup("bar")); |
| 2840 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); | 2685 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); |
| 2841 | 2686 |
| 2842 // Cancel request 1 and then complete request 2. With the requests finished, | 2687 // Cancel request 1 and then complete request 2. With the requests finished, |
| 2843 // the backup timer should be cancelled. | 2688 // the backup timer should be cancelled. |
| 2844 handle.Reset(); | 2689 handle.Reset(); |
| 2845 EXPECT_EQ(OK, callback2.WaitForResult()); | 2690 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 2846 // Wait for the backup timer to fire (add some slop to ensure it fires) | 2691 // Wait for the backup timer to fire (add some slop to ensure it fires) |
| 2847 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( | 2692 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( |
| 2848 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); | 2693 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3)); |
| 2849 base::MessageLoop::current()->RunUntilIdle(); | 2694 base::MessageLoop::current()->RunUntilIdle(); |
| 2850 } | 2695 } |
| 2851 | 2696 |
| 2852 // Test delayed socket binding for the case where we have two connects, | 2697 // Test delayed socket binding for the case where we have two connects, |
| 2853 // and while one is waiting on a connect, the other frees up. | 2698 // and while one is waiting on a connect, the other frees up. |
| 2854 // The socket waiting on a connect should switch immediately to the freed | 2699 // The socket waiting on a connect should switch immediately to the freed |
| 2855 // up socket. | 2700 // up socket. |
| 2856 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) { | 2701 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) { |
| 2857 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2702 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2858 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2703 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2859 | 2704 |
| 2860 ClientSocketHandle handle1; | 2705 ClientSocketHandle handle1; |
| 2861 TestCompletionCallback callback; | 2706 TestCompletionCallback callback; |
| 2862 EXPECT_EQ(ERR_IO_PENDING, | 2707 EXPECT_EQ(ERR_IO_PENDING, |
| 2863 handle1.Init("a", | 2708 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 2864 params_, | 2709 ClientSocketPool::RespectLimits::ENABLED, |
| 2865 DEFAULT_PRIORITY, | 2710 callback.callback(), pool_.get(), BoundNetLog())); |
| 2866 callback.callback(), | |
| 2867 pool_.get(), | |
| 2868 BoundNetLog())); | |
| 2869 EXPECT_EQ(OK, callback.WaitForResult()); | 2711 EXPECT_EQ(OK, callback.WaitForResult()); |
| 2870 | 2712 |
| 2871 // No idle sockets, no pending jobs. | 2713 // No idle sockets, no pending jobs. |
| 2872 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2714 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2873 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2715 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2874 | 2716 |
| 2875 // Create a second socket to the same host, but this one will wait. | 2717 // Create a second socket to the same host, but this one will wait. |
| 2876 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2718 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2877 ClientSocketHandle handle2; | 2719 ClientSocketHandle handle2; |
| 2878 EXPECT_EQ(ERR_IO_PENDING, | 2720 EXPECT_EQ(ERR_IO_PENDING, |
| 2879 handle2.Init("a", | 2721 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 2880 params_, | 2722 ClientSocketPool::RespectLimits::ENABLED, |
| 2881 DEFAULT_PRIORITY, | 2723 callback.callback(), pool_.get(), BoundNetLog())); |
| 2882 callback.callback(), | |
| 2883 pool_.get(), | |
| 2884 BoundNetLog())); | |
| 2885 // No idle sockets, and one connecting job. | 2724 // No idle sockets, and one connecting job. |
| 2886 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2725 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2887 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2726 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2888 | 2727 |
| 2889 // Return the first handle to the pool. This will initiate the delayed | 2728 // Return the first handle to the pool. This will initiate the delayed |
| 2890 // binding. | 2729 // binding. |
| 2891 handle1.Reset(); | 2730 handle1.Reset(); |
| 2892 | 2731 |
| 2893 base::MessageLoop::current()->RunUntilIdle(); | 2732 base::MessageLoop::current()->RunUntilIdle(); |
| 2894 | 2733 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2911 | 2750 |
| 2912 // Test delayed socket binding when a group is at capacity and one | 2751 // Test delayed socket binding when a group is at capacity and one |
| 2913 // of the group's sockets frees up. | 2752 // of the group's sockets frees up. |
| 2914 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) { | 2753 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) { |
| 2915 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2754 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2916 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2755 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2917 | 2756 |
| 2918 ClientSocketHandle handle1; | 2757 ClientSocketHandle handle1; |
| 2919 TestCompletionCallback callback; | 2758 TestCompletionCallback callback; |
| 2920 EXPECT_EQ(ERR_IO_PENDING, | 2759 EXPECT_EQ(ERR_IO_PENDING, |
| 2921 handle1.Init("a", | 2760 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 2922 params_, | 2761 ClientSocketPool::RespectLimits::ENABLED, |
| 2923 DEFAULT_PRIORITY, | 2762 callback.callback(), pool_.get(), BoundNetLog())); |
| 2924 callback.callback(), | |
| 2925 pool_.get(), | |
| 2926 BoundNetLog())); | |
| 2927 EXPECT_EQ(OK, callback.WaitForResult()); | 2763 EXPECT_EQ(OK, callback.WaitForResult()); |
| 2928 | 2764 |
| 2929 // No idle sockets, no pending jobs. | 2765 // No idle sockets, no pending jobs. |
| 2930 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2766 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2931 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2767 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2932 | 2768 |
| 2933 // Create a second socket to the same host, but this one will wait. | 2769 // Create a second socket to the same host, but this one will wait. |
| 2934 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2770 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2935 ClientSocketHandle handle2; | 2771 ClientSocketHandle handle2; |
| 2936 EXPECT_EQ(ERR_IO_PENDING, | 2772 EXPECT_EQ(ERR_IO_PENDING, |
| 2937 handle2.Init("a", | 2773 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 2938 params_, | 2774 ClientSocketPool::RespectLimits::ENABLED, |
| 2939 DEFAULT_PRIORITY, | 2775 callback.callback(), pool_.get(), BoundNetLog())); |
| 2940 callback.callback(), | |
| 2941 pool_.get(), | |
| 2942 BoundNetLog())); | |
| 2943 // No idle sockets, and one connecting job. | 2776 // No idle sockets, and one connecting job. |
| 2944 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2777 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2945 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2778 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 2946 | 2779 |
| 2947 // Return the first handle to the pool. This will initiate the delayed | 2780 // Return the first handle to the pool. This will initiate the delayed |
| 2948 // binding. | 2781 // binding. |
| 2949 handle1.Reset(); | 2782 handle1.Reset(); |
| 2950 | 2783 |
| 2951 base::MessageLoop::current()->RunUntilIdle(); | 2784 base::MessageLoop::current()->RunUntilIdle(); |
| 2952 | 2785 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2971 // connecting, when the first socket finishes and goes idle. | 2804 // connecting, when the first socket finishes and goes idle. |
| 2972 // Although the second connection is pending, the second request | 2805 // Although the second connection is pending, the second request |
| 2973 // should complete, by taking the first socket's idle socket. | 2806 // should complete, by taking the first socket's idle socket. |
| 2974 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) { | 2807 TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) { |
| 2975 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2808 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 2976 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2809 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 2977 | 2810 |
| 2978 ClientSocketHandle handle1; | 2811 ClientSocketHandle handle1; |
| 2979 TestCompletionCallback callback; | 2812 TestCompletionCallback callback; |
| 2980 EXPECT_EQ(ERR_IO_PENDING, | 2813 EXPECT_EQ(ERR_IO_PENDING, |
| 2981 handle1.Init("a", | 2814 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 2982 params_, | 2815 ClientSocketPool::RespectLimits::ENABLED, |
| 2983 DEFAULT_PRIORITY, | 2816 callback.callback(), pool_.get(), BoundNetLog())); |
| 2984 callback.callback(), | |
| 2985 pool_.get(), | |
| 2986 BoundNetLog())); | |
| 2987 EXPECT_EQ(OK, callback.WaitForResult()); | 2817 EXPECT_EQ(OK, callback.WaitForResult()); |
| 2988 | 2818 |
| 2989 // No idle sockets, no pending jobs. | 2819 // No idle sockets, no pending jobs. |
| 2990 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2820 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 2991 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2821 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 2992 | 2822 |
| 2993 // Create a second socket to the same host, but this one will wait. | 2823 // Create a second socket to the same host, but this one will wait. |
| 2994 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); | 2824 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); |
| 2995 ClientSocketHandle handle2; | 2825 ClientSocketHandle handle2; |
| 2996 EXPECT_EQ(ERR_IO_PENDING, | 2826 EXPECT_EQ(ERR_IO_PENDING, |
| 2997 handle2.Init("a", | 2827 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 2998 params_, | 2828 ClientSocketPool::RespectLimits::ENABLED, |
| 2999 DEFAULT_PRIORITY, | 2829 callback.callback(), pool_.get(), BoundNetLog())); |
| 3000 callback.callback(), | |
| 3001 pool_.get(), | |
| 3002 BoundNetLog())); | |
| 3003 // No idle sockets, and one connecting job. | 2830 // No idle sockets, and one connecting job. |
| 3004 EXPECT_EQ(0, pool_->IdleSocketCount()); | 2831 EXPECT_EQ(0, pool_->IdleSocketCount()); |
| 3005 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2832 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3006 | 2833 |
| 3007 // Return the first handle to the pool. This will initiate the delayed | 2834 // Return the first handle to the pool. This will initiate the delayed |
| 3008 // binding. | 2835 // binding. |
| 3009 handle1.Reset(); | 2836 handle1.Reset(); |
| 3010 | 2837 |
| 3011 base::MessageLoop::current()->RunUntilIdle(); | 2838 base::MessageLoop::current()->RunUntilIdle(); |
| 3012 | 2839 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3034 const int kOneSocketPerGroup = 1; | 2861 const int kOneSocketPerGroup = 1; |
| 3035 CreatePool(kUnlimitedSockets, kOneSocketPerGroup); | 2862 CreatePool(kUnlimitedSockets, kOneSocketPerGroup); |
| 3036 | 2863 |
| 3037 // Make the first request asynchronous fail. | 2864 // Make the first request asynchronous fail. |
| 3038 // This will free up a socket slot later. | 2865 // This will free up a socket slot later. |
| 3039 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); | 2866 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob); |
| 3040 | 2867 |
| 3041 ClientSocketHandle handle1; | 2868 ClientSocketHandle handle1; |
| 3042 TestCompletionCallback callback1; | 2869 TestCompletionCallback callback1; |
| 3043 EXPECT_EQ(ERR_IO_PENDING, | 2870 EXPECT_EQ(ERR_IO_PENDING, |
| 3044 handle1.Init("a", | 2871 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3045 params_, | 2872 ClientSocketPool::RespectLimits::ENABLED, |
| 3046 DEFAULT_PRIORITY, | 2873 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3047 callback1.callback(), | |
| 3048 pool_.get(), | |
| 3049 BoundNetLog())); | |
| 3050 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2874 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3051 | 2875 |
| 3052 // Make the second request synchronously fail. This should make the Group | 2876 // Make the second request synchronously fail. This should make the Group |
| 3053 // empty. | 2877 // empty. |
| 3054 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); | 2878 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); |
| 3055 ClientSocketHandle handle2; | 2879 ClientSocketHandle handle2; |
| 3056 TestCompletionCallback callback2; | 2880 TestCompletionCallback callback2; |
| 3057 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail | 2881 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail |
| 3058 // when created. | 2882 // when created. |
| 3059 EXPECT_EQ(ERR_IO_PENDING, | 2883 EXPECT_EQ(ERR_IO_PENDING, |
| 3060 handle2.Init("a", | 2884 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 3061 params_, | 2885 ClientSocketPool::RespectLimits::ENABLED, |
| 3062 DEFAULT_PRIORITY, | 2886 callback2.callback(), pool_.get(), BoundNetLog())); |
| 3063 callback2.callback(), | |
| 3064 pool_.get(), | |
| 3065 BoundNetLog())); | |
| 3066 | 2887 |
| 3067 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2888 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3068 | 2889 |
| 3069 EXPECT_EQ(ERR_CONNECTION_FAILED, callback1.WaitForResult()); | 2890 EXPECT_EQ(ERR_CONNECTION_FAILED, callback1.WaitForResult()); |
| 3070 EXPECT_EQ(ERR_CONNECTION_FAILED, callback2.WaitForResult()); | 2891 EXPECT_EQ(ERR_CONNECTION_FAILED, callback2.WaitForResult()); |
| 3071 EXPECT_FALSE(pool_->HasGroup("a")); | 2892 EXPECT_FALSE(pool_->HasGroup("a")); |
| 3072 } | 2893 } |
| 3073 | 2894 |
| 3074 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) { | 2895 TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) { |
| 3075 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); | 2896 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets); |
| 3076 | 2897 |
| 3077 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2898 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3078 | 2899 |
| 3079 ClientSocketHandle handle1; | 2900 ClientSocketHandle handle1; |
| 3080 TestCompletionCallback callback1; | 2901 TestCompletionCallback callback1; |
| 3081 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 2902 EXPECT_EQ(ERR_IO_PENDING, |
| 3082 params_, | 2903 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3083 DEFAULT_PRIORITY, | 2904 ClientSocketPool::RespectLimits::ENABLED, |
| 3084 callback1.callback(), | 2905 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3085 pool_.get(), | |
| 3086 BoundNetLog())); | |
| 3087 | 2906 |
| 3088 ClientSocketHandle handle2; | 2907 ClientSocketHandle handle2; |
| 3089 TestCompletionCallback callback2; | 2908 TestCompletionCallback callback2; |
| 3090 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", | 2909 EXPECT_EQ(ERR_IO_PENDING, |
| 3091 params_, | 2910 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 3092 DEFAULT_PRIORITY, | 2911 ClientSocketPool::RespectLimits::ENABLED, |
| 3093 callback2.callback(), | 2912 callback2.callback(), pool_.get(), BoundNetLog())); |
| 3094 pool_.get(), | |
| 3095 BoundNetLog())); | |
| 3096 ClientSocketHandle handle3; | 2913 ClientSocketHandle handle3; |
| 3097 TestCompletionCallback callback3; | 2914 TestCompletionCallback callback3; |
| 3098 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", | 2915 EXPECT_EQ(ERR_IO_PENDING, |
| 3099 params_, | 2916 handle3.Init("a", params_, DEFAULT_PRIORITY, |
| 3100 DEFAULT_PRIORITY, | 2917 ClientSocketPool::RespectLimits::ENABLED, |
| 3101 callback3.callback(), | 2918 callback3.callback(), pool_.get(), BoundNetLog())); |
| 3102 pool_.get(), | |
| 3103 BoundNetLog())); | |
| 3104 | 2919 |
| 3105 EXPECT_EQ(OK, callback1.WaitForResult()); | 2920 EXPECT_EQ(OK, callback1.WaitForResult()); |
| 3106 EXPECT_EQ(OK, callback2.WaitForResult()); | 2921 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 3107 EXPECT_EQ(OK, callback3.WaitForResult()); | 2922 EXPECT_EQ(OK, callback3.WaitForResult()); |
| 3108 | 2923 |
| 3109 // Use the socket. | 2924 // Use the socket. |
| 3110 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback())); | 2925 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback())); |
| 3111 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback())); | 2926 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback())); |
| 3112 | 2927 |
| 3113 handle1.Reset(); | 2928 handle1.Reset(); |
| 3114 handle2.Reset(); | 2929 handle2.Reset(); |
| 3115 handle3.Reset(); | 2930 handle3.Reset(); |
| 3116 | 2931 |
| 3117 EXPECT_EQ(OK, handle1.Init("a", | 2932 EXPECT_EQ(OK, handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3118 params_, | 2933 ClientSocketPool::RespectLimits::ENABLED, |
| 3119 DEFAULT_PRIORITY, | 2934 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3120 callback1.callback(), | 2935 EXPECT_EQ(OK, handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 3121 pool_.get(), | 2936 ClientSocketPool::RespectLimits::ENABLED, |
| 3122 BoundNetLog())); | 2937 callback2.callback(), pool_.get(), BoundNetLog())); |
| 3123 EXPECT_EQ(OK, handle2.Init("a", | 2938 EXPECT_EQ(OK, handle3.Init("a", params_, DEFAULT_PRIORITY, |
| 3124 params_, | 2939 ClientSocketPool::RespectLimits::ENABLED, |
| 3125 DEFAULT_PRIORITY, | 2940 callback3.callback(), pool_.get(), BoundNetLog())); |
| 3126 callback2.callback(), | |
| 3127 pool_.get(), | |
| 3128 BoundNetLog())); | |
| 3129 EXPECT_EQ(OK, handle3.Init("a", | |
| 3130 params_, | |
| 3131 DEFAULT_PRIORITY, | |
| 3132 callback3.callback(), | |
| 3133 pool_.get(), | |
| 3134 BoundNetLog())); | |
| 3135 | 2941 |
| 3136 EXPECT_TRUE(handle1.socket()->WasEverUsed()); | 2942 EXPECT_TRUE(handle1.socket()->WasEverUsed()); |
| 3137 EXPECT_TRUE(handle2.socket()->WasEverUsed()); | 2943 EXPECT_TRUE(handle2.socket()->WasEverUsed()); |
| 3138 EXPECT_FALSE(handle3.socket()->WasEverUsed()); | 2944 EXPECT_FALSE(handle3.socket()->WasEverUsed()); |
| 3139 } | 2945 } |
| 3140 | 2946 |
| 3141 TEST_F(ClientSocketPoolBaseTest, RequestSockets) { | 2947 TEST_F(ClientSocketPoolBaseTest, RequestSockets) { |
| 3142 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2948 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 3143 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2949 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3144 | 2950 |
| 3145 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 2951 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
| 3146 | 2952 |
| 3147 ASSERT_TRUE(pool_->HasGroup("a")); | 2953 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3148 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 2954 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
| 3149 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); | 2955 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3150 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2956 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3151 | 2957 |
| 3152 ClientSocketHandle handle1; | 2958 ClientSocketHandle handle1; |
| 3153 TestCompletionCallback callback1; | 2959 TestCompletionCallback callback1; |
| 3154 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 2960 EXPECT_EQ(ERR_IO_PENDING, |
| 3155 params_, | 2961 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3156 DEFAULT_PRIORITY, | 2962 ClientSocketPool::RespectLimits::ENABLED, |
| 3157 callback1.callback(), | 2963 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3158 pool_.get(), | |
| 3159 BoundNetLog())); | |
| 3160 | 2964 |
| 3161 ClientSocketHandle handle2; | 2965 ClientSocketHandle handle2; |
| 3162 TestCompletionCallback callback2; | 2966 TestCompletionCallback callback2; |
| 3163 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", | 2967 EXPECT_EQ(ERR_IO_PENDING, |
| 3164 params_, | 2968 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 3165 DEFAULT_PRIORITY, | 2969 ClientSocketPool::RespectLimits::ENABLED, |
| 3166 callback2.callback(), | 2970 callback2.callback(), pool_.get(), BoundNetLog())); |
| 3167 pool_.get(), | |
| 3168 BoundNetLog())); | |
| 3169 | 2971 |
| 3170 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 2972 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
| 3171 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 2973 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3172 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 2974 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3173 | 2975 |
| 3174 EXPECT_EQ(OK, callback1.WaitForResult()); | 2976 EXPECT_EQ(OK, callback1.WaitForResult()); |
| 3175 EXPECT_EQ(OK, callback2.WaitForResult()); | 2977 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 3176 handle1.Reset(); | 2978 handle1.Reset(); |
| 3177 handle2.Reset(); | 2979 handle2.Reset(); |
| 3178 | 2980 |
| 3179 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 2981 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3180 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 2982 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3181 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); | 2983 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); |
| 3182 } | 2984 } |
| 3183 | 2985 |
| 3184 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { | 2986 TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) { |
| 3185 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 2987 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 3186 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 2988 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3187 | 2989 |
| 3188 ClientSocketHandle handle1; | 2990 ClientSocketHandle handle1; |
| 3189 TestCompletionCallback callback1; | 2991 TestCompletionCallback callback1; |
| 3190 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 2992 EXPECT_EQ(ERR_IO_PENDING, |
| 3191 params_, | 2993 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3192 DEFAULT_PRIORITY, | 2994 ClientSocketPool::RespectLimits::ENABLED, |
| 3193 callback1.callback(), | 2995 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3194 pool_.get(), | |
| 3195 BoundNetLog())); | |
| 3196 | 2996 |
| 3197 ASSERT_TRUE(pool_->HasGroup("a")); | 2997 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3198 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 2998 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3199 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 2999 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3200 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3000 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3201 | 3001 |
| 3202 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3002 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
| 3203 | 3003 |
| 3204 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 3004 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
| 3205 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); | 3005 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3206 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3006 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3207 | 3007 |
| 3208 ClientSocketHandle handle2; | 3008 ClientSocketHandle handle2; |
| 3209 TestCompletionCallback callback2; | 3009 TestCompletionCallback callback2; |
| 3210 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", | 3010 EXPECT_EQ(ERR_IO_PENDING, |
| 3211 params_, | 3011 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 3212 DEFAULT_PRIORITY, | 3012 ClientSocketPool::RespectLimits::ENABLED, |
| 3213 callback2.callback(), | 3013 callback2.callback(), pool_.get(), BoundNetLog())); |
| 3214 pool_.get(), | |
| 3215 BoundNetLog())); | |
| 3216 | 3014 |
| 3217 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 3015 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
| 3218 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3016 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3219 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3017 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3220 | 3018 |
| 3221 EXPECT_EQ(OK, callback1.WaitForResult()); | 3019 EXPECT_EQ(OK, callback1.WaitForResult()); |
| 3222 EXPECT_EQ(OK, callback2.WaitForResult()); | 3020 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 3223 handle1.Reset(); | 3021 handle1.Reset(); |
| 3224 handle2.Reset(); | 3022 handle2.Reset(); |
| 3225 | 3023 |
| 3226 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3024 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3227 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3025 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3228 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); | 3026 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a")); |
| 3229 } | 3027 } |
| 3230 | 3028 |
| 3231 TEST_F(ClientSocketPoolBaseTest, | 3029 TEST_F(ClientSocketPoolBaseTest, |
| 3232 RequestSocketsWhenAlreadyHaveMultipleConnectJob) { | 3030 RequestSocketsWhenAlreadyHaveMultipleConnectJob) { |
| 3233 CreatePool(4, 4); | 3031 CreatePool(4, 4); |
| 3234 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3032 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3235 | 3033 |
| 3236 ClientSocketHandle handle1; | 3034 ClientSocketHandle handle1; |
| 3237 TestCompletionCallback callback1; | 3035 TestCompletionCallback callback1; |
| 3238 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3036 EXPECT_EQ(ERR_IO_PENDING, |
| 3239 params_, | 3037 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3240 DEFAULT_PRIORITY, | 3038 ClientSocketPool::RespectLimits::ENABLED, |
| 3241 callback1.callback(), | 3039 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3242 pool_.get(), | |
| 3243 BoundNetLog())); | |
| 3244 | 3040 |
| 3245 ClientSocketHandle handle2; | 3041 ClientSocketHandle handle2; |
| 3246 TestCompletionCallback callback2; | 3042 TestCompletionCallback callback2; |
| 3247 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", | 3043 EXPECT_EQ(ERR_IO_PENDING, |
| 3248 params_, | 3044 handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 3249 DEFAULT_PRIORITY, | 3045 ClientSocketPool::RespectLimits::ENABLED, |
| 3250 callback2.callback(), | 3046 callback2.callback(), pool_.get(), BoundNetLog())); |
| 3251 pool_.get(), | |
| 3252 BoundNetLog())); | |
| 3253 | 3047 |
| 3254 ClientSocketHandle handle3; | 3048 ClientSocketHandle handle3; |
| 3255 TestCompletionCallback callback3; | 3049 TestCompletionCallback callback3; |
| 3256 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", | 3050 EXPECT_EQ(ERR_IO_PENDING, |
| 3257 params_, | 3051 handle3.Init("a", params_, DEFAULT_PRIORITY, |
| 3258 DEFAULT_PRIORITY, | 3052 ClientSocketPool::RespectLimits::ENABLED, |
| 3259 callback3.callback(), | 3053 callback3.callback(), pool_.get(), BoundNetLog())); |
| 3260 pool_.get(), | |
| 3261 BoundNetLog())); | |
| 3262 | 3054 |
| 3263 ASSERT_TRUE(pool_->HasGroup("a")); | 3055 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3264 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); | 3056 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); |
| 3265 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3057 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3266 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3058 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3267 | 3059 |
| 3268 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3060 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
| 3269 | 3061 |
| 3270 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); | 3062 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); |
| 3271 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3063 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3328 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b")); | 3120 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b")); |
| 3329 EXPECT_FALSE(pool_->IsStalled()); | 3121 EXPECT_FALSE(pool_->IsStalled()); |
| 3330 } | 3122 } |
| 3331 | 3123 |
| 3332 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { | 3124 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) { |
| 3333 CreatePool(4, 4); | 3125 CreatePool(4, 4); |
| 3334 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3126 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3335 | 3127 |
| 3336 ClientSocketHandle handle1; | 3128 ClientSocketHandle handle1; |
| 3337 TestCompletionCallback callback1; | 3129 TestCompletionCallback callback1; |
| 3338 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3130 EXPECT_EQ(ERR_IO_PENDING, |
| 3339 params_, | 3131 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3340 DEFAULT_PRIORITY, | 3132 ClientSocketPool::RespectLimits::ENABLED, |
| 3341 callback1.callback(), | 3133 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3342 pool_.get(), | |
| 3343 BoundNetLog())); | |
| 3344 ASSERT_EQ(OK, callback1.WaitForResult()); | 3134 ASSERT_EQ(OK, callback1.WaitForResult()); |
| 3345 handle1.Reset(); | 3135 handle1.Reset(); |
| 3346 | 3136 |
| 3347 ASSERT_TRUE(pool_->HasGroup("a")); | 3137 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3348 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3138 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3349 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3139 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3350 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3140 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
| 3351 | 3141 |
| 3352 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3142 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
| 3353 | 3143 |
| 3354 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3144 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3355 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); | 3145 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3356 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3146 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
| 3357 } | 3147 } |
| 3358 | 3148 |
| 3359 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { | 3149 TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) { |
| 3360 CreatePool(4, 4); | 3150 CreatePool(4, 4); |
| 3361 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3151 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3362 | 3152 |
| 3363 ClientSocketHandle handle1; | 3153 ClientSocketHandle handle1; |
| 3364 TestCompletionCallback callback1; | 3154 TestCompletionCallback callback1; |
| 3365 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3155 EXPECT_EQ(ERR_IO_PENDING, |
| 3366 params_, | 3156 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3367 DEFAULT_PRIORITY, | 3157 ClientSocketPool::RespectLimits::ENABLED, |
| 3368 callback1.callback(), | 3158 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3369 pool_.get(), | |
| 3370 BoundNetLog())); | |
| 3371 ASSERT_EQ(OK, callback1.WaitForResult()); | 3159 ASSERT_EQ(OK, callback1.WaitForResult()); |
| 3372 | 3160 |
| 3373 ASSERT_TRUE(pool_->HasGroup("a")); | 3161 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3374 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3162 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3375 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3163 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3376 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3164 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3377 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); | 3165 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a")); |
| 3378 | 3166 |
| 3379 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3167 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
| 3380 | 3168 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3432 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); | 3220 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3433 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3221 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3434 | 3222 |
| 3435 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); | 3223 pool_->RequestSockets("a", ¶ms_, 2, BoundNetLog()); |
| 3436 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); | 3224 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); |
| 3437 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); | 3225 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3438 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3226 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3439 | 3227 |
| 3440 ClientSocketHandle handle1; | 3228 ClientSocketHandle handle1; |
| 3441 TestCompletionCallback callback1; | 3229 TestCompletionCallback callback1; |
| 3442 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3230 EXPECT_EQ(ERR_IO_PENDING, |
| 3443 params_, | 3231 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3444 DEFAULT_PRIORITY, | 3232 ClientSocketPool::RespectLimits::ENABLED, |
| 3445 callback1.callback(), | 3233 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3446 pool_.get(), | |
| 3447 BoundNetLog())); | |
| 3448 ASSERT_EQ(OK, callback1.WaitForResult()); | 3234 ASSERT_EQ(OK, callback1.WaitForResult()); |
| 3449 | 3235 |
| 3450 ClientSocketHandle handle2; | 3236 ClientSocketHandle handle2; |
| 3451 TestCompletionCallback callback2; | 3237 TestCompletionCallback callback2; |
| 3452 int rv = handle2.Init("a", | 3238 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY, |
| 3453 params_, | 3239 ClientSocketPool::RespectLimits::ENABLED, |
| 3454 DEFAULT_PRIORITY, | 3240 callback2.callback(), pool_.get(), BoundNetLog()); |
| 3455 callback2.callback(), | |
| 3456 pool_.get(), | |
| 3457 BoundNetLog()); | |
| 3458 if (rv != OK) { | 3241 if (rv != OK) { |
| 3459 EXPECT_EQ(ERR_IO_PENDING, rv); | 3242 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 3460 EXPECT_EQ(OK, callback2.WaitForResult()); | 3243 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 3461 } | 3244 } |
| 3462 | 3245 |
| 3463 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3246 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3464 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3247 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3465 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a")); | 3248 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a")); |
| 3466 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3249 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3467 | 3250 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3511 | 3294 |
| 3512 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); | 3295 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); |
| 3513 | 3296 |
| 3514 ASSERT_TRUE(pool_->HasGroup("a")); | 3297 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3515 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3298 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3516 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); | 3299 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3517 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3300 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3518 | 3301 |
| 3519 ClientSocketHandle handle1; | 3302 ClientSocketHandle handle1; |
| 3520 TestCompletionCallback callback1; | 3303 TestCompletionCallback callback1; |
| 3521 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3304 EXPECT_EQ(ERR_IO_PENDING, |
| 3522 params_, | 3305 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3523 DEFAULT_PRIORITY, | 3306 ClientSocketPool::RespectLimits::ENABLED, |
| 3524 callback1.callback(), | 3307 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3525 pool_.get(), | |
| 3526 BoundNetLog())); | |
| 3527 | 3308 |
| 3528 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3309 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3529 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3310 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3530 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3311 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3531 | 3312 |
| 3532 ASSERT_EQ(OK, callback1.WaitForResult()); | 3313 ASSERT_EQ(OK, callback1.WaitForResult()); |
| 3533 | 3314 |
| 3534 // Make sure if a preconnected socket is not fully connected when a request | 3315 // Make sure if a preconnected socket is not fully connected when a request |
| 3535 // starts, it has a connect start time. | 3316 // starts, it has a connect start time. |
| 3536 TestLoadTimingInfoConnectedNotReused(handle1); | 3317 TestLoadTimingInfoConnectedNotReused(handle1); |
| 3537 handle1.Reset(); | 3318 handle1.Reset(); |
| 3538 | 3319 |
| 3539 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3320 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
| 3540 } | 3321 } |
| 3541 | 3322 |
| 3542 // Checks that fully connected preconnect jobs have no connect times, and are | 3323 // Checks that fully connected preconnect jobs have no connect times, and are |
| 3543 // marked as reused. | 3324 // marked as reused. |
| 3544 TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) { | 3325 TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) { |
| 3545 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); | 3326 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup); |
| 3546 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3327 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 3547 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); | 3328 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); |
| 3548 | 3329 |
| 3549 ASSERT_TRUE(pool_->HasGroup("a")); | 3330 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3550 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3331 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3551 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3332 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3552 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3333 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
| 3553 | 3334 |
| 3554 ClientSocketHandle handle; | 3335 ClientSocketHandle handle; |
| 3555 TestCompletionCallback callback; | 3336 TestCompletionCallback callback; |
| 3556 EXPECT_EQ(OK, handle.Init("a", | 3337 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, |
| 3557 params_, | 3338 ClientSocketPool::RespectLimits::ENABLED, |
| 3558 DEFAULT_PRIORITY, | 3339 callback.callback(), pool_.get(), BoundNetLog())); |
| 3559 callback.callback(), | |
| 3560 pool_.get(), | |
| 3561 BoundNetLog())); | |
| 3562 | 3340 |
| 3563 // Make sure the idle socket was used. | 3341 // Make sure the idle socket was used. |
| 3564 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3342 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3565 | 3343 |
| 3566 TestLoadTimingInfoConnectedReused(handle); | 3344 TestLoadTimingInfoConnectedReused(handle); |
| 3567 handle.Reset(); | 3345 handle.Reset(); |
| 3568 TestLoadTimingInfoNotConnected(handle); | 3346 TestLoadTimingInfoNotConnected(handle); |
| 3569 } | 3347 } |
| 3570 | 3348 |
| 3571 // http://crbug.com/64940 regression test. | 3349 // http://crbug.com/64940 regression test. |
| 3572 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { | 3350 TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) { |
| 3573 const int kMaxTotalSockets = 3; | 3351 const int kMaxTotalSockets = 3; |
| 3574 const int kMaxSocketsPerGroup = 2; | 3352 const int kMaxSocketsPerGroup = 2; |
| 3575 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup); | 3353 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup); |
| 3576 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3354 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3577 | 3355 |
| 3578 // Note that group name ordering matters here. "a" comes before "b", so | 3356 // Note that group name ordering matters here. "a" comes before "b", so |
| 3579 // CloseOneIdleSocket() will try to close "a"'s idle socket. | 3357 // CloseOneIdleSocket() will try to close "a"'s idle socket. |
| 3580 | 3358 |
| 3581 // Set up one idle socket in "a". | 3359 // Set up one idle socket in "a". |
| 3582 ClientSocketHandle handle1; | 3360 ClientSocketHandle handle1; |
| 3583 TestCompletionCallback callback1; | 3361 TestCompletionCallback callback1; |
| 3584 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", | 3362 EXPECT_EQ(ERR_IO_PENDING, |
| 3585 params_, | 3363 handle1.Init("a", params_, DEFAULT_PRIORITY, |
| 3586 DEFAULT_PRIORITY, | 3364 ClientSocketPool::RespectLimits::ENABLED, |
| 3587 callback1.callback(), | 3365 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3588 pool_.get(), | |
| 3589 BoundNetLog())); | |
| 3590 | 3366 |
| 3591 ASSERT_EQ(OK, callback1.WaitForResult()); | 3367 ASSERT_EQ(OK, callback1.WaitForResult()); |
| 3592 handle1.Reset(); | 3368 handle1.Reset(); |
| 3593 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3369 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
| 3594 | 3370 |
| 3595 // Set up two active sockets in "b". | 3371 // Set up two active sockets in "b". |
| 3596 ClientSocketHandle handle2; | 3372 ClientSocketHandle handle2; |
| 3597 TestCompletionCallback callback2; | 3373 TestCompletionCallback callback2; |
| 3598 EXPECT_EQ(ERR_IO_PENDING, handle1.Init("b", | 3374 EXPECT_EQ(ERR_IO_PENDING, |
| 3599 params_, | 3375 handle1.Init("b", params_, DEFAULT_PRIORITY, |
| 3600 DEFAULT_PRIORITY, | 3376 ClientSocketPool::RespectLimits::ENABLED, |
| 3601 callback1.callback(), | 3377 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3602 pool_.get(), | 3378 EXPECT_EQ(ERR_IO_PENDING, |
| 3603 BoundNetLog())); | 3379 handle2.Init("b", params_, DEFAULT_PRIORITY, |
| 3604 EXPECT_EQ(ERR_IO_PENDING, handle2.Init("b", | 3380 ClientSocketPool::RespectLimits::ENABLED, |
| 3605 params_, | 3381 callback2.callback(), pool_.get(), BoundNetLog())); |
| 3606 DEFAULT_PRIORITY, | |
| 3607 callback2.callback(), | |
| 3608 pool_.get(), | |
| 3609 BoundNetLog())); | |
| 3610 | 3382 |
| 3611 ASSERT_EQ(OK, callback1.WaitForResult()); | 3383 ASSERT_EQ(OK, callback1.WaitForResult()); |
| 3612 ASSERT_EQ(OK, callback2.WaitForResult()); | 3384 ASSERT_EQ(OK, callback2.WaitForResult()); |
| 3613 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); | 3385 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b")); |
| 3614 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); | 3386 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b")); |
| 3615 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); | 3387 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b")); |
| 3616 | 3388 |
| 3617 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means | 3389 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means |
| 3618 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3. | 3390 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3. |
| 3619 // Requesting 2 preconnected sockets for "a" should fail to allocate any more | 3391 // Requesting 2 preconnected sockets for "a" should fail to allocate any more |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3681 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); | 3453 pool_->RequestSockets("a", ¶ms_, 1, BoundNetLog()); |
| 3682 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3454 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3683 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); | 3455 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3684 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3456 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3685 base::MessageLoop::current()->RunUntilIdle(); | 3457 base::MessageLoop::current()->RunUntilIdle(); |
| 3686 | 3458 |
| 3687 // Make the backup job be a pending job, so it completes normally. | 3459 // Make the backup job be a pending job, so it completes normally. |
| 3688 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3460 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 3689 ClientSocketHandle handle; | 3461 ClientSocketHandle handle; |
| 3690 TestCompletionCallback callback; | 3462 TestCompletionCallback callback; |
| 3691 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 3463 EXPECT_EQ(ERR_IO_PENDING, |
| 3692 params_, | 3464 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 3693 DEFAULT_PRIORITY, | 3465 ClientSocketPool::RespectLimits::ENABLED, |
| 3694 callback.callback(), | 3466 callback.callback(), pool_.get(), BoundNetLog())); |
| 3695 pool_.get(), | |
| 3696 BoundNetLog())); | |
| 3697 // Timer has started, but the backup connect job shouldn't be created yet. | 3467 // Timer has started, but the backup connect job shouldn't be created yet. |
| 3698 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3468 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 3699 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3469 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3700 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3470 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3701 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); | 3471 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a")); |
| 3702 ASSERT_EQ(OK, callback.WaitForResult()); | 3472 ASSERT_EQ(OK, callback.WaitForResult()); |
| 3703 | 3473 |
| 3704 // The hung connect job should still be there, but everything else should be | 3474 // The hung connect job should still be there, but everything else should be |
| 3705 // complete. | 3475 // complete. |
| 3706 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3476 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3720 ASSERT_TRUE(pool_->HasGroup("a")); | 3490 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3721 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3491 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3722 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3492 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3723 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); | 3493 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a")); |
| 3724 | 3494 |
| 3725 // Fail future jobs to be sure that handle receives the preconnected socket | 3495 // Fail future jobs to be sure that handle receives the preconnected socket |
| 3726 // rather than closing it and making a new one. | 3496 // rather than closing it and making a new one. |
| 3727 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); | 3497 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); |
| 3728 ClientSocketHandle handle; | 3498 ClientSocketHandle handle; |
| 3729 TestCompletionCallback callback; | 3499 TestCompletionCallback callback; |
| 3730 EXPECT_EQ(OK, handle.Init("a", | 3500 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, |
| 3731 params_, | 3501 ClientSocketPool::RespectLimits::ENABLED, |
| 3732 DEFAULT_PRIORITY, | 3502 callback.callback(), pool_.get(), BoundNetLog())); |
| 3733 callback.callback(), | |
| 3734 pool_.get(), | |
| 3735 BoundNetLog())); | |
| 3736 | 3503 |
| 3737 ASSERT_TRUE(pool_->HasGroup("a")); | 3504 ASSERT_TRUE(pool_->HasGroup("a")); |
| 3738 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3505 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 3739 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); | 3506 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); |
| 3740 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); | 3507 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); |
| 3741 | 3508 |
| 3742 // Drain the pending read. | 3509 // Drain the pending read. |
| 3743 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback())); | 3510 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback())); |
| 3744 | 3511 |
| 3745 TestLoadTimingInfoConnectedReused(handle); | 3512 TestLoadTimingInfoConnectedReused(handle); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3757 group_name_(group_name), | 3524 group_name_(group_name), |
| 3758 can_release_connection_(true) { | 3525 can_release_connection_(true) { |
| 3759 pool_->AddHigherLayeredPool(this); | 3526 pool_->AddHigherLayeredPool(this); |
| 3760 } | 3527 } |
| 3761 | 3528 |
| 3762 ~MockLayeredPool() { | 3529 ~MockLayeredPool() { |
| 3763 pool_->RemoveHigherLayeredPool(this); | 3530 pool_->RemoveHigherLayeredPool(this); |
| 3764 } | 3531 } |
| 3765 | 3532 |
| 3766 int RequestSocket(TestClientSocketPool* pool) { | 3533 int RequestSocket(TestClientSocketPool* pool) { |
| 3767 scoped_refptr<TestSocketParams> params( | 3534 scoped_refptr<TestSocketParams> params(new TestSocketParams()); |
| 3768 new TestSocketParams(false /* ignore_limits */)); | |
| 3769 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, | 3535 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, |
| 3536 ClientSocketPool::RespectLimits::ENABLED, |
| 3770 callback_.callback(), pool, BoundNetLog()); | 3537 callback_.callback(), pool, BoundNetLog()); |
| 3771 } | 3538 } |
| 3772 | 3539 |
| 3773 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { | 3540 int RequestSocketWithoutLimits(TestClientSocketPool* pool) { |
| 3774 scoped_refptr<TestSocketParams> params( | 3541 scoped_refptr<TestSocketParams> params(new TestSocketParams()); |
| 3775 new TestSocketParams(true /* ignore_limits */)); | |
| 3776 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, | 3542 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, |
| 3543 ClientSocketPool::RespectLimits::DISABLED, |
| 3777 callback_.callback(), pool, BoundNetLog()); | 3544 callback_.callback(), pool, BoundNetLog()); |
| 3778 } | 3545 } |
| 3779 | 3546 |
| 3780 bool ReleaseOneConnection() { | 3547 bool ReleaseOneConnection() { |
| 3781 if (!handle_.is_initialized() || !can_release_connection_) { | 3548 if (!handle_.is_initialized() || !can_release_connection_) { |
| 3782 return false; | 3549 return false; |
| 3783 } | 3550 } |
| 3784 handle_.socket()->Disconnect(); | 3551 handle_.socket()->Disconnect(); |
| 3785 handle_.Reset(); | 3552 handle_.Reset(); |
| 3786 return true; | 3553 return true; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3829 CreatePool(1, 1); | 3596 CreatePool(1, 1); |
| 3830 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3597 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 3831 | 3598 |
| 3832 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); | 3599 MockLayeredPool mock_layered_pool(pool_.get(), "foo"); |
| 3833 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3600 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
| 3834 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3601 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
| 3835 .WillOnce(Invoke(&mock_layered_pool, | 3602 .WillOnce(Invoke(&mock_layered_pool, |
| 3836 &MockLayeredPool::ReleaseOneConnection)); | 3603 &MockLayeredPool::ReleaseOneConnection)); |
| 3837 ClientSocketHandle handle; | 3604 ClientSocketHandle handle; |
| 3838 TestCompletionCallback callback; | 3605 TestCompletionCallback callback; |
| 3839 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 3606 EXPECT_EQ(ERR_IO_PENDING, |
| 3840 params_, | 3607 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 3841 DEFAULT_PRIORITY, | 3608 ClientSocketPool::RespectLimits::ENABLED, |
| 3842 callback.callback(), | 3609 callback.callback(), pool_.get(), BoundNetLog())); |
| 3843 pool_.get(), | |
| 3844 BoundNetLog())); | |
| 3845 EXPECT_EQ(OK, callback.WaitForResult()); | 3610 EXPECT_EQ(OK, callback.WaitForResult()); |
| 3846 } | 3611 } |
| 3847 | 3612 |
| 3848 // Same as above, but the idle socket is in the same group as the stalled | 3613 // Same as above, but the idle socket is in the same group as the stalled |
| 3849 // socket, and closes the only other request in its group when closing requests | 3614 // socket, and closes the only other request in its group when closing requests |
| 3850 // in higher layered pools. This generally shouldn't happen, but it may be | 3615 // in higher layered pools. This generally shouldn't happen, but it may be |
| 3851 // possible if a higher level pool issues a request and the request is | 3616 // possible if a higher level pool issues a request and the request is |
| 3852 // subsequently cancelled. Even if it's not possible, best not to crash. | 3617 // subsequently cancelled. Even if it's not possible, best not to crash. |
| 3853 TEST_F(ClientSocketPoolBaseTest, | 3618 TEST_F(ClientSocketPoolBaseTest, |
| 3854 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) { | 3619 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) { |
| 3855 CreatePool(2, 2); | 3620 CreatePool(2, 2); |
| 3856 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3621 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 3857 | 3622 |
| 3858 // Need a socket in another group for the pool to be stalled (If a group | 3623 // Need a socket in another group for the pool to be stalled (If a group |
| 3859 // has the maximum number of connections already, it's not stalled). | 3624 // has the maximum number of connections already, it's not stalled). |
| 3860 ClientSocketHandle handle1; | 3625 ClientSocketHandle handle1; |
| 3861 TestCompletionCallback callback1; | 3626 TestCompletionCallback callback1; |
| 3862 EXPECT_EQ(OK, handle1.Init("group1", | 3627 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, |
| 3863 params_, | 3628 ClientSocketPool::RespectLimits::ENABLED, |
| 3864 DEFAULT_PRIORITY, | 3629 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3865 callback1.callback(), | |
| 3866 pool_.get(), | |
| 3867 BoundNetLog())); | |
| 3868 | 3630 |
| 3869 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); | 3631 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); |
| 3870 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3632 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
| 3871 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3633 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
| 3872 .WillOnce(Invoke(&mock_layered_pool, | 3634 .WillOnce(Invoke(&mock_layered_pool, |
| 3873 &MockLayeredPool::ReleaseOneConnection)); | 3635 &MockLayeredPool::ReleaseOneConnection)); |
| 3874 ClientSocketHandle handle; | 3636 ClientSocketHandle handle; |
| 3875 TestCompletionCallback callback2; | 3637 TestCompletionCallback callback2; |
| 3876 EXPECT_EQ(ERR_IO_PENDING, handle.Init("group2", | 3638 EXPECT_EQ(ERR_IO_PENDING, |
| 3877 params_, | 3639 handle.Init("group2", params_, DEFAULT_PRIORITY, |
| 3878 DEFAULT_PRIORITY, | 3640 ClientSocketPool::RespectLimits::ENABLED, |
| 3879 callback2.callback(), | 3641 callback2.callback(), pool_.get(), BoundNetLog())); |
| 3880 pool_.get(), | |
| 3881 BoundNetLog())); | |
| 3882 EXPECT_EQ(OK, callback2.WaitForResult()); | 3642 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 3883 } | 3643 } |
| 3884 | 3644 |
| 3885 // Tests the case when an idle socket can be closed when a new request is | 3645 // Tests the case when an idle socket can be closed when a new request is |
| 3886 // issued, and the new request belongs to a group that was previously stalled. | 3646 // issued, and the new request belongs to a group that was previously stalled. |
| 3887 TEST_F(ClientSocketPoolBaseTest, | 3647 TEST_F(ClientSocketPoolBaseTest, |
| 3888 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) { | 3648 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) { |
| 3889 CreatePool(2, 2); | 3649 CreatePool(2, 2); |
| 3890 std::list<TestConnectJob::JobType> job_types; | 3650 std::list<TestConnectJob::JobType> job_types; |
| 3891 job_types.push_back(TestConnectJob::kMockJob); | 3651 job_types.push_back(TestConnectJob::kMockJob); |
| 3892 job_types.push_back(TestConnectJob::kMockJob); | 3652 job_types.push_back(TestConnectJob::kMockJob); |
| 3893 job_types.push_back(TestConnectJob::kMockJob); | 3653 job_types.push_back(TestConnectJob::kMockJob); |
| 3894 job_types.push_back(TestConnectJob::kMockJob); | 3654 job_types.push_back(TestConnectJob::kMockJob); |
| 3895 connect_job_factory_->set_job_types(&job_types); | 3655 connect_job_factory_->set_job_types(&job_types); |
| 3896 | 3656 |
| 3897 ClientSocketHandle handle1; | 3657 ClientSocketHandle handle1; |
| 3898 TestCompletionCallback callback1; | 3658 TestCompletionCallback callback1; |
| 3899 EXPECT_EQ(OK, handle1.Init("group1", | 3659 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, |
| 3900 params_, | 3660 ClientSocketPool::RespectLimits::ENABLED, |
| 3901 DEFAULT_PRIORITY, | 3661 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3902 callback1.callback(), | |
| 3903 pool_.get(), | |
| 3904 BoundNetLog())); | |
| 3905 | 3662 |
| 3906 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); | 3663 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); |
| 3907 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3664 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
| 3908 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3665 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
| 3909 .WillRepeatedly(Invoke(&mock_layered_pool, | 3666 .WillRepeatedly(Invoke(&mock_layered_pool, |
| 3910 &MockLayeredPool::ReleaseOneConnection)); | 3667 &MockLayeredPool::ReleaseOneConnection)); |
| 3911 mock_layered_pool.set_can_release_connection(false); | 3668 mock_layered_pool.set_can_release_connection(false); |
| 3912 | 3669 |
| 3913 // The third request is made when the socket pool is in a stalled state. | 3670 // The third request is made when the socket pool is in a stalled state. |
| 3914 ClientSocketHandle handle3; | 3671 ClientSocketHandle handle3; |
| 3915 TestCompletionCallback callback3; | 3672 TestCompletionCallback callback3; |
| 3916 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", | 3673 EXPECT_EQ(ERR_IO_PENDING, |
| 3917 params_, | 3674 handle3.Init("group3", params_, DEFAULT_PRIORITY, |
| 3918 DEFAULT_PRIORITY, | 3675 ClientSocketPool::RespectLimits::ENABLED, |
| 3919 callback3.callback(), | 3676 callback3.callback(), pool_.get(), BoundNetLog())); |
| 3920 pool_.get(), | |
| 3921 BoundNetLog())); | |
| 3922 | 3677 |
| 3923 base::RunLoop().RunUntilIdle(); | 3678 base::RunLoop().RunUntilIdle(); |
| 3924 EXPECT_FALSE(callback3.have_result()); | 3679 EXPECT_FALSE(callback3.have_result()); |
| 3925 | 3680 |
| 3926 // The fourth request is made when the pool is no longer stalled. The third | 3681 // The fourth request is made when the pool is no longer stalled. The third |
| 3927 // request should be serviced first, since it was issued first and has the | 3682 // request should be serviced first, since it was issued first and has the |
| 3928 // same priority. | 3683 // same priority. |
| 3929 mock_layered_pool.set_can_release_connection(true); | 3684 mock_layered_pool.set_can_release_connection(true); |
| 3930 ClientSocketHandle handle4; | 3685 ClientSocketHandle handle4; |
| 3931 TestCompletionCallback callback4; | 3686 TestCompletionCallback callback4; |
| 3932 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", | 3687 EXPECT_EQ(ERR_IO_PENDING, |
| 3933 params_, | 3688 handle4.Init("group3", params_, DEFAULT_PRIORITY, |
| 3934 DEFAULT_PRIORITY, | 3689 ClientSocketPool::RespectLimits::ENABLED, |
| 3935 callback4.callback(), | 3690 callback4.callback(), pool_.get(), BoundNetLog())); |
| 3936 pool_.get(), | |
| 3937 BoundNetLog())); | |
| 3938 EXPECT_EQ(OK, callback3.WaitForResult()); | 3691 EXPECT_EQ(OK, callback3.WaitForResult()); |
| 3939 EXPECT_FALSE(callback4.have_result()); | 3692 EXPECT_FALSE(callback4.have_result()); |
| 3940 | 3693 |
| 3941 // Closing a handle should free up another socket slot. | 3694 // Closing a handle should free up another socket slot. |
| 3942 handle1.Reset(); | 3695 handle1.Reset(); |
| 3943 EXPECT_EQ(OK, callback4.WaitForResult()); | 3696 EXPECT_EQ(OK, callback4.WaitForResult()); |
| 3944 } | 3697 } |
| 3945 | 3698 |
| 3946 // Tests the case when an idle socket can be closed when a new request is | 3699 // Tests the case when an idle socket can be closed when a new request is |
| 3947 // issued, and the new request belongs to a group that was previously stalled. | 3700 // issued, and the new request belongs to a group that was previously stalled. |
| 3948 // | 3701 // |
| 3949 // The two differences from the above test are that the stalled requests are not | 3702 // The two differences from the above test are that the stalled requests are not |
| 3950 // in the same group as the layered pool's request, and the the fourth request | 3703 // in the same group as the layered pool's request, and the the fourth request |
| 3951 // has a higher priority than the third one, so gets a socket first. | 3704 // has a higher priority than the third one, so gets a socket first. |
| 3952 TEST_F(ClientSocketPoolBaseTest, | 3705 TEST_F(ClientSocketPoolBaseTest, |
| 3953 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) { | 3706 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) { |
| 3954 CreatePool(2, 2); | 3707 CreatePool(2, 2); |
| 3955 std::list<TestConnectJob::JobType> job_types; | 3708 std::list<TestConnectJob::JobType> job_types; |
| 3956 job_types.push_back(TestConnectJob::kMockJob); | 3709 job_types.push_back(TestConnectJob::kMockJob); |
| 3957 job_types.push_back(TestConnectJob::kMockJob); | 3710 job_types.push_back(TestConnectJob::kMockJob); |
| 3958 job_types.push_back(TestConnectJob::kMockJob); | 3711 job_types.push_back(TestConnectJob::kMockJob); |
| 3959 job_types.push_back(TestConnectJob::kMockJob); | 3712 job_types.push_back(TestConnectJob::kMockJob); |
| 3960 connect_job_factory_->set_job_types(&job_types); | 3713 connect_job_factory_->set_job_types(&job_types); |
| 3961 | 3714 |
| 3962 ClientSocketHandle handle1; | 3715 ClientSocketHandle handle1; |
| 3963 TestCompletionCallback callback1; | 3716 TestCompletionCallback callback1; |
| 3964 EXPECT_EQ(OK, handle1.Init("group1", | 3717 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, |
| 3965 params_, | 3718 ClientSocketPool::RespectLimits::ENABLED, |
| 3966 DEFAULT_PRIORITY, | 3719 callback1.callback(), pool_.get(), BoundNetLog())); |
| 3967 callback1.callback(), | |
| 3968 pool_.get(), | |
| 3969 BoundNetLog())); | |
| 3970 | 3720 |
| 3971 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); | 3721 MockLayeredPool mock_layered_pool(pool_.get(), "group2"); |
| 3972 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); | 3722 EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); |
| 3973 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) | 3723 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection()) |
| 3974 .WillRepeatedly(Invoke(&mock_layered_pool, | 3724 .WillRepeatedly(Invoke(&mock_layered_pool, |
| 3975 &MockLayeredPool::ReleaseOneConnection)); | 3725 &MockLayeredPool::ReleaseOneConnection)); |
| 3976 mock_layered_pool.set_can_release_connection(false); | 3726 mock_layered_pool.set_can_release_connection(false); |
| 3977 | 3727 |
| 3978 // The third request is made when the socket pool is in a stalled state. | 3728 // The third request is made when the socket pool is in a stalled state. |
| 3979 ClientSocketHandle handle3; | 3729 ClientSocketHandle handle3; |
| 3980 TestCompletionCallback callback3; | 3730 TestCompletionCallback callback3; |
| 3981 EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", | 3731 EXPECT_EQ(ERR_IO_PENDING, |
| 3982 params_, | 3732 handle3.Init("group3", params_, MEDIUM, |
| 3983 MEDIUM, | 3733 ClientSocketPool::RespectLimits::ENABLED, |
| 3984 callback3.callback(), | 3734 callback3.callback(), pool_.get(), BoundNetLog())); |
| 3985 pool_.get(), | |
| 3986 BoundNetLog())); | |
| 3987 | 3735 |
| 3988 base::RunLoop().RunUntilIdle(); | 3736 base::RunLoop().RunUntilIdle(); |
| 3989 EXPECT_FALSE(callback3.have_result()); | 3737 EXPECT_FALSE(callback3.have_result()); |
| 3990 | 3738 |
| 3991 // The fourth request is made when the pool is no longer stalled. This | 3739 // The fourth request is made when the pool is no longer stalled. This |
| 3992 // request has a higher priority than the third request, so is serviced first. | 3740 // request has a higher priority than the third request, so is serviced first. |
| 3993 mock_layered_pool.set_can_release_connection(true); | 3741 mock_layered_pool.set_can_release_connection(true); |
| 3994 ClientSocketHandle handle4; | 3742 ClientSocketHandle handle4; |
| 3995 TestCompletionCallback callback4; | 3743 TestCompletionCallback callback4; |
| 3996 EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", | 3744 EXPECT_EQ(ERR_IO_PENDING, |
| 3997 params_, | 3745 handle4.Init("group3", params_, HIGHEST, |
| 3998 HIGHEST, | 3746 ClientSocketPool::RespectLimits::ENABLED, |
| 3999 callback4.callback(), | 3747 callback4.callback(), pool_.get(), BoundNetLog())); |
| 4000 pool_.get(), | |
| 4001 BoundNetLog())); | |
| 4002 EXPECT_EQ(OK, callback4.WaitForResult()); | 3748 EXPECT_EQ(OK, callback4.WaitForResult()); |
| 4003 EXPECT_FALSE(callback3.have_result()); | 3749 EXPECT_FALSE(callback3.have_result()); |
| 4004 | 3750 |
| 4005 // Closing a handle should free up another socket slot. | 3751 // Closing a handle should free up another socket slot. |
| 4006 handle1.Reset(); | 3752 handle1.Reset(); |
| 4007 EXPECT_EQ(OK, callback3.WaitForResult()); | 3753 EXPECT_EQ(OK, callback3.WaitForResult()); |
| 4008 } | 3754 } |
| 4009 | 3755 |
| 4010 TEST_F(ClientSocketPoolBaseTest, | 3756 TEST_F(ClientSocketPoolBaseTest, |
| 4011 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) { | 3757 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) { |
| 4012 CreatePool(1, 1); | 3758 CreatePool(1, 1); |
| 4013 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); | 3759 connect_job_factory_->set_job_type(TestConnectJob::kMockJob); |
| 4014 | 3760 |
| 4015 MockLayeredPool mock_layered_pool1(pool_.get(), "foo"); | 3761 MockLayeredPool mock_layered_pool1(pool_.get(), "foo"); |
| 4016 EXPECT_EQ(OK, mock_layered_pool1.RequestSocket(pool_.get())); | 3762 EXPECT_EQ(OK, mock_layered_pool1.RequestSocket(pool_.get())); |
| 4017 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection()) | 3763 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection()) |
| 4018 .WillRepeatedly(Invoke(&mock_layered_pool1, | 3764 .WillRepeatedly(Invoke(&mock_layered_pool1, |
| 4019 &MockLayeredPool::ReleaseOneConnection)); | 3765 &MockLayeredPool::ReleaseOneConnection)); |
| 4020 MockLayeredPool mock_layered_pool2(pool_.get(), "bar"); | 3766 MockLayeredPool mock_layered_pool2(pool_.get(), "bar"); |
| 4021 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get())); | 3767 EXPECT_EQ(OK, mock_layered_pool2.RequestSocketWithoutLimits(pool_.get())); |
| 4022 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection()) | 3768 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection()) |
| 4023 .WillRepeatedly(Invoke(&mock_layered_pool2, | 3769 .WillRepeatedly(Invoke(&mock_layered_pool2, |
| 4024 &MockLayeredPool::ReleaseOneConnection)); | 3770 &MockLayeredPool::ReleaseOneConnection)); |
| 4025 ClientSocketHandle handle; | 3771 ClientSocketHandle handle; |
| 4026 TestCompletionCallback callback; | 3772 TestCompletionCallback callback; |
| 4027 EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", | 3773 EXPECT_EQ(ERR_IO_PENDING, |
| 4028 params_, | 3774 handle.Init("a", params_, DEFAULT_PRIORITY, |
| 4029 DEFAULT_PRIORITY, | 3775 ClientSocketPool::RespectLimits::ENABLED, |
| 4030 callback.callback(), | 3776 callback.callback(), pool_.get(), BoundNetLog())); |
| 4031 pool_.get(), | |
| 4032 BoundNetLog())); | |
| 4033 EXPECT_EQ(OK, callback.WaitForResult()); | 3777 EXPECT_EQ(OK, callback.WaitForResult()); |
| 4034 } | 3778 } |
| 4035 | 3779 |
| 4036 // Test that when a socket pool and group are at their limits, a request | 3780 // Test that when a socket pool and group are at their limits, a request |
| 4037 // with |ignore_limits| triggers creation of a new socket, and gets the socket | 3781 // with RespectLimits::DISABLED triggers creation of a new socket, and gets the |
| 4038 // instead of a request with the same priority that was issued earlier, but | 3782 // socket instead of a request with the same priority that was issued earlier, |
| 4039 // that does not have |ignore_limits| set. | 3783 // but has RespectLimits::ENABLED. |
| 4040 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { | 3784 TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { |
| 4041 scoped_refptr<TestSocketParams> params_ignore_limits( | |
| 4042 new TestSocketParams(true /* ignore_limits */)); | |
| 4043 CreatePool(1, 1); | 3785 CreatePool(1, 1); |
| 4044 | 3786 |
| 4045 // Issue a request to reach the socket pool limit. | 3787 // Issue a request to reach the socket pool limit. |
| 4046 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); | 3788 EXPECT_EQ( |
| 3789 OK, StartRequestWithIgnoreLimits( |
| 3790 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED)); |
| 4047 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3791 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 4048 | 3792 |
| 4049 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3793 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 4050 | 3794 |
| 4051 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, | 3795 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( |
| 4052 params_)); | 3796 "a", MAXIMUM_PRIORITY, |
| 3797 ClientSocketPool::RespectLimits::ENABLED)); |
| 4053 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3798 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 4054 | 3799 |
| 4055 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, | 3800 // Issue a request that ignores the limits, so a new ConnectJob is |
| 4056 params_ignore_limits)); | 3801 // created. |
| 3802 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( |
| 3803 "a", MAXIMUM_PRIORITY, |
| 3804 ClientSocketPool::RespectLimits::DISABLED)); |
| 4057 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3805 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 4058 | 3806 |
| 4059 EXPECT_EQ(OK, request(2)->WaitForResult()); | 3807 EXPECT_EQ(OK, request(2)->WaitForResult()); |
| 4060 EXPECT_FALSE(request(1)->have_result()); | 3808 EXPECT_FALSE(request(1)->have_result()); |
| 4061 } | 3809 } |
| 4062 | 3810 |
| 4063 // Test that when a socket pool and group are at their limits, a ConnectJob | 3811 // Test that when a socket pool and group are at their limits, a ConnectJob |
| 4064 // issued for a request with |ignore_limits| set is not cancelled when a request | 3812 // issued for a request with RespectLimits::DISABLED is not cancelled when a |
| 4065 // without |ignore_limits| issued to the same group is cancelled. | 3813 // request with RespectLimits::ENABLED issued to the same group is cancelled. |
| 4066 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { | 3814 TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { |
| 4067 scoped_refptr<TestSocketParams> params_ignore_limits( | |
| 4068 new TestSocketParams(true /* ignore_limits */)); | |
| 4069 CreatePool(1, 1); | 3815 CreatePool(1, 1); |
| 4070 | 3816 |
| 4071 // Issue a request to reach the socket pool limit. | 3817 // Issue a request to reach the socket pool limit. |
| 4072 EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); | 3818 EXPECT_EQ( |
| 3819 OK, StartRequestWithIgnoreLimits( |
| 3820 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED)); |
| 4073 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3821 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 4074 | 3822 |
| 4075 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); | 3823 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); |
| 4076 | 3824 |
| 4077 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, | 3825 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( |
| 4078 params_)); | 3826 "a", MAXIMUM_PRIORITY, |
| 3827 ClientSocketPool::RespectLimits::ENABLED)); |
| 4079 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); | 3828 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); |
| 4080 | 3829 |
| 4081 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, | 3830 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is |
| 4082 params_ignore_limits)); | 3831 // created. |
| 3832 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( |
| 3833 "a", MAXIMUM_PRIORITY, |
| 3834 ClientSocketPool::RespectLimits::DISABLED)); |
| 4083 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3835 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 4084 | 3836 |
| 4085 // Cancel the pending request without ignore_limits set. The ConnectJob | 3837 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob |
| 4086 // should not be cancelled. | 3838 // should not be cancelled. |
| 4087 request(1)->handle()->Reset(); | 3839 request(1)->handle()->Reset(); |
| 4088 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); | 3840 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); |
| 4089 | 3841 |
| 4090 EXPECT_EQ(OK, request(2)->WaitForResult()); | 3842 EXPECT_EQ(OK, request(2)->WaitForResult()); |
| 4091 EXPECT_FALSE(request(1)->have_result()); | 3843 EXPECT_FALSE(request(1)->have_result()); |
| 4092 } | 3844 } |
| 4093 | 3845 |
| 4094 } // namespace | 3846 } // namespace |
| 4095 | 3847 |
| 4096 } // namespace net | 3848 } // namespace net |
| OLD | NEW |