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