Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: net/socket/client_socket_pool_base_unittest.cc

Issue 1580903002: Convert ignore_limits from a SocketParam to a socket request argument. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Missed one Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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.ignore_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
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 IgnoreLimits ignore_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 ignore_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
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
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::IgnoreLimits ignore_limits) {
708 return test_base_.StartRequestUsingPool( 706 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
709 pool_.get(), group_name, priority, params); 707 ignore_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::IgnoreLimits::DISABLED);
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
eroman 2016/01/27 20:15:13 Might consider an overload for Init() that doesn't
mmenke 2016/01/27 20:37:27 I prefer to avoid overloads, just because it's eas
eroman 2016/01/27 20:40:21 ok, i figured as much
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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", &params_, 2, BoundNetLog()); 2951 pool_->RequestSockets("a", &params_, 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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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", &params_, 2, BoundNetLog()); 3002 pool_->RequestSockets("a", &params_, 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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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", &params_, 2, BoundNetLog()); 3060 pool_->RequestSockets("a", &params_, 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
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::IgnoreLimits::DISABLED,
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", &params_, 2, BoundNetLog()); 3142 pool_->RequestSockets("a", &params_, 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::IgnoreLimits::DISABLED,
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", &params_, 2, BoundNetLog()); 3167 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3380 3168
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
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", &params_, 2, BoundNetLog()); 3223 pool_->RequestSockets("a", &params_, 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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
3511 3294
3512 pool_->RequestSockets("a", &params_, 1, BoundNetLog()); 3295 pool_->RequestSockets("a", &params_, 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::IgnoreLimits::DISABLED,
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", &params_, 1, BoundNetLog()); 3328 pool_->RequestSockets("a", &params_, 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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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
3681 pool_->RequestSockets("a", &params_, 1, BoundNetLog()); 3453 pool_->RequestSockets("a", &params_, 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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::ENABLED,
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
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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::IgnoreLimits::DISABLED,
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 |ignore_limits| triggers creation of a new socket, and gets the socket
4038 // instead of a request with the same priority that was issued earlier, but 3782 // instead of a request with the same priority that was issued earlier, but
4039 // that does not have |ignore_limits| set. 3783 // that does not have |ignore_limits| set.
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::IgnoreLimits::DISABLED));
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::IgnoreLimits::DISABLED));
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::IgnoreLimits::ENABLED));
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 |ignore_limits| set is not cancelled when a request
4065 // without |ignore_limits| issued to the same group is cancelled. 3813 // without |ignore_limits| 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::IgnoreLimits::DISABLED));
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::IgnoreLimits::DISABLED));
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 that ignores the limits, so a new ConnectJob is
4082 params_ignore_limits)); 3831 // created.
3832 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3833 "a", MAXIMUM_PRIORITY,
3834 ClientSocketPool::IgnoreLimits::ENABLED));
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 without ignore_limits set. 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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698