blob: 3e65aa16d1cf20df5fc8596f3d3eb03920a15487 [file] [log] [blame]
[email protected]e34400c32012-01-24 02:49:331// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]f6d1d6eb2009-06-24 20:16:092// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]ab838892009-06-30 18:49:055#include "net/socket/client_socket_pool_base.h"
[email protected]f6d1d6eb2009-06-24 20:16:096
tbansalf82cc8e2015-10-14 20:05:497#include <stdint.h>
dchengc7eeda422015-12-26 03:56:488#include <utility>
[email protected]51fdc7c2012-04-10 19:19:489#include <vector>
10
[email protected]6ecf2b92011-12-15 01:14:5211#include "base/bind.h"
12#include "base/bind_helpers.h"
[email protected]2041cf342010-02-19 03:15:5913#include "base/callback.h"
skyostil4891b25b2015-06-11 11:43:4514#include "base/location.h"
mmenke33d24423d2015-05-19 19:41:0915#include "base/logging.h"
Avi Drissman13fc8932015-12-20 04:40:4616#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1517#include "base/memory/ref_counted.h"
[email protected]6ea7b152011-12-21 21:21:1318#include "base/memory/weak_ptr.h"
[email protected]18b577412013-07-18 04:19:1519#include "base/message_loop/message_loop.h"
[email protected]034df0f32013-01-07 23:17:4820#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4521#include "base/single_thread_task_runner.h"
[email protected]fc9be5802013-06-11 10:56:5122#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1523#include "base/strings/stringprintf.h"
xunjieli26619e72016-11-23 19:39:5524#include "base/test/histogram_tester.h"
[email protected]f214f8792011-01-01 02:17:0825#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3526#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0327#include "base/values.h"
[email protected]034df0f32013-01-07 23:17:4828#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5929#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0630#include "net/base/net_errors.h"
[email protected]ac790b42009-12-02 04:31:3131#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0932#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3533#include "net/http/http_response_headers.h"
eroman87c53d62015-04-02 06:51:0734#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0035#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1936#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0037#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5638#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4639#include "net/log/test_net_log_entry.h"
40#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0941#include "net/socket/client_socket_factory.h"
42#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2643#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2844#include "net/socket/socket_performance_watcher.h"
[email protected]75439d3b2009-07-23 22:11:1745#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4446#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1047#include "net/socket/stream_socket.h"
robpercival214763f2016-07-01 23:27:0148#include "net/test/gtest_util.h"
[email protected]51fdc7c2012-04-10 19:19:4849#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0950#include "testing/gtest/include/gtest/gtest.h"
51
robpercival214763f2016-07-01 23:27:0152using net::test::IsError;
53using net::test::IsOk;
54
[email protected]51fdc7c2012-04-10 19:19:4855using ::testing::Invoke;
56using ::testing::Return;
57
[email protected]f6d1d6eb2009-06-24 20:16:0958namespace net {
59
60namespace {
61
[email protected]211d21722009-07-22 15:48:5362const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2063const int kDefaultMaxSocketsPerGroup = 2;
xunjieli26619e72016-11-23 19:39:5564const char kIdleSocketFateHistogram[] = "Net.Socket.IdleSocketFate";
[email protected]0b7648c2009-07-06 20:14:0165
[email protected]034df0f32013-01-07 23:17:4866// Make sure |handle| sets load times correctly when it has been assigned a
67// reused socket.
68void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
69 LoadTimingInfo load_timing_info;
70 // Only pass true in as |is_reused|, as in general, HttpStream types should
71 // have stricter concepts of reuse than socket pools.
72 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
73
74 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1975 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4876
[email protected]b258e0792013-01-12 07:11:5977 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
78 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4879}
80
81// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3382// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4883// of a connection where |is_reused| is false may consider the connection
84// reused.
85void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
86 EXPECT_FALSE(handle.is_reused());
87
88 LoadTimingInfo load_timing_info;
89 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
90
91 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1992 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4893
[email protected]b258e0792013-01-12 07:11:5994 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
95 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
96 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4897
98 TestLoadTimingInfoConnectedReused(handle);
99}
100
101// Make sure |handle| sets load times correctly, in the case that it does not
102// currently have a socket.
103void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
104 // Should only be set to true once a socket is assigned, if at all.
105 EXPECT_FALSE(handle.is_reused());
106
107 LoadTimingInfo load_timing_info;
108 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
109
110 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19111 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48112
[email protected]b258e0792013-01-12 07:11:59113 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
114 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48115}
116
[email protected]df4b4ef2010-07-12 18:25:21117class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20118 public:
mmenked3641e12016-01-28 16:06:15119 explicit TestSocketParams() {}
[email protected]51fdc7c2012-04-10 19:19:48120
[email protected]df4b4ef2010-07-12 18:25:21121 private:
122 friend class base::RefCounted<TestSocketParams>;
123 ~TestSocketParams() {}
124};
[email protected]7fc5b09a2010-02-27 00:07:38125typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49126
[email protected]3268023f2011-05-05 00:08:10127class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09128 public:
[email protected]034df0f32013-01-07 23:17:48129 explicit MockClientSocket(net::NetLog* net_log)
130 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28131 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20132 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
ttuttle859dc7a2015-04-23 19:42:29133 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09134
[email protected]0dc88b32014-03-26 20:12:28135 // Sets whether the socket has unread data. If true, the next call to Read()
136 // will return 1 byte and IsConnectedAndIdle() will return false.
137 void set_has_unread_data(bool has_unread_data) {
138 has_unread_data_ = has_unread_data;
139 }
140
[email protected]3f55aa12011-12-07 02:03:33141 // Socket implementation.
dchengb03027d2014-10-21 12:00:20142 int Read(IOBuffer* /* buf */,
143 int len,
144 const CompletionCallback& /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28145 if (has_unread_data_ && len > 0) {
146 has_unread_data_ = false;
147 was_used_to_convey_data_ = true;
148 return 1;
149 }
[email protected]e86df8dc2013-03-30 13:18:28150 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33151 }
[email protected]ab838892009-06-30 18:49:05152
dchengb03027d2014-10-21 12:00:20153 int Write(IOBuffer* /* buf */,
154 int len,
155 const CompletionCallback& /* callback */) override {
[email protected]0f873e82010-09-02 16:09:01156 was_used_to_convey_data_ = true;
157 return len;
[email protected]ab838892009-06-30 18:49:05158 }
Avi Drissman13fc8932015-12-20 04:40:46159 int SetReceiveBufferSize(int32_t size) override { return OK; }
160 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05161
[email protected]dbf036f2011-12-06 23:33:24162 // StreamSocket implementation.
dchengb03027d2014-10-21 12:00:20163 int Connect(const CompletionCallback& callback) override {
[email protected]dbf036f2011-12-06 23:33:24164 connected_ = true;
165 return OK;
166 }
[email protected]f6d1d6eb2009-06-24 20:16:09167
dchengb03027d2014-10-21 12:00:20168 void Disconnect() override { connected_ = false; }
169 bool IsConnected() const override { return connected_; }
170 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28171 return connected_ && !has_unread_data_;
172 }
[email protected]0b7648c2009-07-06 20:14:01173
dchengb03027d2014-10-21 12:00:20174 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16175 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09176 }
[email protected]f6d1d6eb2009-06-24 20:16:09177
dchengb03027d2014-10-21 12:00:20178 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35179 return ERR_UNEXPECTED;
180 }
181
tfarina428341112016-09-22 13:38:20182 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02183
dchengb03027d2014-10-21 12:00:20184 void SetSubresourceSpeculation() override {}
185 void SetOmniboxSpeculation() override {}
186 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37187 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20188 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
189 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03190 void GetConnectionAttempts(ConnectionAttempts* out) const override {
191 out->clear();
192 }
193 void ClearConnectionAttempts() override {}
194 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49195 int64_t GetTotalReceivedBytes() const override {
196 NOTIMPLEMENTED();
197 return 0;
198 }
[email protected]9b5614a2010-08-25 20:29:45199
[email protected]f6d1d6eb2009-06-24 20:16:09200 private:
201 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28202 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20203 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01204 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09205
[email protected]ab838892009-06-30 18:49:05206 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09207};
208
[email protected]5fc08e32009-07-15 17:09:57209class TestConnectJob;
210
[email protected]f6d1d6eb2009-06-24 20:16:09211class MockClientSocketFactory : public ClientSocketFactory {
212 public:
[email protected]ab838892009-06-30 18:49:05213 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09214
danakj655b66c2016-04-16 00:51:38215 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04216 DatagramSocket::BindType bind_type,
217 const RandIntCallback& rand_int_cb,
[email protected]98b0e582011-06-22 14:31:41218 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19219 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41220 NOTREACHED();
danakj655b66c2016-04-16 00:51:38221 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41222 }
223
danakj655b66c2016-04-16 00:51:38224 std::unique_ptr<StreamSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07225 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38226 std::unique_ptr<
227 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07228 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19229 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09230 allocation_count_++;
danakj655b66c2016-04-16 00:51:38231 return std::unique_ptr<StreamSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09232 }
233
danakj655b66c2016-04-16 00:51:38234 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
235 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27236 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21237 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13238 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09239 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38240 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09241 }
242
dchengb03027d2014-10-21 12:00:20243 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59244
[email protected]5fc08e32009-07-15 17:09:57245 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55246
[email protected]5fc08e32009-07-15 17:09:57247 void SignalJobs();
248
[email protected]03b7c8c2013-07-20 04:38:55249 void SignalJob(size_t job);
250
251 void SetJobLoadState(size_t job, LoadState load_state);
252
[email protected]f6d1d6eb2009-06-24 20:16:09253 int allocation_count() const { return allocation_count_; }
254
[email protected]f6d1d6eb2009-06-24 20:16:09255 private:
256 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57257 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09258};
259
[email protected]ab838892009-06-30 18:49:05260class TestConnectJob : public ConnectJob {
261 public:
262 enum JobType {
263 kMockJob,
264 kMockFailingJob,
265 kMockPendingJob,
266 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57267 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13268 kMockRecoverableJob,
269 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18270 kMockAdditionalErrorStateJob,
271 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28272 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05273 };
274
[email protected]994d4932010-07-12 17:55:13275 // The kMockPendingJob uses a slight delay before allowing the connect
276 // to complete.
277 static const int kPendingConnectDelay = 2;
278
[email protected]ab838892009-06-30 18:49:05279 TestConnectJob(JobType job_type,
280 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49281 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34282 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05283 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30284 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17285 NetLog* net_log)
tfarina428341112016-09-22 13:38:20286 : ConnectJob(
287 group_name,
288 timeout_duration,
289 request.priority(),
290 request.respect_limits(),
291 delegate,
davidbenb7048f092016-11-30 21:20:26292 NetLogWithSource::Make(net_log,
293 NetLogSourceType::TRANSPORT_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58294 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05295 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18296 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39297 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15298 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05299
[email protected]974ebd62009-08-03 23:14:34300 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13301 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34302 }
303
[email protected]03b7c8c2013-07-20 04:38:55304 void set_load_state(LoadState load_state) { load_state_ = load_state; }
305
306 // From ConnectJob:
307
dchengb03027d2014-10-21 12:00:20308 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21309
dchengb03027d2014-10-21 12:00:20310 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18311 if (store_additional_error_state_) {
312 // Set all of the additional error state fields in some way.
313 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43314 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45315 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43316 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18317 }
318 }
319
[email protected]974ebd62009-08-03 23:14:34320 private:
[email protected]03b7c8c2013-07-20 04:38:55321 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05322
dchengb03027d2014-10-21 12:00:20323 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05324 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21325 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19326 NetLogSource());
danakj655b66c2016-04-16 00:51:38327 SetSocket(std::unique_ptr<StreamSocket>(
328 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05329 switch (job_type_) {
330 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13331 return DoConnect(true /* successful */, false /* sync */,
332 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05333 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13334 return DoConnect(false /* error */, false /* sync */,
335 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05336 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57337 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47338
339 // Depending on execution timings, posting a delayed task can result
340 // in the task getting executed the at the earliest possible
341 // opportunity or only after returning once from the message loop and
342 // then a second call into the message loop. In order to make behavior
343 // more deterministic, we change the default delay to 2ms. This should
344 // always require us to wait for the second call into the message loop.
345 //
346 // N.B. The correct fix for this and similar timing problems is to
347 // abstract time for the purpose of unittests. Unfortunately, we have
348 // a lot of third-party components that directly call the various
349 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45350 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05351 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13352 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45353 weak_factory_.GetWeakPtr(), true /* successful */,
354 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53355 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05356 return ERR_IO_PENDING;
357 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57358 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45359 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05360 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13361 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45362 weak_factory_.GetWeakPtr(), false /* error */,
363 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53364 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05365 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57366 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55367 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57368 client_socket_factory_->WaitForSignal(this);
369 waiting_success_ = true;
370 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13371 case kMockRecoverableJob:
372 return DoConnect(false /* error */, false /* sync */,
373 true /* recoverable */);
374 case kMockPendingRecoverableJob:
375 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45376 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13377 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13378 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45379 weak_factory_.GetWeakPtr(), false /* error */,
380 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53381 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13382 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18383 case kMockAdditionalErrorStateJob:
384 store_additional_error_state_ = true;
385 return DoConnect(false /* error */, false /* sync */,
386 false /* recoverable */);
387 case kMockPendingAdditionalErrorStateJob:
388 set_load_state(LOAD_STATE_CONNECTING);
389 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45390 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18391 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13392 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45393 weak_factory_.GetWeakPtr(), false /* error */,
394 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53395 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18396 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28397 case kMockUnreadDataJob: {
398 int ret = DoConnect(true /* successful */, false /* sync */,
399 false /* recoverable */);
400 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
401 return ret;
402 }
[email protected]ab838892009-06-30 18:49:05403 default:
404 NOTREACHED();
danakj655b66c2016-04-16 00:51:38405 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05406 return ERR_FAILED;
407 }
408 }
409
[email protected]e772db3f2010-07-12 18:11:13410 int DoConnect(bool succeed, bool was_async, bool recoverable) {
411 int result = OK;
[email protected]ab838892009-06-30 18:49:05412 if (succeed) {
[email protected]83039bb2011-12-09 18:43:55413 socket()->Connect(CompletionCallback());
[email protected]e772db3f2010-07-12 18:11:13414 } else if (recoverable) {
415 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40416 } else {
[email protected]e772db3f2010-07-12 18:11:13417 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38418 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05419 }
[email protected]2ab05b52009-07-01 23:57:58420
421 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30422 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05423 return result;
424 }
425
[email protected]5fc08e32009-07-15 17:09:57426 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05427 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57428 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21429 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18430 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05431
[email protected]d5492c52013-11-10 20:44:39432 base::WeakPtrFactory<TestConnectJob> weak_factory_;
433
[email protected]ab838892009-06-30 18:49:05434 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
435};
436
[email protected]d80a4322009-08-14 07:07:49437class TestConnectJobFactory
438 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05439 public:
[email protected]034df0f32013-01-07 23:17:48440 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
441 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05442 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48443 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48444 client_socket_factory_(client_socket_factory),
445 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33446 }
[email protected]ab838892009-06-30 18:49:05447
dchengb03027d2014-10-21 12:00:20448 ~TestConnectJobFactory() override {}
[email protected]ab838892009-06-30 18:49:05449
450 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
451
[email protected]51fdc7c2012-04-10 19:19:48452 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
453 job_types_ = job_types;
454 CHECK(!job_types_->empty());
455 }
456
[email protected]974ebd62009-08-03 23:14:34457 void set_timeout_duration(base::TimeDelta timeout_duration) {
458 timeout_duration_ = timeout_duration;
459 }
460
[email protected]3f55aa12011-12-07 02:03:33461 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55462
danakj655b66c2016-04-16 00:51:38463 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05464 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49465 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13466 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48467 EXPECT_TRUE(!job_types_ || !job_types_->empty());
468 TestConnectJob::JobType job_type = job_type_;
469 if (job_types_ && !job_types_->empty()) {
470 job_type = job_types_->front();
471 job_types_->pop_front();
472 }
danakj655b66c2016-04-16 00:51:38473 return std::unique_ptr<ConnectJob>(
474 new TestConnectJob(job_type, group_name, request, timeout_duration_,
475 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05476 }
477
dchengb03027d2014-10-21 12:00:20478 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26479 return timeout_duration_;
480 }
481
[email protected]ab838892009-06-30 18:49:05482 private:
483 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48484 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34485 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57486 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48487 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05488
489 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
490};
491
492class TestClientSocketPool : public ClientSocketPool {
493 public:
[email protected]12322e7e2013-08-15 17:49:26494 typedef TestSocketParams SocketParams;
495
[email protected]ab838892009-06-30 18:49:05496 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53497 int max_sockets,
[email protected]ab838892009-06-30 18:49:05498 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16499 base::TimeDelta unused_idle_socket_timeout,
500 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49501 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41502 : base_(NULL,
503 max_sockets,
504 max_sockets_per_group,
505 unused_idle_socket_timeout,
506 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38507 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05508
dchengb03027d2014-10-21 12:00:20509 ~TestClientSocketPool() override {}
[email protected]2431756e2010-09-29 20:26:13510
dchengb03027d2014-10-21 12:00:20511 int RequestSocket(const std::string& group_name,
512 const void* params,
ttuttle859dc7a2015-04-23 19:42:29513 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15514 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20515 ClientSocketHandle* handle,
516 const CompletionCallback& callback,
tfarina428341112016-09-22 13:38:20517 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21518 const scoped_refptr<TestSocketParams>* casted_socket_params =
519 static_cast<const scoped_refptr<TestSocketParams>*>(params);
520 return base_.RequestSocket(group_name, *casted_socket_params, priority,
mmenked3641e12016-01-28 16:06:15521 respect_limits, handle, callback, net_log);
[email protected]ab838892009-06-30 18:49:05522 }
523
dchengb03027d2014-10-21 12:00:20524 void RequestSockets(const std::string& group_name,
525 const void* params,
526 int num_sockets,
tfarina428341112016-09-22 13:38:20527 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03528 const scoped_refptr<TestSocketParams>* casted_params =
529 static_cast<const scoped_refptr<TestSocketParams>*>(params);
530
531 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
532 }
533
rdsmith29dbad12017-02-17 02:22:18534 void SetPriority(const std::string& group_name,
535 ClientSocketHandle* handle,
536 RequestPriority priority) override {
537 base_.SetPriority(group_name, handle, priority);
538 }
539
dchengb03027d2014-10-21 12:00:20540 void CancelRequest(const std::string& group_name,
541 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49542 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05543 }
544
dchengb03027d2014-10-21 12:00:20545 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38546 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20547 int id) override {
dchengc7eeda422015-12-26 03:56:48548 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24549 }
550
dchengb03027d2014-10-21 12:00:20551 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05552
dchengb03027d2014-10-21 12:00:20553 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48554
dchengb03027d2014-10-21 12:00:20555 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05556
xunjieli92feb332017-03-03 17:19:23557 void CloseIdleSocketsInGroup(const std::string& group_name) override {
558 base_.CloseIdleSocketsInGroup(group_name);
559 }
560
dchengb03027d2014-10-21 12:00:20561 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05562
dchengb03027d2014-10-21 12:00:20563 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49564 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05565 }
566
dchengb03027d2014-10-21 12:00:20567 LoadState GetLoadState(const std::string& group_name,
568 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49569 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05570 }
571
dchengb03027d2014-10-21 12:00:20572 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52573 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48574 }
575
dchengb03027d2014-10-21 12:00:20576 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52577 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48578 }
579
danakj655b66c2016-04-16 00:51:38580 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59581 const std::string& name,
582 const std::string& type,
mostynbba063d6032014-10-09 11:01:13583 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27584 return base_.GetInfoAsValue(name, type);
585 }
586
dchengb03027d2014-10-21 12:00:20587 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26588 return base_.ConnectionTimeout();
589 }
590
[email protected]d80a4322009-08-14 07:07:49591 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20592
[email protected]8159a1c2012-06-07 00:00:10593 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
594 return base_.NumUnassignedConnectJobsInGroup(group_name);
595 }
596
[email protected]974ebd62009-08-03 23:14:34597 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49598 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34599 }
600
[email protected]2c2bef152010-10-13 00:55:03601 int NumActiveSocketsInGroup(const std::string& group_name) const {
602 return base_.NumActiveSocketsInGroup(group_name);
603 }
604
[email protected]2abfe90a2010-08-25 17:49:51605 bool HasGroup(const std::string& group_name) const {
606 return base_.HasGroup(group_name);
607 }
608
[email protected]9bf28db2009-08-29 01:35:16609 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
610
[email protected]06d94042010-08-25 01:45:22611 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54612
[email protected]043b68c82013-08-22 23:41:52613 bool CloseOneIdleConnectionInHigherLayeredPool() {
614 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48615 }
616
[email protected]ab838892009-06-30 18:49:05617 private:
[email protected]d80a4322009-08-14 07:07:49618 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05619
620 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
621};
622
[email protected]a937a06d2009-08-19 21:19:24623} // namespace
624
[email protected]a937a06d2009-08-19 21:19:24625namespace {
626
[email protected]5fc08e32009-07-15 17:09:57627void MockClientSocketFactory::SignalJobs() {
628 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
629 it != waiting_jobs_.end(); ++it) {
630 (*it)->Signal();
631 }
632 waiting_jobs_.clear();
633}
634
[email protected]03b7c8c2013-07-20 04:38:55635void MockClientSocketFactory::SignalJob(size_t job) {
636 ASSERT_LT(job, waiting_jobs_.size());
637 waiting_jobs_[job]->Signal();
638 waiting_jobs_.erase(waiting_jobs_.begin() + job);
639}
640
641void MockClientSocketFactory::SetJobLoadState(size_t job,
642 LoadState load_state) {
643 ASSERT_LT(job, waiting_jobs_.size());
644 waiting_jobs_[job]->set_load_state(load_state);
645}
646
[email protected]974ebd62009-08-03 23:14:34647class TestConnectJobDelegate : public ConnectJob::Delegate {
648 public:
649 TestConnectJobDelegate()
650 : have_result_(false), waiting_for_result_(false), result_(OK) {}
dchengb03027d2014-10-21 12:00:20651 ~TestConnectJobDelegate() override {}
[email protected]974ebd62009-08-03 23:14:34652
dchengb03027d2014-10-21 12:00:20653 void OnConnectJobComplete(int result, ConnectJob* job) override {
[email protected]974ebd62009-08-03 23:14:34654 result_ = result;
danakj655b66c2016-04-16 00:51:38655 std::unique_ptr<ConnectJob> owned_job(job);
656 std::unique_ptr<StreamSocket> socket = owned_job->PassSocket();
[email protected]9b6fee12009-09-29 18:13:07657 // socket.get() should be NULL iff result != OK
[email protected]18ccfdb2013-08-15 00:13:44658 EXPECT_EQ(socket == NULL, result != OK);
[email protected]974ebd62009-08-03 23:14:34659 have_result_ = true;
660 if (waiting_for_result_)
Gabriel Charette53a9ef812017-07-26 12:36:23661 base::RunLoop::QuitCurrentWhenIdleDeprecated();
[email protected]974ebd62009-08-03 23:14:34662 }
663
664 int WaitForResult() {
665 DCHECK(!waiting_for_result_);
666 while (!have_result_) {
667 waiting_for_result_ = true;
fdoray5eeb7642016-06-22 16:11:28668 base::RunLoop().Run();
[email protected]974ebd62009-08-03 23:14:34669 waiting_for_result_ = false;
670 }
671 have_result_ = false; // auto-reset for next callback
672 return result_;
673 }
674
675 private:
676 bool have_result_;
677 bool waiting_for_result_;
678 int result_;
679};
680
[email protected]2431756e2010-09-29 20:26:13681class ClientSocketPoolBaseTest : public testing::Test {
[email protected]f6d1d6eb2009-06-24 20:16:09682 protected:
mmenked3641e12016-01-28 16:06:15683 ClientSocketPoolBaseTest() : params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54684 connect_backup_jobs_enabled_ =
685 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
686 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
687 }
[email protected]2431756e2010-09-29 20:26:13688
dcheng67be2b1f2014-10-27 21:47:29689 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54690 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
691 connect_backup_jobs_enabled_);
692 }
[email protected]c9d6a1d2009-07-14 16:15:20693
[email protected]211d21722009-07-22 15:48:53694 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16695 CreatePoolWithIdleTimeouts(
696 max_sockets,
697 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30698 ClientSocketPool::unused_idle_socket_timeout(),
699 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16700 }
701
702 void CreatePoolWithIdleTimeouts(
703 int max_sockets, int max_sockets_per_group,
704 base::TimeDelta unused_idle_socket_timeout,
705 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20706 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48707 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
708 &net_log_);
[email protected]2431756e2010-09-29 20:26:13709 pool_.reset(new TestClientSocketPool(max_sockets,
710 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13711 unused_idle_socket_timeout,
712 used_idle_socket_timeout,
713 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20714 }
[email protected]f6d1d6eb2009-06-24 20:16:09715
mmenked3641e12016-01-28 16:06:15716 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33717 const std::string& group_name,
718 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15719 ClientSocketPool::RespectLimits respect_limits) {
720 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
721 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33722 }
723
724 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15725 return StartRequestWithIgnoreLimits(
726 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09727 }
728
[email protected]2431756e2010-09-29 20:26:13729 int GetOrderOfRequest(size_t index) const {
730 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09731 }
732
[email protected]2431756e2010-09-29 20:26:13733 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
734 return test_base_.ReleaseOneConnection(keep_alive);
735 }
736
737 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
738 test_base_.ReleaseAllConnections(keep_alive);
739 }
740
741 TestSocketRequest* request(int i) { return test_base_.request(i); }
742 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38743 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42744 return test_base_.requests();
745 }
rdsmith29dbad12017-02-17 02:22:18746 // Only counts the requests that get sockets asynchronously;
747 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13748 size_t completion_count() const { return test_base_.completion_count(); }
749
vishal.b62985ca92015-04-17 08:45:51750 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54751 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09752 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04753 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21754 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38755 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13756 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09757};
758
[email protected]974ebd62009-08-03 23:14:34759// Even though a timeout is specified, it doesn't time out on a synchronous
760// completion.
761TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
762 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06763 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49764 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07765 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15766 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20767 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
768 NetLogWithSource());
danakj655b66c2016-04-16 00:51:38769 std::unique_ptr<TestConnectJob> job(
770 new TestConnectJob(TestConnectJob::kMockJob, "a", request,
771 base::TimeDelta::FromMicroseconds(1), &delegate,
772 &client_socket_factory_, NULL));
robpercival214763f2016-07-01 23:27:01773 EXPECT_THAT(job->Connect(), IsOk());
[email protected]974ebd62009-08-03 23:14:34774}
775
776TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
777 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06778 ClientSocketHandle ignored;
vishal.b62985ca92015-04-17 08:45:51779 TestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53780
[email protected]d80a4322009-08-14 07:07:49781 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07782 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15783 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20784 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
785 NetLogWithSource());
[email protected]974ebd62009-08-03 23:14:34786 // Deleted by TestConnectJobDelegate.
787 TestConnectJob* job =
788 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12789 "a",
[email protected]974ebd62009-08-03 23:14:34790 request,
791 base::TimeDelta::FromMicroseconds(1),
792 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30793 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17794 &log);
robpercival214763f2016-07-01 23:27:01795 ASSERT_THAT(job->Connect(), IsError(ERR_IO_PENDING));
[email protected]26b9973962012-01-28 00:57:00796 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
robpercival214763f2016-07-01 23:27:01797 EXPECT_THAT(delegate.WaitForResult(), IsError(ERR_TIMED_OUT));
[email protected]fd7b7c92009-08-20 19:38:30798
mmenke43758e62015-05-04 21:09:46799 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40800 log.GetEntries(&entries);
801
802 EXPECT_EQ(6u, entries.size());
mikecirone8b85c432016-09-08 19:11:00803 EXPECT_TRUE(LogContainsBeginEvent(entries, 0,
804 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]e9002a92010-01-29 07:10:46805 EXPECT_TRUE(LogContainsBeginEvent(
mikecirone8b85c432016-09-08 19:11:00806 entries, 1, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
807 EXPECT_TRUE(LogContainsEvent(entries, 2,
808 NetLogEventType::CONNECT_JOB_SET_SOCKET,
809 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46810 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00811 entries, 3, NetLogEventType::SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
812 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46813 EXPECT_TRUE(LogContainsEndEvent(
mikecirone8b85c432016-09-08 19:11:00814 entries, 4, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
815 EXPECT_TRUE(LogContainsEndEvent(entries, 5,
816 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]974ebd62009-08-03 23:14:34817}
818
[email protected]5fc08e32009-07-15 17:09:57819TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53820 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20821
[email protected]6ecf2b92011-12-15 01:14:52822 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06823 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51824 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48825 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53826
mmenked3641e12016-01-28 16:06:15827 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY,
828 ClientSocketPool::RespectLimits::ENABLED,
829 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09830 EXPECT_TRUE(handle.is_initialized());
831 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48832 TestLoadTimingInfoConnectedNotReused(handle);
833
[email protected]f6d1d6eb2009-06-24 20:16:09834 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48835 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30836
mmenke43758e62015-05-04 21:09:46837 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40838 log.GetEntries(&entries);
839
840 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00841 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53842 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00843 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
844 NetLogEventPhase::NONE));
845 EXPECT_TRUE(LogContainsEvent(entries, 2,
846 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
847 NetLogEventPhase::NONE));
848 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09849}
850
[email protected]ab838892009-06-30 18:49:05851TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53852 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20853
[email protected]ab838892009-06-30 18:49:05854 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51855 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53856
[email protected]2431756e2010-09-29 20:26:13857 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52858 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18859 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13860 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43861 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45862 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13863 handle.set_ssl_error_response_info(info);
864 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:15865 handle.Init("a", params_, DEFAULT_PRIORITY,
866 ClientSocketPool::RespectLimits::ENABLED,
867 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13868 EXPECT_FALSE(handle.socket());
869 EXPECT_FALSE(handle.is_ssl_error());
870 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48871 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30872
mmenke43758e62015-05-04 21:09:46873 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40874 log.GetEntries(&entries);
875
876 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00877 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17878 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00879 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
880 NetLogEventPhase::NONE));
881 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09882}
883
[email protected]211d21722009-07-22 15:48:53884TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
xunjieli26619e72016-11-23 19:39:55885 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:53886 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
887
[email protected]9e743cd2010-03-16 07:03:53888 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30889
robpercival214763f2016-07-01 23:27:01890 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
891 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
892 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
893 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53894
[email protected]2431756e2010-09-29 20:26:13895 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53896 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13897 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53898
robpercival214763f2016-07-01 23:27:01899 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
900 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
901 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53902
[email protected]2431756e2010-09-29 20:26:13903 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53904
xunjieli26619e72016-11-23 19:39:55905 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
906 testing::ElementsAre(
907 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 7)));
908
[email protected]2431756e2010-09-29 20:26:13909 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53910 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13911 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53912
913 EXPECT_EQ(1, GetOrderOfRequest(1));
914 EXPECT_EQ(2, GetOrderOfRequest(2));
915 EXPECT_EQ(3, GetOrderOfRequest(3));
916 EXPECT_EQ(4, GetOrderOfRequest(4));
917 EXPECT_EQ(5, GetOrderOfRequest(5));
918 EXPECT_EQ(6, GetOrderOfRequest(6));
919 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17920
921 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13922 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53923}
924
925TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
xunjieli26619e72016-11-23 19:39:55926 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:53927 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
928
[email protected]9e743cd2010-03-16 07:03:53929 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30930
[email protected]211d21722009-07-22 15:48:53931 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01932 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
933 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
934 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
935 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53936
[email protected]2431756e2010-09-29 20:26:13937 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53938 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13939 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53940
941 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01942 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53943
[email protected]2431756e2010-09-29 20:26:13944 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:55945 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
946 testing::ElementsAre(
947 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 5)));
[email protected]211d21722009-07-22 15:48:53948
[email protected]2431756e2010-09-29 20:26:13949 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53950 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13951 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53952
953 EXPECT_EQ(1, GetOrderOfRequest(1));
954 EXPECT_EQ(2, GetOrderOfRequest(2));
955 EXPECT_EQ(3, GetOrderOfRequest(3));
956 EXPECT_EQ(4, GetOrderOfRequest(4));
957 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17958
959 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13960 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53961}
962
963TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
xunjieli26619e72016-11-23 19:39:55964 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:53965 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
966
robpercival214763f2016-07-01 23:27:01967 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
968 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
969 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
970 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53971
[email protected]2431756e2010-09-29 20:26:13972 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53973 client_socket_factory_.allocation_count());
974
robpercival214763f2016-07-01 23:27:01975 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
976 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
977 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53978
[email protected]2431756e2010-09-29 20:26:13979 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:55980 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
981 testing::ElementsAre(
982 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 7)));
[email protected]211d21722009-07-22 15:48:53983
[email protected]2431756e2010-09-29 20:26:13984 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53985
986 // First 4 requests don't have to wait, and finish in order.
987 EXPECT_EQ(1, GetOrderOfRequest(1));
988 EXPECT_EQ(2, GetOrderOfRequest(2));
989 EXPECT_EQ(3, GetOrderOfRequest(3));
990 EXPECT_EQ(4, GetOrderOfRequest(4));
991
[email protected]ac790b42009-12-02 04:31:31992 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
993 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53994 EXPECT_EQ(7, GetOrderOfRequest(5));
995 EXPECT_EQ(6, GetOrderOfRequest(6));
996 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17997
998 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13999 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531000}
1001
rdsmith29dbad12017-02-17 02:22:181002// Test reprioritizing a request before completion doesn't interfere with
1003// its completion.
1004TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1005 CreatePool(kDefaultMaxSockets, 1);
1006
1007 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1008 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1009 EXPECT_TRUE(request(0)->handle()->socket());
1010 EXPECT_FALSE(request(1)->handle()->socket());
1011
1012 request(1)->handle()->SetPriority(MEDIUM);
1013
1014 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1015
1016 EXPECT_TRUE(request(1)->handle()->socket());
1017}
1018
1019// Reprioritize a request up past another one and make sure that changes the
1020// completion order.
1021TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1022 CreatePool(kDefaultMaxSockets, 1);
1023
1024 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1025 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1026 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1027 EXPECT_TRUE(request(0)->handle()->socket());
1028 EXPECT_FALSE(request(1)->handle()->socket());
1029 EXPECT_FALSE(request(2)->handle()->socket());
1030
1031 request(2)->handle()->SetPriority(HIGHEST);
1032
1033 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1034
1035 EXPECT_EQ(1, GetOrderOfRequest(1));
1036 EXPECT_EQ(3, GetOrderOfRequest(2));
1037 EXPECT_EQ(2, GetOrderOfRequest(3));
1038}
1039
1040// Reprioritize a request without changing relative priorities and check
1041// that the order doesn't change.
1042TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1043 CreatePool(kDefaultMaxSockets, 1);
1044
1045 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1046 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1047 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1048 EXPECT_TRUE(request(0)->handle()->socket());
1049 EXPECT_FALSE(request(1)->handle()->socket());
1050 EXPECT_FALSE(request(2)->handle()->socket());
1051
1052 request(2)->handle()->SetPriority(MEDIUM);
1053
1054 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1055
1056 EXPECT_EQ(1, GetOrderOfRequest(1));
1057 EXPECT_EQ(2, GetOrderOfRequest(2));
1058 EXPECT_EQ(3, GetOrderOfRequest(3));
1059}
1060
1061// Reprioritize a request past down another one and make sure that changes the
1062// completion order.
1063TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1064 CreatePool(kDefaultMaxSockets, 1);
1065
1066 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1067 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1068 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1069 EXPECT_TRUE(request(0)->handle()->socket());
1070 EXPECT_FALSE(request(1)->handle()->socket());
1071 EXPECT_FALSE(request(2)->handle()->socket());
1072
1073 request(1)->handle()->SetPriority(LOW);
1074
1075 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1076
1077 EXPECT_EQ(1, GetOrderOfRequest(1));
1078 EXPECT_EQ(3, GetOrderOfRequest(2));
1079 EXPECT_EQ(2, GetOrderOfRequest(3));
1080}
1081
1082// Reprioritize a request to the same level as another and confirm it is
1083// put after the old request.
1084TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1085 CreatePool(kDefaultMaxSockets, 1);
1086
1087 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1088 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1089 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1090 EXPECT_TRUE(request(0)->handle()->socket());
1091 EXPECT_FALSE(request(1)->handle()->socket());
1092 EXPECT_FALSE(request(2)->handle()->socket());
1093
1094 request(1)->handle()->SetPriority(MEDIUM);
1095
1096 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1097
1098 EXPECT_EQ(1, GetOrderOfRequest(1));
1099 EXPECT_EQ(3, GetOrderOfRequest(2));
1100 EXPECT_EQ(2, GetOrderOfRequest(3));
1101}
1102
[email protected]211d21722009-07-22 15:48:531103TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
xunjieli26619e72016-11-23 19:39:551104 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:531105 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1106
robpercival214763f2016-07-01 23:27:011107 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
1108 EXPECT_THAT(StartRequest("a", LOW), IsOk());
1109 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
1110 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531111
[email protected]2431756e2010-09-29 20:26:131112 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531113 client_socket_factory_.allocation_count());
1114
robpercival214763f2016-07-01 23:27:011115 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1116 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1117 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531118
[email protected]2431756e2010-09-29 20:26:131119 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:551120 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1121 testing::ElementsAre(
1122 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 7)));
[email protected]211d21722009-07-22 15:48:531123
[email protected]2431756e2010-09-29 20:26:131124 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531125 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131126 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531127
1128 // First 4 requests don't have to wait, and finish in order.
1129 EXPECT_EQ(1, GetOrderOfRequest(1));
1130 EXPECT_EQ(2, GetOrderOfRequest(2));
1131 EXPECT_EQ(3, GetOrderOfRequest(3));
1132 EXPECT_EQ(4, GetOrderOfRequest(4));
1133
1134 // Request ("b", 7) has the highest priority, but we can't make new socket for
1135 // group "b", because it has reached the per-group limit. Then we make
1136 // socket for ("c", 6), because it has higher priority than ("a", 4),
1137 // and we still can't make a socket for group "b".
1138 EXPECT_EQ(5, GetOrderOfRequest(5));
1139 EXPECT_EQ(6, GetOrderOfRequest(6));
1140 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171141
1142 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131143 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531144}
1145
1146// Make sure that we count connecting sockets against the total limit.
1147TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
xunjieli26619e72016-11-23 19:39:551148 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:531149 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1150
robpercival214763f2016-07-01 23:27:011151 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1152 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1153 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531154
1155 // Create one asynchronous request.
1156 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011157 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531158
[email protected]6b175382009-10-13 06:47:471159 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1160 // actually become pending until 2ms after they have been created. In order
1161 // to flush all tasks, we need to wait so that we know there are no
1162 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:001163 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281164 base::RunLoop().RunUntilIdle();
[email protected]6b175382009-10-13 06:47:471165
[email protected]211d21722009-07-22 15:48:531166 // The next synchronous request should wait for its turn.
1167 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011168 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531169
[email protected]2431756e2010-09-29 20:26:131170 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:551171 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1172 testing::ElementsAre(
1173 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 5)));
[email protected]211d21722009-07-22 15:48:531174
[email protected]2431756e2010-09-29 20:26:131175 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531176 client_socket_factory_.allocation_count());
1177
1178 EXPECT_EQ(1, GetOrderOfRequest(1));
1179 EXPECT_EQ(2, GetOrderOfRequest(2));
1180 EXPECT_EQ(3, GetOrderOfRequest(3));
1181 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171182 EXPECT_EQ(5, GetOrderOfRequest(5));
1183
1184 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131185 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531186}
1187
[email protected]6427fe22010-04-16 22:27:411188TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
xunjieli26619e72016-11-23 19:39:551189 base::HistogramTester histograms;
[email protected]6427fe22010-04-16 22:27:411190 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1191 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1192
robpercival214763f2016-07-01 23:27:011193 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1194 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1195 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1196 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411197
1198 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1199
1200 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1201
robpercival214763f2016-07-01 23:27:011202 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1203 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411204
1205 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1206
[email protected]2431756e2010-09-29 20:26:131207 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
xunjieli26619e72016-11-23 19:39:551208 EXPECT_THAT(
1209 histograms.GetAllSamples(kIdleSocketFateHistogram),
1210 testing::ElementsAre(base::Bucket(/*IDLE_SOCKET_FATE_CLOSE_ONE=*/8, 1)));
[email protected]6427fe22010-04-16 22:27:411211 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131212 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
xunjieli26619e72016-11-23 19:39:551213 EXPECT_THAT(
1214 histograms.GetAllSamples(kIdleSocketFateHistogram),
1215 testing::ElementsAre(base::Bucket(/*IDLE_SOCKET_FATE_CLOSE_ONE=*/8, 2)));
[email protected]6427fe22010-04-16 22:27:411216 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131217 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1218 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411219 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
xunjieli26619e72016-11-23 19:39:551220 EXPECT_THAT(
1221 histograms.GetAllSamples(kIdleSocketFateHistogram),
1222 testing::ElementsAre(base::Bucket(/*IDLE_SOCKET_FATE_CLOSE_ONE=*/8, 2)));
[email protected]6427fe22010-04-16 22:27:411223}
1224
[email protected]d7027bb2010-05-10 18:58:541225TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1226 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1227 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1228
1229 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521230 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131231 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151232 handle.Init("a", params_, DEFAULT_PRIORITY,
1233 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201234 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541235
1236 ClientSocketHandle handles[4];
1237 for (size_t i = 0; i < arraysize(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521238 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201239 EXPECT_EQ(
1240 ERR_IO_PENDING,
1241 handles[i].Init("b", params_, DEFAULT_PRIORITY,
1242 ClientSocketPool::RespectLimits::ENABLED,
1243 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541244 }
1245
1246 // One will be stalled, cancel all the handles now.
1247 // This should hit the OnAvailableSocketSlot() code where we previously had
1248 // stalled groups, but no longer have any.
1249 for (size_t i = 0; i < arraysize(handles); ++i)
1250 handles[i].Reset();
1251}
1252
[email protected]eb5a99382010-07-11 03:18:261253TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541254 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1255 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1256
[email protected]eb5a99382010-07-11 03:18:261257 {
1258 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521259 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261260 for (int i = 0; i < kDefaultMaxSockets; ++i) {
tfarina428341112016-09-22 13:38:201261 EXPECT_EQ(OK,
1262 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1263 ClientSocketPool::RespectLimits::ENABLED,
1264 callbacks[i].callback(), pool_.get(),
1265 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261266 }
1267
1268 // Force a stalled group.
1269 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521270 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201271 EXPECT_EQ(ERR_IO_PENDING,
1272 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1273 ClientSocketPool::RespectLimits::ENABLED,
1274 callback.callback(), pool_.get(),
1275 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261276
1277 // Cancel the stalled request.
1278 stalled_handle.Reset();
1279
1280 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1281 EXPECT_EQ(0, pool_->IdleSocketCount());
1282
1283 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541284 }
1285
[email protected]43a21b82010-06-10 21:30:541286 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1287 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261288}
[email protected]43a21b82010-06-10 21:30:541289
[email protected]eb5a99382010-07-11 03:18:261290TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1291 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1292 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1293
1294 {
1295 ClientSocketHandle handles[kDefaultMaxSockets];
1296 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521297 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201298 EXPECT_EQ(ERR_IO_PENDING,
1299 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1300 ClientSocketPool::RespectLimits::ENABLED,
1301 callback.callback(), pool_.get(),
1302 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261303 }
1304
1305 // Force a stalled group.
1306 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1307 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521308 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201309 EXPECT_EQ(ERR_IO_PENDING,
1310 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1311 ClientSocketPool::RespectLimits::ENABLED,
1312 callback.callback(), pool_.get(),
1313 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261314
1315 // Since it is stalled, it should have no connect jobs.
1316 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101317 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261318
1319 // Cancel the stalled request.
1320 handles[0].Reset();
1321
[email protected]eb5a99382010-07-11 03:18:261322 // Now we should have a connect job.
1323 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101324 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261325
1326 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011327 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261328
1329 EXPECT_EQ(kDefaultMaxSockets + 1,
1330 client_socket_factory_.allocation_count());
1331 EXPECT_EQ(0, pool_->IdleSocketCount());
1332 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101333 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261334
1335 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541336 }
1337
[email protected]eb5a99382010-07-11 03:18:261338 EXPECT_EQ(1, pool_->IdleSocketCount());
1339}
[email protected]43a21b82010-06-10 21:30:541340
[email protected]eb5a99382010-07-11 03:18:261341TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1342 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1343 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541344
[email protected]eb5a99382010-07-11 03:18:261345 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521346 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261347 {
[email protected]51fdc7c2012-04-10 19:19:481348 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261349 ClientSocketHandle handles[kDefaultMaxSockets];
1350 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521351 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201352 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
1353 params_, DEFAULT_PRIORITY,
1354 ClientSocketPool::RespectLimits::ENABLED,
1355 callback.callback(), pool_.get(),
1356 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261357 }
1358
1359 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1360 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481361 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261362
1363 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201364 EXPECT_EQ(ERR_IO_PENDING,
1365 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1366 ClientSocketPool::RespectLimits::ENABLED,
1367 callback.callback(), pool_.get(),
1368 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481369 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261370
1371 // Dropping out of scope will close all handles and return them to idle.
1372 }
[email protected]43a21b82010-06-10 21:30:541373
1374 // But if we wait for it, the released idle sockets will be closed in
1375 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011376 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261377
1378 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1379 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541380}
1381
1382// Regression test for http://crbug.com/40952.
1383TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
xunjieli26619e72016-11-23 19:39:551384 base::HistogramTester histograms;
[email protected]43a21b82010-06-10 21:30:541385 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221386 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541387 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1388
1389 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1390 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521391 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201392 EXPECT_EQ(
1393 OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1394 ClientSocketPool::RespectLimits::ENABLED,
1395 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541396 }
1397
1398 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281399 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541400
1401 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1402 // reuse a socket.
1403 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1404 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521405 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541406
1407 // "0" is special here, since it should be the first entry in the sorted map,
1408 // which is the one which we would close an idle socket for. We shouldn't
1409 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201410 EXPECT_EQ(OK,
1411 handle.Init("0", params_, DEFAULT_PRIORITY,
1412 ClientSocketPool::RespectLimits::ENABLED,
1413 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541414
xunjieli26619e72016-11-23 19:39:551415 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1416 testing::ElementsAre(
1417 base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 1)));
[email protected]43a21b82010-06-10 21:30:541418 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1419 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1420}
1421
[email protected]ab838892009-06-30 18:49:051422TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
xunjieli26619e72016-11-23 19:39:551423 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:531424 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091425
robpercival214763f2016-07-01 23:27:011426 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1427 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1428 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1429 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1430 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1431 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1432 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1433 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091434
[email protected]2431756e2010-09-29 20:26:131435 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:551436 // 2 sockets reused for last 6 requests.
1437 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1438 testing::ElementsAre(
1439 base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 6)));
[email protected]f6d1d6eb2009-06-24 20:16:091440
[email protected]c9d6a1d2009-07-14 16:15:201441 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1442 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131443 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1444 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091445
[email protected]c9d6a1d2009-07-14 16:15:201446 EXPECT_EQ(1, GetOrderOfRequest(1));
1447 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031448 EXPECT_EQ(8, GetOrderOfRequest(3));
1449 EXPECT_EQ(6, GetOrderOfRequest(4));
1450 EXPECT_EQ(4, GetOrderOfRequest(5));
1451 EXPECT_EQ(3, GetOrderOfRequest(6));
1452 EXPECT_EQ(5, GetOrderOfRequest(7));
1453 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171454
1455 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131456 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091457}
1458
[email protected]ab838892009-06-30 18:49:051459TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
xunjieli26619e72016-11-23 19:39:551460 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:531461 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091462
robpercival214763f2016-07-01 23:27:011463 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1464 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1465 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1466 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1467 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1468 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1469 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091470
[email protected]2431756e2010-09-29 20:26:131471 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091472
[email protected]2431756e2010-09-29 20:26:131473 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011474 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201475
xunjieli26619e72016-11-23 19:39:551476 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1477 testing::ElementsAre(
1478 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABE=*/3, 7)));
[email protected]2431756e2010-09-29 20:26:131479 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201480 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131481 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1482 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091483}
1484
1485// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051486// The pending connect job will be cancelled and should not call back into
1487// ClientSocketPoolBase.
1488TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531489 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201490
[email protected]ab838892009-06-30 18:49:051491 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131492 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521493 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151494 EXPECT_EQ(ERR_IO_PENDING,
1495 handle.Init("a", params_, DEFAULT_PRIORITY,
1496 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201497 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131498 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091499}
1500
[email protected]ab838892009-06-30 18:49:051501TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531502 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201503
[email protected]ab838892009-06-30 18:49:051504 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061505 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521506 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091507
mmenked3641e12016-01-28 16:06:151508 EXPECT_EQ(ERR_IO_PENDING,
1509 handle.Init("a", params_, DEFAULT_PRIORITY,
1510 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201511 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091512
1513 handle.Reset();
1514
[email protected]6ecf2b92011-12-15 01:14:521515 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131516 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151517 handle.Init("a", params_, DEFAULT_PRIORITY,
1518 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201519 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091520
robpercival214763f2016-07-01 23:27:011521 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091522 EXPECT_FALSE(callback.have_result());
1523
1524 handle.Reset();
1525}
1526
[email protected]ab838892009-06-30 18:49:051527TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
xunjieli26619e72016-11-23 19:39:551528 base::HistogramTester histograms;
[email protected]211d21722009-07-22 15:48:531529 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091530
robpercival214763f2016-07-01 23:27:011531 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1532 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1533 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1534 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1535 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1536 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1537 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091538
1539 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201540 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131541 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1542 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091543
[email protected]2431756e2010-09-29 20:26:131544 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
xunjieli26619e72016-11-23 19:39:551545 // 2 sockets reused for 4 requests.
1546 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1547 testing::ElementsAre(
1548 base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 4)));
[email protected]f6d1d6eb2009-06-24 20:16:091549
[email protected]c9d6a1d2009-07-14 16:15:201550 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1551 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131552 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1553 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091554
[email protected]c9d6a1d2009-07-14 16:15:201555 EXPECT_EQ(1, GetOrderOfRequest(1));
1556 EXPECT_EQ(2, GetOrderOfRequest(2));
1557 EXPECT_EQ(5, GetOrderOfRequest(3));
1558 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131559 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1560 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201561 EXPECT_EQ(4, GetOrderOfRequest(6));
1562 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171563
1564 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131565 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091566}
1567
mmenke33d24423d2015-05-19 19:41:091568// Function to be used as a callback on socket request completion. It first
1569// disconnects the successfully connected socket from the first request, and
1570// then reuses the ClientSocketHandle to request another socket.
1571//
1572// |nested_callback| is called with the result of the second socket request.
1573void RequestSocketOnComplete(ClientSocketHandle* handle,
1574 TestClientSocketPool* pool,
1575 TestConnectJobFactory* test_connect_job_factory,
1576 TestConnectJob::JobType next_job_type,
1577 const CompletionCallback& nested_callback,
1578 int first_request_result) {
robpercival214763f2016-07-01 23:27:011579 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091580
1581 test_connect_job_factory->set_job_type(next_job_type);
1582
1583 // Don't allow reuse of the socket. Disconnect it and then release it.
1584 if (handle->socket())
1585 handle->socket()->Disconnect();
1586 handle->Reset();
1587
mmenked3641e12016-01-28 16:06:151588 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091589 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151590 int rv = handle->Init("a", params, LOWEST,
1591 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201592 nested_callback, pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091593 if (rv != ERR_IO_PENDING) {
1594 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
1595 nested_callback.Run(rv);
1596 } else {
1597 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521598 }
mmenke33d24423d2015-05-19 19:41:091599}
[email protected]f6d1d6eb2009-06-24 20:16:091600
mmenke33d24423d2015-05-19 19:41:091601// Tests the case where a second socket is requested in a completion callback,
1602// and the second socket connects asynchronously. Reuses the same
1603// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581604TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531605 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201606
[email protected]0b7648c2009-07-06 20:14:011607 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061608 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091609 TestCompletionCallback second_result_callback;
1610 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151611 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091612 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1613 connect_job_factory_, TestConnectJob::kMockPendingJob,
1614 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201615 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011616 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091617
robpercival214763f2016-07-01 23:27:011618 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581619}
[email protected]f6d1d6eb2009-06-24 20:16:091620
mmenke33d24423d2015-05-19 19:41:091621// Tests the case where a second socket is requested in a completion callback,
1622// and the second socket connects synchronously. Reuses the same
1623// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581624TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531625 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201626
[email protected]0b7648c2009-07-06 20:14:011627 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061628 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091629 TestCompletionCallback second_result_callback;
1630 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151631 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091632 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1633 connect_job_factory_, TestConnectJob::kMockPendingJob,
1634 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201635 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011636 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581637
robpercival214763f2016-07-01 23:27:011638 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091639}
1640
1641// Make sure that pending requests get serviced after active requests get
1642// cancelled.
[email protected]ab838892009-06-30 18:49:051643TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531644 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201645
[email protected]0b7648c2009-07-06 20:14:011646 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091647
robpercival214763f2016-07-01 23:27:011648 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1649 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1650 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1651 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1652 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1653 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1654 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091655
[email protected]c9d6a1d2009-07-14 16:15:201656 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1657 // Let's cancel them.
1658 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131659 ASSERT_FALSE(request(i)->handle()->is_initialized());
1660 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091661 }
1662
[email protected]f6d1d6eb2009-06-24 20:16:091663 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131664 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011665 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131666 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091667 }
1668
[email protected]2431756e2010-09-29 20:26:131669 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1670 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091671}
1672
1673// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051674TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531675 const size_t kMaxSockets = 5;
1676 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201677
[email protected]0b7648c2009-07-06 20:14:011678 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091679
[email protected]211d21722009-07-22 15:48:531680 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1681 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091682
1683 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531684 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011685 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091686
[email protected]211d21722009-07-22 15:48:531687 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011688 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091689}
1690
mmenke9d72fe42017-05-18 22:36:071691// Make sure that pending requests that complete synchronously get serviced
1692// after active requests fail. See https://crbug.com/723748
1693TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1694 const size_t kNumberOfRequests = 10;
1695 const size_t kMaxSockets = 1;
1696 CreatePool(kMaxSockets, kMaxSockets);
1697
1698 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1699
1700 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1701
1702 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1703
1704 // Queue up all the other requests
1705 for (size_t i = 1; i < kNumberOfRequests; ++i)
1706 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1707
1708 // Make sure all requests fail, instead of hanging.
1709 for (size_t i = 0; i < kNumberOfRequests; ++i)
1710 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1711}
1712
[email protected]5fc08e32009-07-15 17:09:571713TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531714 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571715
1716 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1717
[email protected]2431756e2010-09-29 20:26:131718 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521719 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151720 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1721 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201722 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011723 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571724
1725 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131726 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571727
mmenked3641e12016-01-28 16:06:151728 rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1729 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201730 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011731 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1732 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571733
[email protected]2431756e2010-09-29 20:26:131734 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481735 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571736 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1737}
1738
xunjieli26619e72016-11-23 19:39:551739TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
1740 base::HistogramTester histograms;
1741 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1742 ClientSocketHandle handle;
1743 TestCompletionCallback callback;
1744 BoundTestNetLog log;
1745 int rv = handle.Init("a", params_, LOWEST,
1746 ClientSocketPool::RespectLimits::ENABLED,
1747 callback.callback(), pool_.get(), log.bound());
1748 EXPECT_THAT(rv, IsOk());
1749 handle.Reset();
1750 EXPECT_EQ(1, pool_->IdleSocketCount());
1751 pool_->CloseIdleSockets();
1752 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1753 testing::ElementsAre(
1754 base::Bucket(/*IDLE_SOCKET_FATE_CLEAN_UP_FORCED=*/4, 1)));
1755}
1756
xunjieli92feb332017-03-03 17:19:231757TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
1758 base::HistogramTester histograms;
1759 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1760 TestCompletionCallback callback;
1761 BoundTestNetLog log;
1762 ClientSocketHandle handle1;
1763 int rv = handle1.Init("a", params_, LOWEST,
1764 ClientSocketPool::RespectLimits::ENABLED,
1765 callback.callback(), pool_.get(), log.bound());
1766 EXPECT_THAT(rv, IsOk());
1767 ClientSocketHandle handle2;
1768 rv = handle2.Init("a", params_, LOWEST,
1769 ClientSocketPool::RespectLimits::ENABLED,
1770 callback.callback(), pool_.get(), log.bound());
1771 ClientSocketHandle handle3;
1772 rv = handle3.Init("b", params_, LOWEST,
1773 ClientSocketPool::RespectLimits::ENABLED,
1774 callback.callback(), pool_.get(), log.bound());
1775 EXPECT_THAT(rv, IsOk());
1776 handle1.Reset();
1777 handle2.Reset();
1778 handle3.Reset();
1779 EXPECT_EQ(3, pool_->IdleSocketCount());
1780 pool_->CloseIdleSocketsInGroup("a");
1781 EXPECT_EQ(1, pool_->IdleSocketCount());
1782 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1783 testing::ElementsAre(
1784 base::Bucket(/*IDLE_SOCKET_FATE_CLEAN_UP_FORCED=*/4, 2)));
1785}
1786
xunjieli26619e72016-11-23 19:39:551787TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
1788 base::HistogramTester histograms;
1789 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1790 ClientSocketHandle handle;
1791 TestCompletionCallback callback;
1792 BoundTestNetLog log;
1793 int rv = handle.Init("a", params_, LOWEST,
1794 ClientSocketPool::RespectLimits::ENABLED,
1795 callback.callback(), pool_.get(), log.bound());
1796 EXPECT_THAT(rv, IsOk());
1797 StreamSocket* socket = handle.socket();
1798 handle.Reset();
1799 EXPECT_EQ(1, pool_->IdleSocketCount());
1800
1801 // Disconnect socket now to make the socket unusable.
1802 socket->Disconnect();
1803 ClientSocketHandle handle2;
1804 rv = handle2.Init("a", params_, LOWEST,
1805 ClientSocketPool::RespectLimits::ENABLED,
1806 callback.callback(), pool_.get(), log.bound());
1807 EXPECT_THAT(rv, IsOk());
1808 EXPECT_FALSE(handle2.is_reused());
1809
1810 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1811 testing::ElementsAre(
1812 base::Bucket(/*IDLE_SOCKET_FATE_CLEAN_UP_UNUSABLE=*/7, 1)));
1813}
1814
[email protected]2b7523d2009-07-29 20:29:231815// Regression test for http://crbug.com/17985.
1816TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
xunjieli26619e72016-11-23 19:39:551817 base::HistogramTester histograms;
[email protected]2b7523d2009-07-29 20:29:231818 const int kMaxSockets = 3;
1819 const int kMaxSocketsPerGroup = 2;
1820 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1821
[email protected]ac790b42009-12-02 04:31:311822 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231823
robpercival214763f2016-07-01 23:27:011824 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1825 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231826
1827 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011828 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231829
1830 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011831 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231832
1833 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011834 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1835 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231836
[email protected]eb5a99382010-07-11 03:18:261837 // Release the first two sockets from "a". Because this is a keepalive,
1838 // the first release will unblock the pending request for "a". The
1839 // second release will unblock a request for "c", becaue it is the next
1840 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131841 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
xunjieli26619e72016-11-23 19:39:551842 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
1843 testing::ElementsAre(
1844 base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 1)));
[email protected]2431756e2010-09-29 20:26:131845 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
xunjieli26619e72016-11-23 19:39:551846 EXPECT_THAT(
1847 histograms.GetAllSamples(kIdleSocketFateHistogram),
1848 testing::ElementsAre(base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 1),
1849 base::Bucket(/*IDLE_SOCKET_FATE_CLOSE_ONE=*/8, 1)));
[email protected]2b7523d2009-07-29 20:29:231850
1851 // Closing idle sockets should not get us into trouble, but in the bug
1852 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411853 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541854 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261855
[email protected]2da659e2013-05-23 20:51:341856 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281857 base::RunLoop().RunUntilIdle();
xunjieli26619e72016-11-23 19:39:551858 EXPECT_THAT(
1859 histograms.GetAllSamples(kIdleSocketFateHistogram),
1860 testing::ElementsAre(base::Bucket(/*IDLE_SOCKET_FATE_REUSE_UNUSED=*/1, 1),
1861 base::Bucket(/*IDLE_SOCKET_FATE_CLOSE_ONE=*/8, 1)));
[email protected]2b7523d2009-07-29 20:29:231862}
1863
[email protected]4d3b05d2010-01-27 21:27:291864TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531865 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571866
1867 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131868 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521869 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511870 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:151871 int rv = handle.Init("a", params_, LOWEST,
1872 ClientSocketPool::RespectLimits::ENABLED,
1873 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011874 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131875 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481876 TestLoadTimingInfoNotConnected(handle);
1877
robpercival214763f2016-07-01 23:27:011878 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131879 EXPECT_TRUE(handle.is_initialized());
1880 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481881 TestLoadTimingInfoConnectedNotReused(handle);
1882
[email protected]2431756e2010-09-29 20:26:131883 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481884 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301885
mmenke43758e62015-05-04 21:09:461886 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401887 log.GetEntries(&entries);
1888
1889 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001890 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171891 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001892 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1893 NetLogEventPhase::NONE));
1894 EXPECT_TRUE(LogContainsEvent(entries, 2,
1895 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1896 NetLogEventPhase::NONE));
1897 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571898}
1899
[email protected]4d3b05d2010-01-27 21:27:291900TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571901 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531902 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571903
1904 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131905 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521906 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511907 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181908 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131909 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431910 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451911 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131912 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151913 EXPECT_EQ(ERR_IO_PENDING,
1914 handle.Init("a", params_, DEFAULT_PRIORITY,
1915 ClientSocketPool::RespectLimits::ENABLED,
1916 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131917 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011918 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131919 EXPECT_FALSE(handle.is_ssl_error());
1920 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301921
mmenke43758e62015-05-04 21:09:461922 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401923 log.GetEntries(&entries);
1924
1925 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001926 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171927 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001928 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1929 NetLogEventPhase::NONE));
1930 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571931}
1932
mmenke6be122f2015-03-09 22:22:471933// Check that an async ConnectJob failure does not result in creation of a new
1934// ConnectJob when there's another pending request also waiting on its own
1935// ConnectJob. See http://crbug.com/463960.
1936TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1937 CreatePool(2, 2);
1938 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1939
robpercival214763f2016-07-01 23:27:011940 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1941 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471942
robpercival214763f2016-07-01 23:27:011943 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1944 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471945
1946 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1947}
1948
[email protected]4d3b05d2010-01-27 21:27:291949TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101950 // TODO(eroman): Add back the log expectations! Removed them because the
1951 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531952 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571953
1954 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131955 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521956 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131957 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521958 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571959
[email protected]2431756e2010-09-29 20:26:131960 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151961 handle.Init("a", params_, DEFAULT_PRIORITY,
1962 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201963 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511964 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201965 EXPECT_EQ(
1966 ERR_IO_PENDING,
1967 handle2.Init("a", params_, DEFAULT_PRIORITY,
1968 ClientSocketPool::RespectLimits::ENABLED,
1969 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571970
[email protected]2431756e2010-09-29 20:26:131971 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571972
[email protected]fd7b7c92009-08-20 19:38:301973
1974 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301975
robpercival214763f2016-07-01 23:27:011976 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131977 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301978
1979 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531980 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571981}
1982
[email protected]4d3b05d2010-01-27 21:27:291983TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341984 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1985
[email protected]17a0c6c2009-08-04 00:07:041986 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1987
robpercival214763f2016-07-01 23:27:011988 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1989 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1990 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1991 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341992
1993 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131994 (*requests())[2]->handle()->Reset();
1995 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341996 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1997
[email protected]2431756e2010-09-29 20:26:131998 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341999 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
2000
[email protected]2431756e2010-09-29 20:26:132001 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:262002 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:342003}
2004
[email protected]5fc08e32009-07-15 17:09:572005// When requests and ConnectJobs are not coupled, the request will get serviced
2006// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292007TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532008 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572009
2010 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322011 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572012
[email protected]2431756e2010-09-29 20:26:132013 std::vector<TestSocketRequest*> request_order;
2014 size_t completion_count; // unused
2015 TestSocketRequest req1(&request_order, &completion_count);
tfarina428341112016-09-22 13:38:202016 int rv = req1.handle()->Init(
2017 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
2018 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012019 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2020 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572021
2022 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2023 // without a job.
2024 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2025
[email protected]2431756e2010-09-29 20:26:132026 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:152027 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
2028 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202029 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012030 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132031 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:152032 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
2033 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202034 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012035 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572036
2037 // Both Requests 2 and 3 are pending. We release socket 1 which should
2038 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332039 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342040 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282041 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332042 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012043 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332044 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572045
2046 // Signal job 2, which should service request 3.
2047
2048 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012049 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572050
[email protected]2431756e2010-09-29 20:26:132051 ASSERT_EQ(3U, request_order.size());
2052 EXPECT_EQ(&req1, request_order[0]);
2053 EXPECT_EQ(&req2, request_order[1]);
2054 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572055 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2056}
2057
2058// The requests are not coupled to the jobs. So, the requests should finish in
2059// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292060TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532061 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572062 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322063 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572064
[email protected]2431756e2010-09-29 20:26:132065 std::vector<TestSocketRequest*> request_order;
2066 size_t completion_count; // unused
2067 TestSocketRequest req1(&request_order, &completion_count);
tfarina428341112016-09-22 13:38:202068 int rv = req1.handle()->Init(
2069 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
2070 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012071 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572072
[email protected]2431756e2010-09-29 20:26:132073 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:152074 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
2075 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202076 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012077 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572078
2079 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322080 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572081
[email protected]2431756e2010-09-29 20:26:132082 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:152083 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
2084 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202085 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012086 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572087
robpercival214763f2016-07-01 23:27:012088 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2089 EXPECT_THAT(req2.WaitForResult(), IsOk());
2090 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572091
[email protected]2431756e2010-09-29 20:26:132092 ASSERT_EQ(3U, request_order.size());
2093 EXPECT_EQ(&req1, request_order[0]);
2094 EXPECT_EQ(&req2, request_order[1]);
2095 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572096}
2097
[email protected]03b7c8c2013-07-20 04:38:552098// Test GetLoadState in the case there's only one socket request.
2099TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532100 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552101 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572102
[email protected]2431756e2010-09-29 20:26:132103 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522104 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152105 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2106 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202107 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012108 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552109 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572110
[email protected]03b7c8c2013-07-20 04:38:552111 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2112 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2113
2114 // No point in completing the connection, since ClientSocketHandles only
2115 // expect the LoadState to be checked while connecting.
2116}
2117
2118// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:002119// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:552120TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2121 CreatePool(2, 2);
2122 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2123
2124 ClientSocketHandle handle;
2125 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152126 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2127 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202128 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012129 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002130 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2131
2132 ClientSocketHandle handle2;
2133 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152134 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
2135 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202136 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012137 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002138 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2139
2140 // Check that both handles report the state of the first job.
2141 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2142 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2143
2144 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2145
2146 // Check that both handles change to LOAD_STATE_CONNECTING.
2147 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2148 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2149}
2150
2151// Test that the second connection request does not affect the pool's load
2152// status.
2153TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
2154 CreatePool(2, 2);
2155 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2156
2157 ClientSocketHandle handle;
2158 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152159 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2160 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202161 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012162 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572163
[email protected]2431756e2010-09-29 20:26:132164 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522165 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152166 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
2167 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202168 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012169 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002170 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552171
[email protected]03b7c8c2013-07-20 04:38:552172 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2173 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2174
haavardm835c1d62015-04-22 08:18:002175 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552176 // second handle switches to the state of the remaining ConnectJob.
2177 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012178 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002179 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552180}
2181
2182// Test GetLoadState in the case the per-group limit is reached.
2183TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2184 CreatePool(2, 1);
2185 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2186
2187 ClientSocketHandle handle;
2188 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152189 int rv = handle.Init("a", params_, MEDIUM,
2190 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202191 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012192 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552193 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2194
2195 // Request another socket from the same pool, buth with a higher priority.
2196 // The first request should now be stalled at the socket group limit.
2197 ClientSocketHandle handle2;
2198 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152199 rv = handle2.Init("a", params_, HIGHEST,
2200 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202201 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012202 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552203 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2204 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2205
2206 // The first handle should remain stalled as the other socket goes through
2207 // the connect process.
2208
2209 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2210 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2211 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2212
2213 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012214 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552215 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2216
2217 // Closing the second socket should cause the stalled handle to finally get a
2218 // ConnectJob.
2219 handle2.socket()->Disconnect();
2220 handle2.Reset();
2221 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2222}
2223
2224// Test GetLoadState in the case the per-pool limit is reached.
2225TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2226 CreatePool(2, 2);
2227 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2228
2229 ClientSocketHandle handle;
2230 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152231 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
2232 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202233 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012234 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552235
2236 // Request for socket from another pool.
2237 ClientSocketHandle handle2;
2238 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152239 rv = handle2.Init("b", params_, DEFAULT_PRIORITY,
2240 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202241 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012242 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552243
2244 // Request another socket from the first pool. Request should stall at the
2245 // socket pool limit.
2246 ClientSocketHandle handle3;
2247 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152248 rv = handle3.Init("a", params_, DEFAULT_PRIORITY,
2249 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202250 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012251 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552252
2253 // The third handle should remain stalled as the other sockets in its group
2254 // goes through the connect process.
2255
2256 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2257 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2258
2259 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2260 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2261 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2262
2263 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012264 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552265 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2266
2267 // Closing a socket should allow the stalled handle to finally get a new
2268 // ConnectJob.
2269 handle.socket()->Disconnect();
2270 handle.Reset();
2271 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572272}
2273
[email protected]e772db3f2010-07-12 18:11:132274TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2275 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2276 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2277
[email protected]2431756e2010-09-29 20:26:132278 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522279 TestCompletionCallback callback;
2280 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
mmenked3641e12016-01-28 16:06:152281 handle.Init("a", params_, DEFAULT_PRIORITY,
2282 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202283 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132284 EXPECT_TRUE(handle.is_initialized());
2285 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132286}
2287
2288TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2289 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2290
2291 connect_job_factory_->set_job_type(
2292 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132293 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522294 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132295 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152296 handle.Init("a", params_, DEFAULT_PRIORITY,
2297 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202298 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132299 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012300 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132301 EXPECT_TRUE(handle.is_initialized());
2302 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132303}
2304
[email protected]e60e47a2010-07-14 03:37:182305TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2306 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2307 connect_job_factory_->set_job_type(
2308 TestConnectJob::kMockAdditionalErrorStateJob);
2309
[email protected]2431756e2010-09-29 20:26:132310 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522311 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132312 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:152313 handle.Init("a", params_, DEFAULT_PRIORITY,
2314 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202315 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132316 EXPECT_FALSE(handle.is_initialized());
2317 EXPECT_FALSE(handle.socket());
2318 EXPECT_TRUE(handle.is_ssl_error());
2319 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182320}
2321
2322TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2323 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2324
2325 connect_job_factory_->set_job_type(
2326 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132327 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522328 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132329 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152330 handle.Init("a", params_, DEFAULT_PRIORITY,
2331 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202332 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132333 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012334 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132335 EXPECT_FALSE(handle.is_initialized());
2336 EXPECT_FALSE(handle.socket());
2337 EXPECT_TRUE(handle.is_ssl_error());
2338 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182339}
2340
martijn003cd612016-05-19 22:24:382341// Make sure we can reuse sockets.
2342TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
xunjieli26619e72016-11-23 19:39:552343 base::HistogramTester histograms;
[email protected]64770b7d2011-11-16 04:30:412344 CreatePoolWithIdleTimeouts(
2345 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032346 base::TimeDelta(), // Time out unused sockets immediately.
2347 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2348
2349 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2350
2351 ClientSocketHandle handle;
2352 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152353 int rv = handle.Init("a", params_, LOWEST,
2354 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202355 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012356 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032357 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012358 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032359
2360 // Use and release the socket.
2361 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]034df0f32013-01-07 23:17:482362 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032363 handle.Reset();
2364
2365 // Should now have one idle socket.
2366 ASSERT_EQ(1, pool_->IdleSocketCount());
2367
2368 // Request a new socket. This should reuse the old socket and complete
2369 // synchronously.
vishal.b62985ca92015-04-17 08:45:512370 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:152371 rv = handle.Init("a", params_, LOWEST,
2372 ClientSocketPool::RespectLimits::ENABLED,
2373 CompletionCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012374 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032375 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482376 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032377
2378 ASSERT_TRUE(pool_->HasGroup("a"));
2379 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2380 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
xunjieli26619e72016-11-23 19:39:552381 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
2382 testing::ElementsAre(
2383 base::Bucket(/*IDLE_SOCKET_FATE_REUSE_REUSED=*/0, 1)));
[email protected]e7b1c6d2c2012-05-05 00:54:032384
mmenke43758e62015-05-04 21:09:462385 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032386 log.GetEntries(&entries);
2387 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002388 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032389}
2390
blundellb8163592f2015-12-16 14:22:422391#if defined(OS_IOS)
2392// TODO(droger): Enable this test (crbug.com/512595).
martijn003cd612016-05-19 22:24:382393#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2394 DISABLED_CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422395#else
martijn003cd612016-05-19 22:24:382396#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2397 CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422398#endif
martijn003cd612016-05-19 22:24:382399// Make sure we cleanup old unused sockets.
2400TEST_F(ClientSocketPoolBaseTest, MAYBE_CleanupTimedOutIdleSocketsNoReuse) {
xunjieli26619e72016-11-23 19:39:552401 base::HistogramTester histograms;
[email protected]e7b1c6d2c2012-05-05 00:54:032402 CreatePoolWithIdleTimeouts(
2403 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2404 base::TimeDelta(), // Time out unused sockets immediately
2405 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412406
2407 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2408
2409 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2410
2411 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522412 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152413 int rv = handle.Init("a", params_, LOWEST,
2414 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202415 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012416 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412417 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2418
2419 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522420 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152421 rv = handle2.Init("a", params_, LOWEST,
2422 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202423 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012424 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412425 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2426
2427 // Cancel one of the requests. Wait for the other, which will get the first
2428 // job. Release the socket. Run the loop again to make sure the second
2429 // socket is sitting idle and the first one is released (since ReleaseSocket()
2430 // just posts a DoReleaseSocket() task).
2431
2432 handle.Reset();
robpercival214763f2016-07-01 23:27:012433 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412434 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552435 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]64770b7d2011-11-16 04:30:412436 handle2.Reset();
2437
[email protected]e7b1c6d2c2012-05-05 00:54:032438 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2439 // actually become pending until 2ms after they have been created. In order
2440 // to flush all tasks, we need to wait so that we know there are no
2441 // soon-to-be-pending tasks waiting.
2442 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:282443 base::RunLoop().RunUntilIdle();
[email protected]64770b7d2011-11-16 04:30:412444
[email protected]e7b1c6d2c2012-05-05 00:54:032445 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412446 ASSERT_EQ(2, pool_->IdleSocketCount());
2447
2448 // Request a new socket. This should cleanup the unused and timed out ones.
2449 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512450 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522451 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152452 rv = handle.Init("a", params_, LOWEST,
2453 ClientSocketPool::RespectLimits::ENABLED,
2454 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012455 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2456 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412457 EXPECT_FALSE(handle.is_reused());
2458
xunjieli26619e72016-11-23 19:39:552459 EXPECT_THAT(
2460 histograms.GetAllSamples(kIdleSocketFateHistogram),
2461 testing::ElementsAre(
2462 base::Bucket(/*IDLE_SOCKET_FATE_CLEAN_UP_TIMED_OUT_REUSED=*/5, 1),
2463 base::Bucket(/*IDLE_SOCKET_FATE_CLEAN_UP_TIMED_OUT_UNUSED=*/6, 1)));
2464
[email protected]e7b1c6d2c2012-05-05 00:54:032465 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412466 ASSERT_TRUE(pool_->HasGroup("a"));
2467 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2468 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2469
mmenke43758e62015-05-04 21:09:462470 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412471 log.GetEntries(&entries);
2472 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002473 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412474}
2475
[email protected]2041cf342010-02-19 03:15:592476// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162477// because of multiple releasing disconnected sockets.
2478TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2479 CreatePoolWithIdleTimeouts(
2480 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2481 base::TimeDelta(), // Time out unused sockets immediately.
2482 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2483
2484 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2485
2486 // Startup 4 connect jobs. Two of them will be pending.
2487
[email protected]2431756e2010-09-29 20:26:132488 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522489 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152490 int rv = handle.Init("a", params_, LOWEST,
2491 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202492 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012493 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162494
[email protected]2431756e2010-09-29 20:26:132495 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522496 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152497 rv = handle2.Init("a", params_, LOWEST,
2498 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202499 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012500 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162501
[email protected]2431756e2010-09-29 20:26:132502 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522503 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152504 rv = handle3.Init("a", params_, LOWEST,
2505 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202506 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012507 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162508
[email protected]2431756e2010-09-29 20:26:132509 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522510 TestCompletionCallback callback4;
mmenked3641e12016-01-28 16:06:152511 rv = handle4.Init("a", params_, LOWEST,
2512 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202513 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012514 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162515
2516 // Release two disconnected sockets.
2517
[email protected]2431756e2010-09-29 20:26:132518 handle.socket()->Disconnect();
2519 handle.Reset();
2520 handle2.socket()->Disconnect();
2521 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162522
robpercival214763f2016-07-01 23:27:012523 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132524 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012525 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132526 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162527}
2528
[email protected]d7027bb2010-05-10 18:58:542529// Regression test for http://crbug.com/42267.
2530// When DoReleaseSocket() is processed for one socket, it is blocked because the
2531// other stalled groups all have releasing sockets, so no progress can be made.
2532TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2533 CreatePoolWithIdleTimeouts(
2534 4 /* socket limit */, 4 /* socket limit per group */,
2535 base::TimeDelta(), // Time out unused sockets immediately.
2536 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2537
2538 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2539
2540 // Max out the socket limit with 2 per group.
2541
[email protected]2431756e2010-09-29 20:26:132542 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522543 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132544 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522545 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542546
2547 for (int i = 0; i < 2; ++i) {
mmenked3641e12016-01-28 16:06:152548 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST,
2549 ClientSocketPool::RespectLimits::ENABLED,
2550 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202551 NetLogWithSource()));
mmenked3641e12016-01-28 16:06:152552 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST,
2553 ClientSocketPool::RespectLimits::ENABLED,
2554 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202555 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542556 }
[email protected]b89f7e42010-05-20 20:37:002557
[email protected]d7027bb2010-05-10 18:58:542558 // Make 4 pending requests, 2 per group.
2559
2560 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202561 EXPECT_EQ(ERR_IO_PENDING,
2562 handle_a[i].Init("a", params_, LOWEST,
2563 ClientSocketPool::RespectLimits::ENABLED,
2564 callback_a[i].callback(), pool_.get(),
2565 NetLogWithSource()));
2566 EXPECT_EQ(ERR_IO_PENDING,
2567 handle_b[i].Init("b", params_, LOWEST,
2568 ClientSocketPool::RespectLimits::ENABLED,
2569 callback_b[i].callback(), pool_.get(),
2570 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542571 }
2572
2573 // Release b's socket first. The order is important, because in
2574 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2575 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2576 // first, which has a releasing socket, so it refuses to start up another
2577 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132578 handle_b[0].socket()->Disconnect();
2579 handle_b[0].Reset();
2580 handle_a[0].socket()->Disconnect();
2581 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542582
2583 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282584 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542585
[email protected]2431756e2010-09-29 20:26:132586 handle_b[1].socket()->Disconnect();
2587 handle_b[1].Reset();
2588 handle_a[1].socket()->Disconnect();
2589 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542590
2591 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012592 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2593 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542594 }
2595}
2596
[email protected]fd4fe0b2010-02-08 23:02:152597TEST_F(ClientSocketPoolBaseTest,
2598 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
xunjieli26619e72016-11-23 19:39:552599 base::HistogramTester histograms;
[email protected]fd4fe0b2010-02-08 23:02:152600 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2601
2602 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2603
robpercival214763f2016-07-01 23:27:012604 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2605 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2606 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2607 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152608
robpercival214763f2016-07-01 23:27:012609 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2610 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132611 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152612
2613 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132614 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012615 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
xunjieli26619e72016-11-23 19:39:552616 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
2617 testing::ElementsAre(
2618 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 1)));
[email protected]fd4fe0b2010-02-08 23:02:152619
[email protected]2431756e2010-09-29 20:26:132620 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012621 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132622 EXPECT_EQ(4u, completion_count());
xunjieli26619e72016-11-23 19:39:552623 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
2624 testing::ElementsAre(
2625 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 2)));
[email protected]fd4fe0b2010-02-08 23:02:152626
2627 EXPECT_EQ(1, GetOrderOfRequest(1));
2628 EXPECT_EQ(2, GetOrderOfRequest(2));
2629 EXPECT_EQ(3, GetOrderOfRequest(3));
2630 EXPECT_EQ(4, GetOrderOfRequest(4));
2631
2632 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132633 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152634}
2635
[email protected]6ecf2b92011-12-15 01:14:522636class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042637 public:
[email protected]2431756e2010-09-29 20:26:132638 TestReleasingSocketRequest(TestClientSocketPool* pool,
2639 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182640 bool reset_releasing_handle)
2641 : pool_(pool),
2642 expected_result_(expected_result),
[email protected]6ecf2b92011-12-15 01:14:522643 reset_releasing_handle_(reset_releasing_handle),
[email protected]aa249b52013-04-30 01:04:322644 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete,
2645 base::Unretained(this))) {
[email protected]6ecf2b92011-12-15 01:14:522646 }
2647
dchengb03027d2014-10-21 12:00:202648 ~TestReleasingSocketRequest() override {}
[email protected]4f1e4982010-03-02 18:31:042649
2650 ClientSocketHandle* handle() { return &handle_; }
2651
[email protected]6ecf2b92011-12-15 01:14:522652 const CompletionCallback& callback() const { return callback_; }
[email protected]4f1e4982010-03-02 18:31:042653
2654 private:
[email protected]6ecf2b92011-12-15 01:14:522655 void OnComplete(int result) {
2656 SetResult(result);
2657 if (reset_releasing_handle_)
2658 handle_.Reset();
2659
mmenked3641e12016-01-28 16:06:152660 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
[email protected]6ecf2b92011-12-15 01:14:522661 EXPECT_EQ(expected_result_,
[email protected]bb1c4662013-11-14 00:00:072662 handle2_.Init("a", con_params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:152663 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202664 callback2_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522665 }
2666
[email protected]2431756e2010-09-29 20:26:132667 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182668 int expected_result_;
2669 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042670 ClientSocketHandle handle_;
2671 ClientSocketHandle handle2_;
[email protected]6ecf2b92011-12-15 01:14:522672 CompletionCallback callback_;
2673 TestCompletionCallback callback2_;
[email protected]4f1e4982010-03-02 18:31:042674};
2675
[email protected]e60e47a2010-07-14 03:37:182676
2677TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2678 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2679
robpercival214763f2016-07-01 23:27:012680 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2681 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2682 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182683
[email protected]2431756e2010-09-29 20:26:132684 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182685 client_socket_factory_.allocation_count());
2686
2687 connect_job_factory_->set_job_type(
2688 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2689 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202690 EXPECT_EQ(
2691 ERR_IO_PENDING,
2692 req.handle()->Init("a", params_, DEFAULT_PRIORITY,
2693 ClientSocketPool::RespectLimits::ENABLED,
2694 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182695 // The next job should complete synchronously
2696 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2697
robpercival214763f2016-07-01 23:27:012698 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182699 EXPECT_FALSE(req.handle()->is_initialized());
2700 EXPECT_FALSE(req.handle()->socket());
2701 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432702 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182703}
2704
[email protected]b6501d3d2010-06-03 23:53:342705// http://crbug.com/44724 regression test.
2706// We start releasing the pool when we flush on network change. When that
2707// happens, the only active references are in the ClientSocketHandles. When a
2708// ConnectJob completes and calls back into the last ClientSocketHandle, that
2709// callback can release the last reference and delete the pool. After the
2710// callback finishes, we go back to the stack frame within the now-deleted pool.
2711// Executing any code that refers to members of the now-deleted pool can cause
2712// crashes.
2713TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2714 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2715 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2716
2717 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522718 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152719 EXPECT_EQ(ERR_IO_PENDING,
2720 handle.Init("a", params_, DEFAULT_PRIORITY,
2721 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202722 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342723
[email protected]7af985a2012-12-14 22:40:422724 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342725
2726 // We'll call back into this now.
2727 callback.WaitForResult();
2728}
2729
[email protected]a7e38572010-06-07 18:22:242730TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2731 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2732 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2733
2734 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522735 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152736 EXPECT_EQ(ERR_IO_PENDING,
2737 handle.Init("a", params_, DEFAULT_PRIORITY,
2738 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202739 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012740 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242741 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2742
[email protected]7af985a2012-12-14 22:40:422743 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242744
2745 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282746 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242747
mmenked3641e12016-01-28 16:06:152748 EXPECT_EQ(ERR_IO_PENDING,
2749 handle.Init("a", params_, DEFAULT_PRIORITY,
2750 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202751 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012752 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242753 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2754}
2755
[email protected]6ecf2b92011-12-15 01:14:522756class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142757 public:
2758 ConnectWithinCallback(
2759 const std::string& group_name,
2760 const scoped_refptr<TestSocketParams>& params,
[email protected]2431756e2010-09-29 20:26:132761 TestClientSocketPool* pool)
[email protected]6ecf2b92011-12-15 01:14:522762 : group_name_(group_name),
2763 params_(params),
2764 pool_(pool),
[email protected]aa249b52013-04-30 01:04:322765 callback_(base::Bind(&ConnectWithinCallback::OnComplete,
2766 base::Unretained(this))) {
[email protected]06f92462010-08-31 19:24:142767 }
2768
dchengb03027d2014-10-21 12:00:202769 ~ConnectWithinCallback() override {}
[email protected]06f92462010-08-31 19:24:142770
2771 int WaitForNestedResult() {
2772 return nested_callback_.WaitForResult();
2773 }
2774
[email protected]6ecf2b92011-12-15 01:14:522775 const CompletionCallback& callback() const { return callback_; }
2776
[email protected]06f92462010-08-31 19:24:142777 private:
[email protected]6ecf2b92011-12-15 01:14:522778 void OnComplete(int result) {
2779 SetResult(result);
tfarina428341112016-09-22 13:38:202780 EXPECT_EQ(
2781 ERR_IO_PENDING,
2782 handle_.Init(group_name_, params_, DEFAULT_PRIORITY,
2783 ClientSocketPool::RespectLimits::ENABLED,
2784 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522785 }
2786
[email protected]06f92462010-08-31 19:24:142787 const std::string group_name_;
2788 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132789 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142790 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522791 CompletionCallback callback_;
2792 TestCompletionCallback nested_callback_;
2793
2794 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142795};
2796
2797TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2798 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2799
2800 // First job will be waiting until it gets aborted.
2801 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2802
2803 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132804 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152805 EXPECT_EQ(ERR_IO_PENDING,
2806 handle.Init("a", params_, DEFAULT_PRIORITY,
2807 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202808 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142809
2810 // Second job will be started during the first callback, and will
2811 // asynchronously complete with OK.
2812 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422813 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012814 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2815 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142816}
2817
[email protected]25eea382010-07-10 23:55:262818// Cancel a pending socket request while we're at max sockets,
2819// and verify that the backup socket firing doesn't cause a crash.
2820TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2821 // Max 4 sockets globally, max 4 sockets per group.
2822 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222823 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262824
[email protected]4baaf9d2010-08-31 15:15:442825 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2826 // timer.
[email protected]25eea382010-07-10 23:55:262827 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2828 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522829 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152830 EXPECT_EQ(ERR_IO_PENDING,
2831 handle.Init("bar", params_, DEFAULT_PRIORITY,
2832 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202833 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262834
2835 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2836 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2837 ClientSocketHandle handles[kDefaultMaxSockets];
2838 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522839 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:202840 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY,
2841 ClientSocketPool::RespectLimits::ENABLED,
2842 callback.callback(), pool_.get(),
2843 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262844 }
2845
fdoray5eeb7642016-06-22 16:11:282846 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262847
2848 // Cancel the pending request.
2849 handle.Reset();
2850
2851 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002852 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2853 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262854
fdoray5eeb7642016-06-22 16:11:282855 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262856 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2857}
2858
[email protected]3f00be82010-09-27 19:50:022859TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442860 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2861 pool_->EnableConnectBackupJobs();
2862
2863 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2864 // timer.
2865 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2866 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522867 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152868 EXPECT_EQ(ERR_IO_PENDING,
2869 handle.Init("bar", params_, DEFAULT_PRIORITY,
2870 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202871 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442872 ASSERT_TRUE(pool_->HasGroup("bar"));
2873 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102874 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442875
2876 // Cancel the socket request. This should cancel the backup timer. Wait for
2877 // the backup time to see if it indeed got canceled.
2878 handle.Reset();
2879 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002880 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2881 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282882 base::RunLoop().RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442883 ASSERT_TRUE(pool_->HasGroup("bar"));
2884 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2885}
2886
[email protected]3f00be82010-09-27 19:50:022887TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2888 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2889 pool_->EnableConnectBackupJobs();
2890
2891 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2892 // timer.
2893 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2894 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522895 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152896 EXPECT_EQ(ERR_IO_PENDING,
2897 handle.Init("bar", params_, DEFAULT_PRIORITY,
2898 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202899 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022900 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2901 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522902 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202903 EXPECT_EQ(
2904 ERR_IO_PENDING,
2905 handle2.Init("bar", params_, DEFAULT_PRIORITY,
2906 ClientSocketPool::RespectLimits::ENABLED,
2907 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022908 ASSERT_TRUE(pool_->HasGroup("bar"));
2909 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2910
2911 // Cancel request 1 and then complete request 2. With the requests finished,
2912 // the backup timer should be cancelled.
2913 handle.Reset();
robpercival214763f2016-07-01 23:27:012914 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022915 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002916 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2917 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282918 base::RunLoop().RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022919}
2920
[email protected]eb5a99382010-07-11 03:18:262921// Test delayed socket binding for the case where we have two connects,
2922// and while one is waiting on a connect, the other frees up.
2923// The socket waiting on a connect should switch immediately to the freed
2924// up socket.
2925TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2926 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2927 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2928
2929 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522930 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132931 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152932 handle1.Init("a", params_, DEFAULT_PRIORITY,
2933 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202934 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012935 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262936
2937 // No idle sockets, no pending jobs.
2938 EXPECT_EQ(0, pool_->IdleSocketCount());
2939 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2940
2941 // Create a second socket to the same host, but this one will wait.
2942 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2943 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132944 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152945 handle2.Init("a", params_, DEFAULT_PRIORITY,
2946 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202947 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262948 // No idle sockets, and one connecting job.
2949 EXPECT_EQ(0, pool_->IdleSocketCount());
2950 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2951
2952 // Return the first handle to the pool. This will initiate the delayed
2953 // binding.
2954 handle1.Reset();
2955
fdoray5eeb7642016-06-22 16:11:282956 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262957
2958 // Still no idle sockets, still one pending connect job.
2959 EXPECT_EQ(0, pool_->IdleSocketCount());
2960 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2961
2962 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012963 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262964
2965 // And we can see there is still one job waiting.
2966 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2967
2968 // Finally, signal the waiting Connect.
2969 client_socket_factory_.SignalJobs();
2970 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2971
fdoray5eeb7642016-06-22 16:11:282972 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262973}
2974
2975// Test delayed socket binding when a group is at capacity and one
2976// of the group's sockets frees up.
2977TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2978 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2979 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2980
2981 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522982 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132983 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152984 handle1.Init("a", params_, DEFAULT_PRIORITY,
2985 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202986 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012987 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262988
2989 // No idle sockets, no pending jobs.
2990 EXPECT_EQ(0, pool_->IdleSocketCount());
2991 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2992
2993 // Create a second socket to the same host, but this one will wait.
2994 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2995 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132996 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152997 handle2.Init("a", params_, DEFAULT_PRIORITY,
2998 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202999 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263000 // No idle sockets, and one connecting job.
3001 EXPECT_EQ(0, pool_->IdleSocketCount());
3002 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3003
3004 // Return the first handle to the pool. This will initiate the delayed
3005 // binding.
3006 handle1.Reset();
3007
fdoray5eeb7642016-06-22 16:11:283008 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263009
3010 // Still no idle sockets, still one pending connect job.
3011 EXPECT_EQ(0, pool_->IdleSocketCount());
3012 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3013
3014 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013015 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263016
3017 // And we can see there is still one job waiting.
3018 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3019
3020 // Finally, signal the waiting Connect.
3021 client_socket_factory_.SignalJobs();
3022 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3023
fdoray5eeb7642016-06-22 16:11:283024 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263025}
3026
3027// Test out the case where we have one socket connected, one
3028// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513029// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263030// should complete, by taking the first socket's idle socket.
3031TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3032 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3033 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3034
3035 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523036 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:133037 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:153038 handle1.Init("a", params_, DEFAULT_PRIORITY,
3039 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203040 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013041 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263042
3043 // No idle sockets, no pending jobs.
3044 EXPECT_EQ(0, pool_->IdleSocketCount());
3045 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3046
3047 // Create a second socket to the same host, but this one will wait.
3048 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3049 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:133050 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:153051 handle2.Init("a", params_, DEFAULT_PRIORITY,
3052 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203053 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263054 // No idle sockets, and one connecting job.
3055 EXPECT_EQ(0, pool_->IdleSocketCount());
3056 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3057
3058 // Return the first handle to the pool. This will initiate the delayed
3059 // binding.
3060 handle1.Reset();
3061
fdoray5eeb7642016-06-22 16:11:283062 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263063
3064 // Still no idle sockets, still one pending connect job.
3065 EXPECT_EQ(0, pool_->IdleSocketCount());
3066 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3067
3068 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013069 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263070
3071 // And we can see there is still one job waiting.
3072 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3073
3074 // Finally, signal the waiting Connect.
3075 client_socket_factory_.SignalJobs();
3076 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3077
fdoray5eeb7642016-06-22 16:11:283078 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263079}
3080
[email protected]2abfe90a2010-08-25 17:49:513081// Cover the case where on an available socket slot, we have one pending
3082// request that completes synchronously, thereby making the Group empty.
3083TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3084 const int kUnlimitedSockets = 100;
3085 const int kOneSocketPerGroup = 1;
3086 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3087
3088 // Make the first request asynchronous fail.
3089 // This will free up a socket slot later.
3090 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3091
3092 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523093 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203094 EXPECT_EQ(
3095 ERR_IO_PENDING,
3096 handle1.Init("a", params_, DEFAULT_PRIORITY,
3097 ClientSocketPool::RespectLimits::ENABLED,
3098 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513099 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3100
3101 // Make the second request synchronously fail. This should make the Group
3102 // empty.
3103 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3104 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523105 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513106 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3107 // when created.
tfarina428341112016-09-22 13:38:203108 EXPECT_EQ(
3109 ERR_IO_PENDING,
3110 handle2.Init("a", params_, DEFAULT_PRIORITY,
3111 ClientSocketPool::RespectLimits::ENABLED,
3112 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513113
3114 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3115
robpercival214763f2016-07-01 23:27:013116 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3117 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:513118 EXPECT_FALSE(pool_->HasGroup("a"));
3119}
3120
[email protected]e1b54dc2010-10-06 21:27:223121TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3122 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3123
3124 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3125
3126 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523127 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203128 EXPECT_EQ(
3129 ERR_IO_PENDING,
3130 handle1.Init("a", params_, DEFAULT_PRIORITY,
3131 ClientSocketPool::RespectLimits::ENABLED,
3132 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223133
3134 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523135 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203136 EXPECT_EQ(
3137 ERR_IO_PENDING,
3138 handle2.Init("a", params_, DEFAULT_PRIORITY,
3139 ClientSocketPool::RespectLimits::ENABLED,
3140 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223141 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523142 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203143 EXPECT_EQ(
3144 ERR_IO_PENDING,
3145 handle3.Init("a", params_, DEFAULT_PRIORITY,
3146 ClientSocketPool::RespectLimits::ENABLED,
3147 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223148
robpercival214763f2016-07-01 23:27:013149 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3150 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3151 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223152
3153 // Use the socket.
[email protected]83039bb2011-12-09 18:43:553154 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback()));
3155 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]e1b54dc2010-10-06 21:27:223156
3157 handle1.Reset();
3158 handle2.Reset();
3159 handle3.Reset();
3160
tfarina428341112016-09-22 13:38:203161 EXPECT_EQ(
3162 OK, handle1.Init("a", params_, DEFAULT_PRIORITY,
3163 ClientSocketPool::RespectLimits::ENABLED,
3164 callback1.callback(), pool_.get(), NetLogWithSource()));
3165 EXPECT_EQ(
3166 OK, handle2.Init("a", params_, DEFAULT_PRIORITY,
3167 ClientSocketPool::RespectLimits::ENABLED,
3168 callback2.callback(), pool_.get(), NetLogWithSource()));
3169 EXPECT_EQ(
3170 OK, handle3.Init("a", params_, DEFAULT_PRIORITY,
3171 ClientSocketPool::RespectLimits::ENABLED,
3172 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223173
3174 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3175 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3176 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3177}
3178
[email protected]2c2bef152010-10-13 00:55:033179TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3180 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3181 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3182
tfarina428341112016-09-22 13:38:203183 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033184
3185 ASSERT_TRUE(pool_->HasGroup("a"));
3186 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103187 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033188 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3189
3190 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523191 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203192 EXPECT_EQ(
3193 ERR_IO_PENDING,
3194 handle1.Init("a", params_, DEFAULT_PRIORITY,
3195 ClientSocketPool::RespectLimits::ENABLED,
3196 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033197
3198 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523199 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203200 EXPECT_EQ(
3201 ERR_IO_PENDING,
3202 handle2.Init("a", params_, DEFAULT_PRIORITY,
3203 ClientSocketPool::RespectLimits::ENABLED,
3204 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033205
3206 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103207 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033208 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3209
robpercival214763f2016-07-01 23:27:013210 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3211 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033212 handle1.Reset();
3213 handle2.Reset();
3214
3215 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103216 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033217 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3218}
3219
3220TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3221 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3222 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3223
3224 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523225 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203226 EXPECT_EQ(
3227 ERR_IO_PENDING,
3228 handle1.Init("a", params_, DEFAULT_PRIORITY,
3229 ClientSocketPool::RespectLimits::ENABLED,
3230 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033231
3232 ASSERT_TRUE(pool_->HasGroup("a"));
3233 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103234 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033235 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3236
tfarina428341112016-09-22 13:38:203237 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033238
3239 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103240 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033241 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3242
3243 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523244 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203245 EXPECT_EQ(
3246 ERR_IO_PENDING,
3247 handle2.Init("a", params_, DEFAULT_PRIORITY,
3248 ClientSocketPool::RespectLimits::ENABLED,
3249 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033250
3251 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103252 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033253 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3254
robpercival214763f2016-07-01 23:27:013255 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3256 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033257 handle1.Reset();
3258 handle2.Reset();
3259
3260 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103261 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033262 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3263}
3264
3265TEST_F(ClientSocketPoolBaseTest,
3266 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3267 CreatePool(4, 4);
3268 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3269
3270 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523271 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203272 EXPECT_EQ(
3273 ERR_IO_PENDING,
3274 handle1.Init("a", params_, DEFAULT_PRIORITY,
3275 ClientSocketPool::RespectLimits::ENABLED,
3276 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033277
3278 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523279 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203280 EXPECT_EQ(
3281 ERR_IO_PENDING,
3282 handle2.Init("a", params_, DEFAULT_PRIORITY,
3283 ClientSocketPool::RespectLimits::ENABLED,
3284 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033285
3286 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523287 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203288 EXPECT_EQ(
3289 ERR_IO_PENDING,
3290 handle3.Init("a", params_, DEFAULT_PRIORITY,
3291 ClientSocketPool::RespectLimits::ENABLED,
3292 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033293
3294 ASSERT_TRUE(pool_->HasGroup("a"));
3295 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103296 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033297 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3298
tfarina428341112016-09-22 13:38:203299 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033300
3301 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103302 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033303 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3304
robpercival214763f2016-07-01 23:27:013305 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3306 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3307 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033308 handle1.Reset();
3309 handle2.Reset();
3310 handle3.Reset();
3311
3312 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103313 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033314 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3315}
3316
3317TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3318 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3319 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3320
3321 ASSERT_FALSE(pool_->HasGroup("a"));
3322
tfarina428341112016-09-22 13:38:203323 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033324
3325 ASSERT_TRUE(pool_->HasGroup("a"));
3326 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103327 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033328
3329 ASSERT_FALSE(pool_->HasGroup("b"));
3330
tfarina428341112016-09-22 13:38:203331 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033332
3333 ASSERT_FALSE(pool_->HasGroup("b"));
3334}
3335
3336TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3337 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3338 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3339
3340 ASSERT_FALSE(pool_->HasGroup("a"));
3341
3342 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
tfarina428341112016-09-22 13:38:203343 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033344
3345 ASSERT_TRUE(pool_->HasGroup("a"));
3346 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103347 EXPECT_EQ(kDefaultMaxSockets - 1,
3348 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483349 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033350
3351 ASSERT_FALSE(pool_->HasGroup("b"));
3352
tfarina428341112016-09-22 13:38:203353 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033354
3355 ASSERT_TRUE(pool_->HasGroup("b"));
3356 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483357 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033358}
3359
3360TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3361 CreatePool(4, 4);
3362 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3363
3364 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523365 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203366 EXPECT_EQ(
3367 ERR_IO_PENDING,
3368 handle1.Init("a", params_, DEFAULT_PRIORITY,
3369 ClientSocketPool::RespectLimits::ENABLED,
3370 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013371 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033372 handle1.Reset();
3373
3374 ASSERT_TRUE(pool_->HasGroup("a"));
3375 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103376 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033377 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3378
tfarina428341112016-09-22 13:38:203379 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033380
3381 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103382 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033383 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3384}
3385
3386TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3387 CreatePool(4, 4);
3388 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3389
3390 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523391 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203392 EXPECT_EQ(
3393 ERR_IO_PENDING,
3394 handle1.Init("a", params_, DEFAULT_PRIORITY,
3395 ClientSocketPool::RespectLimits::ENABLED,
3396 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013397 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033398
3399 ASSERT_TRUE(pool_->HasGroup("a"));
3400 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103401 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033402 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3403 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3404
tfarina428341112016-09-22 13:38:203405 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033406
3407 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103408 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033409 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3410 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3411}
3412
3413TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3414 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3415 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3416
3417 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203418 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033419
3420 ASSERT_TRUE(pool_->HasGroup("a"));
3421 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103422 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033423 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3424
3425 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203426 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033427
3428 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103429 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033430 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3431}
3432
[email protected]3c819f522010-12-02 02:03:123433TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3434 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3435 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3436
3437 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203438 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123439
3440 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523441
3442 connect_job_factory_->set_job_type(
3443 TestConnectJob::kMockAdditionalErrorStateJob);
3444 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203445 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523446
3447 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123448}
3449
[email protected]8159a1c2012-06-07 00:00:103450TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033451 CreatePool(4, 4);
3452 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3453
tfarina428341112016-09-22 13:38:203454 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033455
3456 ASSERT_TRUE(pool_->HasGroup("a"));
3457 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103458 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033459 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3460
tfarina428341112016-09-22 13:38:203461 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033462 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103463 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033464 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3465
3466 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523467 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203468 EXPECT_EQ(
3469 ERR_IO_PENDING,
3470 handle1.Init("a", params_, DEFAULT_PRIORITY,
3471 ClientSocketPool::RespectLimits::ENABLED,
3472 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013473 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033474
3475 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523476 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153477 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
3478 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203479 callback2.callback(), pool_.get(), NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033480 if (rv != OK) {
robpercival214763f2016-07-01 23:27:013481 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3482 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033483 }
3484
[email protected]8159a1c2012-06-07 00:00:103485 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3486 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3487 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3488 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3489
[email protected]2c2bef152010-10-13 00:55:033490 handle1.Reset();
3491 handle2.Reset();
3492
[email protected]8159a1c2012-06-07 00:00:103493 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3494 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033495 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3496
tfarina428341112016-09-22 13:38:203497 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033498 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103499 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033500 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3501}
3502
3503TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3504 CreatePool(4, 4);
3505 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3506
tfarina428341112016-09-22 13:38:203507 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033508
3509 ASSERT_TRUE(pool_->HasGroup("a"));
3510 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103511 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033512 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3513
tfarina428341112016-09-22 13:38:203514 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033515 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103516 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033517 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3518
tfarina428341112016-09-22 13:38:203519 pool_->RequestSockets("a", &params_, 3, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033520 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103521 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033522 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3523
tfarina428341112016-09-22 13:38:203524 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033525 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103526 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033527 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3528}
3529
3530TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3531 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3532 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3533
tfarina428341112016-09-22 13:38:203534 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033535
3536 ASSERT_TRUE(pool_->HasGroup("a"));
3537 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103538 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033539 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3540
3541 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523542 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203543 EXPECT_EQ(
3544 ERR_IO_PENDING,
3545 handle1.Init("a", params_, DEFAULT_PRIORITY,
3546 ClientSocketPool::RespectLimits::ENABLED,
3547 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033548
3549 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103550 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033551 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3552
robpercival214763f2016-07-01 23:27:013553 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033554
[email protected]0dc88b32014-03-26 20:12:283555 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483556 // starts, it has a connect start time.
3557 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033558 handle1.Reset();
3559
3560 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3561}
3562
[email protected]034df0f32013-01-07 23:17:483563// Checks that fully connected preconnect jobs have no connect times, and are
3564// marked as reused.
3565TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3566 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3567 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
tfarina428341112016-09-22 13:38:203568 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483569
3570 ASSERT_TRUE(pool_->HasGroup("a"));
3571 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3572 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3573 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3574
3575 ClientSocketHandle handle;
3576 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203577 EXPECT_EQ(OK,
3578 handle.Init("a", params_, DEFAULT_PRIORITY,
3579 ClientSocketPool::RespectLimits::ENABLED,
3580 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483581
3582 // Make sure the idle socket was used.
3583 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3584
3585 TestLoadTimingInfoConnectedReused(handle);
3586 handle.Reset();
3587 TestLoadTimingInfoNotConnected(handle);
3588}
3589
[email protected]dcbe168a2010-12-02 03:14:463590// http://crbug.com/64940 regression test.
3591TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3592 const int kMaxTotalSockets = 3;
3593 const int kMaxSocketsPerGroup = 2;
3594 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3595 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3596
3597 // Note that group name ordering matters here. "a" comes before "b", so
3598 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3599
3600 // Set up one idle socket in "a".
3601 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523602 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203603 EXPECT_EQ(
3604 ERR_IO_PENDING,
3605 handle1.Init("a", params_, DEFAULT_PRIORITY,
3606 ClientSocketPool::RespectLimits::ENABLED,
3607 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463608
robpercival214763f2016-07-01 23:27:013609 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463610 handle1.Reset();
3611 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3612
3613 // Set up two active sockets in "b".
3614 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523615 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203616 EXPECT_EQ(
3617 ERR_IO_PENDING,
3618 handle1.Init("b", params_, DEFAULT_PRIORITY,
3619 ClientSocketPool::RespectLimits::ENABLED,
3620 callback1.callback(), pool_.get(), NetLogWithSource()));
3621 EXPECT_EQ(
3622 ERR_IO_PENDING,
3623 handle2.Init("b", params_, DEFAULT_PRIORITY,
3624 ClientSocketPool::RespectLimits::ENABLED,
3625 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463626
robpercival214763f2016-07-01 23:27:013627 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3628 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463629 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103630 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463631 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3632
3633 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3634 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3635 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3636 // sockets for "a", and "b" should still have 2 active sockets.
3637
tfarina428341112016-09-22 13:38:203638 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463639 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103640 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463641 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3642 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3643 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103644 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463645 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3646 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3647
3648 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3649 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3650 // "a" should result in closing 1 for "b".
3651 handle1.Reset();
3652 handle2.Reset();
3653 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3654 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3655
tfarina428341112016-09-22 13:38:203656 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463657 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103658 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463659 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3660 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3661 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103662 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463663 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3664 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3665}
3666
[email protected]b7b8be42011-07-12 12:46:413667TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073668 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3669 pool_->EnableConnectBackupJobs();
3670
3671 // Make the ConnectJob hang until it times out, shorten the timeout.
3672 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3673 connect_job_factory_->set_timeout_duration(
3674 base::TimeDelta::FromMilliseconds(500));
tfarina428341112016-09-22 13:38:203675 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073676 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103677 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073678 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073679
[email protected]b7b8be42011-07-12 12:46:413680 // Verify the backup timer doesn't create a backup job, by making
3681 // the backup job a pending job instead of a waiting job, so it
3682 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073683 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453684 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
ki.stfu375812e2015-10-09 20:23:173685 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
[email protected]2da659e2013-05-23 20:51:343686 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283687 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073688 EXPECT_FALSE(pool_->HasGroup("a"));
3689}
3690
[email protected]b7b8be42011-07-12 12:46:413691TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073692 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3693 pool_->EnableConnectBackupJobs();
3694
3695 // Make the ConnectJob hang forever.
3696 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
tfarina428341112016-09-22 13:38:203697 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073698 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103699 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073700 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283701 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073702
3703 // Make the backup job be a pending job, so it completes normally.
3704 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3705 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523706 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153707 EXPECT_EQ(ERR_IO_PENDING,
3708 handle.Init("a", params_, DEFAULT_PRIORITY,
3709 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203710 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413711 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073712 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103713 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073714 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3715 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013716 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073717
3718 // The hung connect job should still be there, but everything else should be
3719 // complete.
3720 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103721 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073722 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3723 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3724}
3725
[email protected]0dc88b32014-03-26 20:12:283726// Tests that a preconnect that starts out with unread data can still be used.
3727// http://crbug.com/334467
3728TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3729 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3730 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3731
tfarina428341112016-09-22 13:38:203732 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283733
3734 ASSERT_TRUE(pool_->HasGroup("a"));
3735 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3736 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3737 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3738
3739 // Fail future jobs to be sure that handle receives the preconnected socket
3740 // rather than closing it and making a new one.
3741 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3742 ClientSocketHandle handle;
3743 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203744 EXPECT_EQ(OK,
3745 handle.Init("a", params_, DEFAULT_PRIORITY,
3746 ClientSocketPool::RespectLimits::ENABLED,
3747 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283748
3749 ASSERT_TRUE(pool_->HasGroup("a"));
3750 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3751 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3752 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3753
3754 // Drain the pending read.
3755 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
3756
3757 TestLoadTimingInfoConnectedReused(handle);
3758 handle.Reset();
3759
3760 // The socket should be usable now that it's idle again.
3761 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3762}
3763
[email protected]043b68c82013-08-22 23:41:523764class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203765 public:
3766 MockLayeredPool(TestClientSocketPool* pool,
3767 const std::string& group_name)
3768 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203769 group_name_(group_name),
3770 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523771 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203772 }
3773
3774 ~MockLayeredPool() {
[email protected]043b68c82013-08-22 23:41:523775 pool_->RemoveHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203776 }
3777
3778 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153779 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073780 return handle_.Init(group_name_, params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:153781 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203782 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203783 }
3784
3785 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153786 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073787 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:153788 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:203789 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203790 }
3791
3792 bool ReleaseOneConnection() {
3793 if (!handle_.is_initialized() || !can_release_connection_) {
3794 return false;
3795 }
3796 handle_.socket()->Disconnect();
3797 handle_.Reset();
3798 return true;
3799 }
3800
3801 void set_can_release_connection(bool can_release_connection) {
3802 can_release_connection_ = can_release_connection;
3803 }
3804
3805 MOCK_METHOD0(CloseOneIdleConnection, bool());
3806
3807 private:
3808 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203809 ClientSocketHandle handle_;
3810 TestCompletionCallback callback_;
3811 const std::string group_name_;
3812 bool can_release_connection_;
3813};
3814
3815TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3816 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3817 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3818
3819 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013820 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203821 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3822 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523823 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203824}
3825
3826TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
xunjieli26619e72016-11-23 19:39:553827 base::HistogramTester histograms;
[email protected]58e562f2013-04-22 17:32:203828 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3829 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3830
3831 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013832 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203833 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3834 .WillOnce(Invoke(&mock_layered_pool,
3835 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523836 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
xunjieli26619e72016-11-23 19:39:553837 EXPECT_THAT(histograms.GetAllSamples(kIdleSocketFateHistogram),
3838 testing::ElementsAre(
3839 base::Bucket(/*IDLE_SOCKET_FATE_RELEASE_UNUSABLE=*/3, 1)));
[email protected]58e562f2013-04-22 17:32:203840}
3841
3842// Tests the basic case of closing an idle socket in a higher layered pool when
3843// a new request is issued and the lower layer pool is stalled.
3844TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3845 CreatePool(1, 1);
3846 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3847
3848 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013849 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203850 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3851 .WillOnce(Invoke(&mock_layered_pool,
3852 &MockLayeredPool::ReleaseOneConnection));
3853 ClientSocketHandle handle;
3854 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153855 EXPECT_EQ(ERR_IO_PENDING,
3856 handle.Init("a", params_, DEFAULT_PRIORITY,
3857 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203858 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013859 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203860}
3861
3862// Same as above, but the idle socket is in the same group as the stalled
3863// socket, and closes the only other request in its group when closing requests
3864// in higher layered pools. This generally shouldn't happen, but it may be
3865// possible if a higher level pool issues a request and the request is
3866// subsequently cancelled. Even if it's not possible, best not to crash.
3867TEST_F(ClientSocketPoolBaseTest,
3868 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3869 CreatePool(2, 2);
3870 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3871
3872 // Need a socket in another group for the pool to be stalled (If a group
3873 // has the maximum number of connections already, it's not stalled).
3874 ClientSocketHandle handle1;
3875 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203876 EXPECT_EQ(
3877 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3878 ClientSocketPool::RespectLimits::ENABLED,
3879 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203880
3881 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013882 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203883 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3884 .WillOnce(Invoke(&mock_layered_pool,
3885 &MockLayeredPool::ReleaseOneConnection));
3886 ClientSocketHandle handle;
3887 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153888 EXPECT_EQ(ERR_IO_PENDING,
3889 handle.Init("group2", params_, DEFAULT_PRIORITY,
3890 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203891 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013892 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203893}
3894
3895// Tests the case when an idle socket can be closed when a new request is
3896// issued, and the new request belongs to a group that was previously stalled.
3897TEST_F(ClientSocketPoolBaseTest,
3898 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3899 CreatePool(2, 2);
3900 std::list<TestConnectJob::JobType> job_types;
3901 job_types.push_back(TestConnectJob::kMockJob);
3902 job_types.push_back(TestConnectJob::kMockJob);
3903 job_types.push_back(TestConnectJob::kMockJob);
3904 job_types.push_back(TestConnectJob::kMockJob);
3905 connect_job_factory_->set_job_types(&job_types);
3906
3907 ClientSocketHandle handle1;
3908 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203909 EXPECT_EQ(
3910 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3911 ClientSocketPool::RespectLimits::ENABLED,
3912 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203913
3914 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013915 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203916 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3917 .WillRepeatedly(Invoke(&mock_layered_pool,
3918 &MockLayeredPool::ReleaseOneConnection));
3919 mock_layered_pool.set_can_release_connection(false);
3920
3921 // The third request is made when the socket pool is in a stalled state.
3922 ClientSocketHandle handle3;
3923 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203924 EXPECT_EQ(
3925 ERR_IO_PENDING,
3926 handle3.Init("group3", params_, DEFAULT_PRIORITY,
3927 ClientSocketPool::RespectLimits::ENABLED,
3928 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203929
3930 base::RunLoop().RunUntilIdle();
3931 EXPECT_FALSE(callback3.have_result());
3932
3933 // The fourth request is made when the pool is no longer stalled. The third
3934 // request should be serviced first, since it was issued first and has the
3935 // same priority.
3936 mock_layered_pool.set_can_release_connection(true);
3937 ClientSocketHandle handle4;
3938 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203939 EXPECT_EQ(
3940 ERR_IO_PENDING,
3941 handle4.Init("group3", params_, DEFAULT_PRIORITY,
3942 ClientSocketPool::RespectLimits::ENABLED,
3943 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013944 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203945 EXPECT_FALSE(callback4.have_result());
3946
3947 // Closing a handle should free up another socket slot.
3948 handle1.Reset();
robpercival214763f2016-07-01 23:27:013949 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203950}
3951
3952// Tests the case when an idle socket can be closed when a new request is
3953// issued, and the new request belongs to a group that was previously stalled.
3954//
3955// The two differences from the above test are that the stalled requests are not
3956// in the same group as the layered pool's request, and the the fourth request
3957// has a higher priority than the third one, so gets a socket first.
3958TEST_F(ClientSocketPoolBaseTest,
3959 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3960 CreatePool(2, 2);
3961 std::list<TestConnectJob::JobType> job_types;
3962 job_types.push_back(TestConnectJob::kMockJob);
3963 job_types.push_back(TestConnectJob::kMockJob);
3964 job_types.push_back(TestConnectJob::kMockJob);
3965 job_types.push_back(TestConnectJob::kMockJob);
3966 connect_job_factory_->set_job_types(&job_types);
3967
3968 ClientSocketHandle handle1;
3969 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203970 EXPECT_EQ(
3971 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3972 ClientSocketPool::RespectLimits::ENABLED,
3973 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203974
3975 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013976 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203977 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3978 .WillRepeatedly(Invoke(&mock_layered_pool,
3979 &MockLayeredPool::ReleaseOneConnection));
3980 mock_layered_pool.set_can_release_connection(false);
3981
3982 // The third request is made when the socket pool is in a stalled state.
3983 ClientSocketHandle handle3;
3984 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203985 EXPECT_EQ(
3986 ERR_IO_PENDING,
3987 handle3.Init("group3", params_, MEDIUM,
3988 ClientSocketPool::RespectLimits::ENABLED,
3989 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203990
3991 base::RunLoop().RunUntilIdle();
3992 EXPECT_FALSE(callback3.have_result());
3993
3994 // The fourth request is made when the pool is no longer stalled. This
3995 // request has a higher priority than the third request, so is serviced first.
3996 mock_layered_pool.set_can_release_connection(true);
3997 ClientSocketHandle handle4;
3998 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203999 EXPECT_EQ(
4000 ERR_IO_PENDING,
4001 handle4.Init("group3", params_, HIGHEST,
4002 ClientSocketPool::RespectLimits::ENABLED,
4003 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014004 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204005 EXPECT_FALSE(callback3.have_result());
4006
4007 // Closing a handle should free up another socket slot.
4008 handle1.Reset();
robpercival214763f2016-07-01 23:27:014009 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204010}
4011
4012TEST_F(ClientSocketPoolBaseTest,
4013 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4014 CreatePool(1, 1);
4015 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4016
4017 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014018 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204019 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4020 .WillRepeatedly(Invoke(&mock_layered_pool1,
4021 &MockLayeredPool::ReleaseOneConnection));
4022 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:014023 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4024 IsOk());
[email protected]58e562f2013-04-22 17:32:204025 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4026 .WillRepeatedly(Invoke(&mock_layered_pool2,
4027 &MockLayeredPool::ReleaseOneConnection));
4028 ClientSocketHandle handle;
4029 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:154030 EXPECT_EQ(ERR_IO_PENDING,
4031 handle.Init("a", params_, DEFAULT_PRIORITY,
4032 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204033 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014034 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204035}
4036
[email protected]b021ece62013-06-11 11:06:334037// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154038// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4039// socket instead of a request with the same priority that was issued earlier,
4040// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334041TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334042 CreatePool(1, 1);
4043
4044 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154045 EXPECT_EQ(
4046 OK, StartRequestWithIgnoreLimits(
4047 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334048 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4049
4050 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4051
mmenked3641e12016-01-28 16:06:154052 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4053 "a", MAXIMUM_PRIORITY,
4054 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334055 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4056
mmenked3641e12016-01-28 16:06:154057 // Issue a request that ignores the limits, so a new ConnectJob is
4058 // created.
4059 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4060 "a", MAXIMUM_PRIORITY,
4061 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334062 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4063
robpercival214763f2016-07-01 23:27:014064 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334065 EXPECT_FALSE(request(1)->have_result());
4066}
4067
[email protected]c55fabd2013-11-04 23:26:564068// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154069// issued for a request with RespectLimits::DISABLED is not cancelled when a
4070// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564071TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564072 CreatePool(1, 1);
4073
4074 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154075 EXPECT_EQ(
4076 OK, StartRequestWithIgnoreLimits(
4077 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564078 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4079
4080 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4081
mmenked3641e12016-01-28 16:06:154082 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4083 "a", MAXIMUM_PRIORITY,
4084 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564085 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4086
mmenked3641e12016-01-28 16:06:154087 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4088 // created.
4089 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4090 "a", MAXIMUM_PRIORITY,
4091 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334092 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4093
mmenked3641e12016-01-28 16:06:154094 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334095 // should not be cancelled.
4096 request(1)->handle()->Reset();
4097 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4098
robpercival214763f2016-07-01 23:27:014099 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334100 EXPECT_FALSE(request(1)->have_result());
4101}
4102
[email protected]f6d1d6eb2009-06-24 20:16:094103} // namespace
4104
4105} // namespace net