blob: 404c4f99a74f9130633f9186b2e9cf4040e68bf1 [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"
18#include "base/memory/scoped_vector.h"
[email protected]6ea7b152011-12-21 21:21:1319#include "base/memory/weak_ptr.h"
[email protected]18b577412013-07-18 04:19:1520#include "base/message_loop/message_loop.h"
[email protected]034df0f32013-01-07 23:17:4821#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4522#include "base/single_thread_task_runner.h"
[email protected]fc9be5802013-06-11 10:56:5123#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1524#include "base/strings/stringprintf.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"
tbansalca83c002016-04-28 20:56:2843#include "net/socket/socket_performance_watcher.h"
[email protected]75439d3b2009-07-23 22:11:1744#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4445#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1046#include "net/socket/stream_socket.h"
robpercival214763f2016-07-01 23:27:0147#include "net/test/gtest_util.h"
[email protected]18ccfdb2013-08-15 00:13:4448#include "net/udp/datagram_client_socket.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;
[email protected]0b7648c2009-07-06 20:14:0164
[email protected]034df0f32013-01-07 23:17:4865// Make sure |handle| sets load times correctly when it has been assigned a
66// reused socket.
67void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
68 LoadTimingInfo load_timing_info;
69 // Only pass true in as |is_reused|, as in general, HttpStream types should
70 // have stricter concepts of reuse than socket pools.
71 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
72
73 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1974 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4875
[email protected]b258e0792013-01-12 07:11:5976 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
77 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4878}
79
80// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3381// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4882// of a connection where |is_reused| is false may consider the connection
83// reused.
84void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
85 EXPECT_FALSE(handle.is_reused());
86
87 LoadTimingInfo load_timing_info;
88 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
89
90 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1991 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4892
[email protected]b258e0792013-01-12 07:11:5993 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
94 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
95 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4896
97 TestLoadTimingInfoConnectedReused(handle);
98}
99
100// Make sure |handle| sets load times correctly, in the case that it does not
101// currently have a socket.
102void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
103 // Should only be set to true once a socket is assigned, if at all.
104 EXPECT_FALSE(handle.is_reused());
105
106 LoadTimingInfo load_timing_info;
107 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
108
109 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19110 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48111
[email protected]b258e0792013-01-12 07:11:59112 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
113 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48114}
115
[email protected]df4b4ef2010-07-12 18:25:21116class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20117 public:
mmenked3641e12016-01-28 16:06:15118 explicit TestSocketParams() {}
[email protected]51fdc7c2012-04-10 19:19:48119
[email protected]df4b4ef2010-07-12 18:25:21120 private:
121 friend class base::RefCounted<TestSocketParams>;
122 ~TestSocketParams() {}
123};
[email protected]7fc5b09a2010-02-27 00:07:38124typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49125
[email protected]3268023f2011-05-05 00:08:10126class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09127 public:
[email protected]034df0f32013-01-07 23:17:48128 explicit MockClientSocket(net::NetLog* net_log)
129 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28130 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20131 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
ttuttle859dc7a2015-04-23 19:42:29132 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09133
[email protected]0dc88b32014-03-26 20:12:28134 // Sets whether the socket has unread data. If true, the next call to Read()
135 // will return 1 byte and IsConnectedAndIdle() will return false.
136 void set_has_unread_data(bool has_unread_data) {
137 has_unread_data_ = has_unread_data;
138 }
139
[email protected]3f55aa12011-12-07 02:03:33140 // Socket implementation.
dchengb03027d2014-10-21 12:00:20141 int Read(IOBuffer* /* buf */,
142 int len,
143 const CompletionCallback& /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28144 if (has_unread_data_ && len > 0) {
145 has_unread_data_ = false;
146 was_used_to_convey_data_ = true;
147 return 1;
148 }
[email protected]e86df8dc2013-03-30 13:18:28149 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33150 }
[email protected]ab838892009-06-30 18:49:05151
dchengb03027d2014-10-21 12:00:20152 int Write(IOBuffer* /* buf */,
153 int len,
154 const CompletionCallback& /* callback */) override {
[email protected]0f873e82010-09-02 16:09:01155 was_used_to_convey_data_ = true;
156 return len;
[email protected]ab838892009-06-30 18:49:05157 }
Avi Drissman13fc8932015-12-20 04:40:46158 int SetReceiveBufferSize(int32_t size) override { return OK; }
159 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05160
[email protected]dbf036f2011-12-06 23:33:24161 // StreamSocket implementation.
dchengb03027d2014-10-21 12:00:20162 int Connect(const CompletionCallback& callback) override {
[email protected]dbf036f2011-12-06 23:33:24163 connected_ = true;
164 return OK;
165 }
[email protected]f6d1d6eb2009-06-24 20:16:09166
dchengb03027d2014-10-21 12:00:20167 void Disconnect() override { connected_ = false; }
168 bool IsConnected() const override { return connected_; }
169 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28170 return connected_ && !has_unread_data_;
171 }
[email protected]0b7648c2009-07-06 20:14:01172
dchengb03027d2014-10-21 12:00:20173 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16174 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09175 }
[email protected]f6d1d6eb2009-06-24 20:16:09176
dchengb03027d2014-10-21 12:00:20177 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35178 return ERR_UNEXPECTED;
179 }
180
tfarina428341112016-09-22 13:38:20181 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02182
dchengb03027d2014-10-21 12:00:20183 void SetSubresourceSpeculation() override {}
184 void SetOmniboxSpeculation() override {}
185 bool WasEverUsed() const override { return was_used_to_convey_data_; }
dchengb03027d2014-10-21 12:00:20186 bool WasNpnNegotiated() const override { return false; }
187 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
188 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03189 void GetConnectionAttempts(ConnectionAttempts* out) const override {
190 out->clear();
191 }
192 void ClearConnectionAttempts() override {}
193 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49194 int64_t GetTotalReceivedBytes() const override {
195 NOTIMPLEMENTED();
196 return 0;
197 }
[email protected]9b5614a2010-08-25 20:29:45198
[email protected]f6d1d6eb2009-06-24 20:16:09199 private:
200 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28201 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20202 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01203 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09204
[email protected]ab838892009-06-30 18:49:05205 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09206};
207
[email protected]5fc08e32009-07-15 17:09:57208class TestConnectJob;
209
[email protected]f6d1d6eb2009-06-24 20:16:09210class MockClientSocketFactory : public ClientSocketFactory {
211 public:
[email protected]ab838892009-06-30 18:49:05212 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09213
danakj655b66c2016-04-16 00:51:38214 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04215 DatagramSocket::BindType bind_type,
216 const RandIntCallback& rand_int_cb,
[email protected]98b0e582011-06-22 14:31:41217 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19218 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41219 NOTREACHED();
danakj655b66c2016-04-16 00:51:38220 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41221 }
222
danakj655b66c2016-04-16 00:51:38223 std::unique_ptr<StreamSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07224 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38225 std::unique_ptr<
226 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07227 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19228 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09229 allocation_count_++;
danakj655b66c2016-04-16 00:51:38230 return std::unique_ptr<StreamSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09231 }
232
danakj655b66c2016-04-16 00:51:38233 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
234 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27235 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21236 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13237 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09238 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38239 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09240 }
241
dchengb03027d2014-10-21 12:00:20242 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59243
[email protected]5fc08e32009-07-15 17:09:57244 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55245
[email protected]5fc08e32009-07-15 17:09:57246 void SignalJobs();
247
[email protected]03b7c8c2013-07-20 04:38:55248 void SignalJob(size_t job);
249
250 void SetJobLoadState(size_t job, LoadState load_state);
251
[email protected]f6d1d6eb2009-06-24 20:16:09252 int allocation_count() const { return allocation_count_; }
253
[email protected]f6d1d6eb2009-06-24 20:16:09254 private:
255 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57256 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09257};
258
[email protected]ab838892009-06-30 18:49:05259class TestConnectJob : public ConnectJob {
260 public:
261 enum JobType {
262 kMockJob,
263 kMockFailingJob,
264 kMockPendingJob,
265 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57266 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13267 kMockRecoverableJob,
268 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18269 kMockAdditionalErrorStateJob,
270 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28271 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05272 };
273
[email protected]994d4932010-07-12 17:55:13274 // The kMockPendingJob uses a slight delay before allowing the connect
275 // to complete.
276 static const int kPendingConnectDelay = 2;
277
[email protected]ab838892009-06-30 18:49:05278 TestConnectJob(JobType job_type,
279 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49280 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34281 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05282 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30283 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17284 NetLog* net_log)
tfarina428341112016-09-22 13:38:20285 : ConnectJob(
286 group_name,
287 timeout_duration,
288 request.priority(),
289 request.respect_limits(),
290 delegate,
291 NetLogWithSource::Make(net_log, NetLogSourceType::CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58292 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05293 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18294 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39295 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15296 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05297
[email protected]974ebd62009-08-03 23:14:34298 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13299 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34300 }
301
[email protected]03b7c8c2013-07-20 04:38:55302 void set_load_state(LoadState load_state) { load_state_ = load_state; }
303
304 // From ConnectJob:
305
dchengb03027d2014-10-21 12:00:20306 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21307
dchengb03027d2014-10-21 12:00:20308 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18309 if (store_additional_error_state_) {
310 // Set all of the additional error state fields in some way.
311 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43312 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45313 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43314 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18315 }
316 }
317
[email protected]974ebd62009-08-03 23:14:34318 private:
[email protected]03b7c8c2013-07-20 04:38:55319 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05320
dchengb03027d2014-10-21 12:00:20321 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05322 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21323 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19324 NetLogSource());
danakj655b66c2016-04-16 00:51:38325 SetSocket(std::unique_ptr<StreamSocket>(
326 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05327 switch (job_type_) {
328 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13329 return DoConnect(true /* successful */, false /* sync */,
330 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05331 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13332 return DoConnect(false /* error */, false /* sync */,
333 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05334 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57335 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47336
337 // Depending on execution timings, posting a delayed task can result
338 // in the task getting executed the at the earliest possible
339 // opportunity or only after returning once from the message loop and
340 // then a second call into the message loop. In order to make behavior
341 // more deterministic, we change the default delay to 2ms. This should
342 // always require us to wait for the second call into the message loop.
343 //
344 // N.B. The correct fix for this and similar timing problems is to
345 // abstract time for the purpose of unittests. Unfortunately, we have
346 // a lot of third-party components that directly call the various
347 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45348 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05349 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13350 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45351 weak_factory_.GetWeakPtr(), true /* successful */,
352 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53353 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05354 return ERR_IO_PENDING;
355 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57356 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45357 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05358 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13359 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45360 weak_factory_.GetWeakPtr(), false /* error */,
361 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53362 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05363 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57364 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55365 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57366 client_socket_factory_->WaitForSignal(this);
367 waiting_success_ = true;
368 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13369 case kMockRecoverableJob:
370 return DoConnect(false /* error */, false /* sync */,
371 true /* recoverable */);
372 case kMockPendingRecoverableJob:
373 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45374 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13375 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13376 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45377 weak_factory_.GetWeakPtr(), false /* error */,
378 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53379 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13380 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18381 case kMockAdditionalErrorStateJob:
382 store_additional_error_state_ = true;
383 return DoConnect(false /* error */, false /* sync */,
384 false /* recoverable */);
385 case kMockPendingAdditionalErrorStateJob:
386 set_load_state(LOAD_STATE_CONNECTING);
387 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45388 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18389 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13390 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45391 weak_factory_.GetWeakPtr(), false /* error */,
392 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53393 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18394 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28395 case kMockUnreadDataJob: {
396 int ret = DoConnect(true /* successful */, false /* sync */,
397 false /* recoverable */);
398 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
399 return ret;
400 }
[email protected]ab838892009-06-30 18:49:05401 default:
402 NOTREACHED();
danakj655b66c2016-04-16 00:51:38403 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05404 return ERR_FAILED;
405 }
406 }
407
[email protected]e772db3f2010-07-12 18:11:13408 int DoConnect(bool succeed, bool was_async, bool recoverable) {
409 int result = OK;
[email protected]ab838892009-06-30 18:49:05410 if (succeed) {
[email protected]83039bb2011-12-09 18:43:55411 socket()->Connect(CompletionCallback());
[email protected]e772db3f2010-07-12 18:11:13412 } else if (recoverable) {
413 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40414 } else {
[email protected]e772db3f2010-07-12 18:11:13415 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38416 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05417 }
[email protected]2ab05b52009-07-01 23:57:58418
419 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30420 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05421 return result;
422 }
423
[email protected]5fc08e32009-07-15 17:09:57424 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05425 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57426 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21427 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18428 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05429
[email protected]d5492c52013-11-10 20:44:39430 base::WeakPtrFactory<TestConnectJob> weak_factory_;
431
[email protected]ab838892009-06-30 18:49:05432 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
433};
434
[email protected]d80a4322009-08-14 07:07:49435class TestConnectJobFactory
436 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05437 public:
[email protected]034df0f32013-01-07 23:17:48438 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
439 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05440 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48441 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48442 client_socket_factory_(client_socket_factory),
443 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33444 }
[email protected]ab838892009-06-30 18:49:05445
dchengb03027d2014-10-21 12:00:20446 ~TestConnectJobFactory() override {}
[email protected]ab838892009-06-30 18:49:05447
448 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
449
[email protected]51fdc7c2012-04-10 19:19:48450 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
451 job_types_ = job_types;
452 CHECK(!job_types_->empty());
453 }
454
[email protected]974ebd62009-08-03 23:14:34455 void set_timeout_duration(base::TimeDelta timeout_duration) {
456 timeout_duration_ = timeout_duration;
457 }
458
[email protected]3f55aa12011-12-07 02:03:33459 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55460
danakj655b66c2016-04-16 00:51:38461 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05462 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49463 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13464 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48465 EXPECT_TRUE(!job_types_ || !job_types_->empty());
466 TestConnectJob::JobType job_type = job_type_;
467 if (job_types_ && !job_types_->empty()) {
468 job_type = job_types_->front();
469 job_types_->pop_front();
470 }
danakj655b66c2016-04-16 00:51:38471 return std::unique_ptr<ConnectJob>(
472 new TestConnectJob(job_type, group_name, request, timeout_duration_,
473 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05474 }
475
dchengb03027d2014-10-21 12:00:20476 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26477 return timeout_duration_;
478 }
479
[email protected]ab838892009-06-30 18:49:05480 private:
481 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48482 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34483 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57484 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48485 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05486
487 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
488};
489
490class TestClientSocketPool : public ClientSocketPool {
491 public:
[email protected]12322e7e2013-08-15 17:49:26492 typedef TestSocketParams SocketParams;
493
[email protected]ab838892009-06-30 18:49:05494 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53495 int max_sockets,
[email protected]ab838892009-06-30 18:49:05496 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16497 base::TimeDelta unused_idle_socket_timeout,
498 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49499 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41500 : base_(NULL,
501 max_sockets,
502 max_sockets_per_group,
503 unused_idle_socket_timeout,
504 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38505 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05506
dchengb03027d2014-10-21 12:00:20507 ~TestClientSocketPool() override {}
[email protected]2431756e2010-09-29 20:26:13508
dchengb03027d2014-10-21 12:00:20509 int RequestSocket(const std::string& group_name,
510 const void* params,
ttuttle859dc7a2015-04-23 19:42:29511 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15512 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20513 ClientSocketHandle* handle,
514 const CompletionCallback& callback,
tfarina428341112016-09-22 13:38:20515 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21516 const scoped_refptr<TestSocketParams>* casted_socket_params =
517 static_cast<const scoped_refptr<TestSocketParams>*>(params);
518 return base_.RequestSocket(group_name, *casted_socket_params, priority,
mmenked3641e12016-01-28 16:06:15519 respect_limits, handle, callback, net_log);
[email protected]ab838892009-06-30 18:49:05520 }
521
dchengb03027d2014-10-21 12:00:20522 void RequestSockets(const std::string& group_name,
523 const void* params,
524 int num_sockets,
tfarina428341112016-09-22 13:38:20525 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03526 const scoped_refptr<TestSocketParams>* casted_params =
527 static_cast<const scoped_refptr<TestSocketParams>*>(params);
528
529 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
530 }
531
dchengb03027d2014-10-21 12:00:20532 void CancelRequest(const std::string& group_name,
533 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49534 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05535 }
536
dchengb03027d2014-10-21 12:00:20537 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38538 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20539 int id) override {
dchengc7eeda422015-12-26 03:56:48540 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24541 }
542
dchengb03027d2014-10-21 12:00:20543 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05544
dchengb03027d2014-10-21 12:00:20545 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48546
dchengb03027d2014-10-21 12:00:20547 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05548
dchengb03027d2014-10-21 12:00:20549 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05550
dchengb03027d2014-10-21 12:00:20551 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49552 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05553 }
554
dchengb03027d2014-10-21 12:00:20555 LoadState GetLoadState(const std::string& group_name,
556 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49557 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05558 }
559
dchengb03027d2014-10-21 12:00:20560 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52561 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48562 }
563
dchengb03027d2014-10-21 12:00:20564 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52565 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48566 }
567
danakj655b66c2016-04-16 00:51:38568 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59569 const std::string& name,
570 const std::string& type,
mostynbba063d6032014-10-09 11:01:13571 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27572 return base_.GetInfoAsValue(name, type);
573 }
574
dchengb03027d2014-10-21 12:00:20575 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26576 return base_.ConnectionTimeout();
577 }
578
[email protected]d80a4322009-08-14 07:07:49579 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20580
[email protected]8159a1c2012-06-07 00:00:10581 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
582 return base_.NumUnassignedConnectJobsInGroup(group_name);
583 }
584
[email protected]974ebd62009-08-03 23:14:34585 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49586 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34587 }
588
[email protected]2c2bef152010-10-13 00:55:03589 int NumActiveSocketsInGroup(const std::string& group_name) const {
590 return base_.NumActiveSocketsInGroup(group_name);
591 }
592
[email protected]2abfe90a2010-08-25 17:49:51593 bool HasGroup(const std::string& group_name) const {
594 return base_.HasGroup(group_name);
595 }
596
[email protected]9bf28db2009-08-29 01:35:16597 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
598
[email protected]06d94042010-08-25 01:45:22599 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54600
[email protected]043b68c82013-08-22 23:41:52601 bool CloseOneIdleConnectionInHigherLayeredPool() {
602 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48603 }
604
[email protected]ab838892009-06-30 18:49:05605 private:
[email protected]d80a4322009-08-14 07:07:49606 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05607
608 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
609};
610
[email protected]a937a06d2009-08-19 21:19:24611} // namespace
612
[email protected]a937a06d2009-08-19 21:19:24613namespace {
614
[email protected]5fc08e32009-07-15 17:09:57615void MockClientSocketFactory::SignalJobs() {
616 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
617 it != waiting_jobs_.end(); ++it) {
618 (*it)->Signal();
619 }
620 waiting_jobs_.clear();
621}
622
[email protected]03b7c8c2013-07-20 04:38:55623void MockClientSocketFactory::SignalJob(size_t job) {
624 ASSERT_LT(job, waiting_jobs_.size());
625 waiting_jobs_[job]->Signal();
626 waiting_jobs_.erase(waiting_jobs_.begin() + job);
627}
628
629void MockClientSocketFactory::SetJobLoadState(size_t job,
630 LoadState load_state) {
631 ASSERT_LT(job, waiting_jobs_.size());
632 waiting_jobs_[job]->set_load_state(load_state);
633}
634
[email protected]974ebd62009-08-03 23:14:34635class TestConnectJobDelegate : public ConnectJob::Delegate {
636 public:
637 TestConnectJobDelegate()
638 : have_result_(false), waiting_for_result_(false), result_(OK) {}
dchengb03027d2014-10-21 12:00:20639 ~TestConnectJobDelegate() override {}
[email protected]974ebd62009-08-03 23:14:34640
dchengb03027d2014-10-21 12:00:20641 void OnConnectJobComplete(int result, ConnectJob* job) override {
[email protected]974ebd62009-08-03 23:14:34642 result_ = result;
danakj655b66c2016-04-16 00:51:38643 std::unique_ptr<ConnectJob> owned_job(job);
644 std::unique_ptr<StreamSocket> socket = owned_job->PassSocket();
[email protected]9b6fee12009-09-29 18:13:07645 // socket.get() should be NULL iff result != OK
[email protected]18ccfdb2013-08-15 00:13:44646 EXPECT_EQ(socket == NULL, result != OK);
[email protected]974ebd62009-08-03 23:14:34647 have_result_ = true;
648 if (waiting_for_result_)
ki.stfu375812e2015-10-09 20:23:17649 base::MessageLoop::current()->QuitWhenIdle();
[email protected]974ebd62009-08-03 23:14:34650 }
651
652 int WaitForResult() {
653 DCHECK(!waiting_for_result_);
654 while (!have_result_) {
655 waiting_for_result_ = true;
fdoray5eeb7642016-06-22 16:11:28656 base::RunLoop().Run();
[email protected]974ebd62009-08-03 23:14:34657 waiting_for_result_ = false;
658 }
659 have_result_ = false; // auto-reset for next callback
660 return result_;
661 }
662
663 private:
664 bool have_result_;
665 bool waiting_for_result_;
666 int result_;
667};
668
[email protected]2431756e2010-09-29 20:26:13669class ClientSocketPoolBaseTest : public testing::Test {
[email protected]f6d1d6eb2009-06-24 20:16:09670 protected:
mmenked3641e12016-01-28 16:06:15671 ClientSocketPoolBaseTest() : params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54672 connect_backup_jobs_enabled_ =
673 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
674 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
675 }
[email protected]2431756e2010-09-29 20:26:13676
dcheng67be2b1f2014-10-27 21:47:29677 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54678 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
679 connect_backup_jobs_enabled_);
680 }
[email protected]c9d6a1d2009-07-14 16:15:20681
[email protected]211d21722009-07-22 15:48:53682 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16683 CreatePoolWithIdleTimeouts(
684 max_sockets,
685 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30686 ClientSocketPool::unused_idle_socket_timeout(),
687 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16688 }
689
690 void CreatePoolWithIdleTimeouts(
691 int max_sockets, int max_sockets_per_group,
692 base::TimeDelta unused_idle_socket_timeout,
693 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20694 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48695 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
696 &net_log_);
[email protected]2431756e2010-09-29 20:26:13697 pool_.reset(new TestClientSocketPool(max_sockets,
698 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13699 unused_idle_socket_timeout,
700 used_idle_socket_timeout,
701 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20702 }
[email protected]f6d1d6eb2009-06-24 20:16:09703
mmenked3641e12016-01-28 16:06:15704 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33705 const std::string& group_name,
706 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15707 ClientSocketPool::RespectLimits respect_limits) {
708 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
709 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33710 }
711
712 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15713 return StartRequestWithIgnoreLimits(
714 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09715 }
716
[email protected]2431756e2010-09-29 20:26:13717 int GetOrderOfRequest(size_t index) const {
718 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09719 }
720
[email protected]2431756e2010-09-29 20:26:13721 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
722 return test_base_.ReleaseOneConnection(keep_alive);
723 }
724
725 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
726 test_base_.ReleaseAllConnections(keep_alive);
727 }
728
729 TestSocketRequest* request(int i) { return test_base_.request(i); }
730 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38731 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42732 return test_base_.requests();
733 }
[email protected]2431756e2010-09-29 20:26:13734 size_t completion_count() const { return test_base_.completion_count(); }
735
vishal.b62985ca92015-04-17 08:45:51736 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54737 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09738 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04739 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21740 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38741 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13742 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09743};
744
[email protected]974ebd62009-08-03 23:14:34745// Even though a timeout is specified, it doesn't time out on a synchronous
746// completion.
747TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
748 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06749 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49750 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07751 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15752 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20753 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
754 NetLogWithSource());
danakj655b66c2016-04-16 00:51:38755 std::unique_ptr<TestConnectJob> job(
756 new TestConnectJob(TestConnectJob::kMockJob, "a", request,
757 base::TimeDelta::FromMicroseconds(1), &delegate,
758 &client_socket_factory_, NULL));
robpercival214763f2016-07-01 23:27:01759 EXPECT_THAT(job->Connect(), IsOk());
[email protected]974ebd62009-08-03 23:14:34760}
761
762TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
763 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06764 ClientSocketHandle ignored;
vishal.b62985ca92015-04-17 08:45:51765 TestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53766
[email protected]d80a4322009-08-14 07:07:49767 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07768 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15769 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20770 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
771 NetLogWithSource());
[email protected]974ebd62009-08-03 23:14:34772 // Deleted by TestConnectJobDelegate.
773 TestConnectJob* job =
774 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12775 "a",
[email protected]974ebd62009-08-03 23:14:34776 request,
777 base::TimeDelta::FromMicroseconds(1),
778 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30779 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17780 &log);
robpercival214763f2016-07-01 23:27:01781 ASSERT_THAT(job->Connect(), IsError(ERR_IO_PENDING));
[email protected]26b9973962012-01-28 00:57:00782 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
robpercival214763f2016-07-01 23:27:01783 EXPECT_THAT(delegate.WaitForResult(), IsError(ERR_TIMED_OUT));
[email protected]fd7b7c92009-08-20 19:38:30784
mmenke43758e62015-05-04 21:09:46785 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40786 log.GetEntries(&entries);
787
788 EXPECT_EQ(6u, entries.size());
mikecirone8b85c432016-09-08 19:11:00789 EXPECT_TRUE(LogContainsBeginEvent(entries, 0,
790 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]e9002a92010-01-29 07:10:46791 EXPECT_TRUE(LogContainsBeginEvent(
mikecirone8b85c432016-09-08 19:11:00792 entries, 1, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
793 EXPECT_TRUE(LogContainsEvent(entries, 2,
794 NetLogEventType::CONNECT_JOB_SET_SOCKET,
795 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46796 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00797 entries, 3, NetLogEventType::SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
798 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46799 EXPECT_TRUE(LogContainsEndEvent(
mikecirone8b85c432016-09-08 19:11:00800 entries, 4, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
801 EXPECT_TRUE(LogContainsEndEvent(entries, 5,
802 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]974ebd62009-08-03 23:14:34803}
804
[email protected]5fc08e32009-07-15 17:09:57805TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53806 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20807
[email protected]6ecf2b92011-12-15 01:14:52808 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06809 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51810 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48811 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53812
mmenked3641e12016-01-28 16:06:15813 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY,
814 ClientSocketPool::RespectLimits::ENABLED,
815 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09816 EXPECT_TRUE(handle.is_initialized());
817 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48818 TestLoadTimingInfoConnectedNotReused(handle);
819
[email protected]f6d1d6eb2009-06-24 20:16:09820 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48821 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30822
mmenke43758e62015-05-04 21:09:46823 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40824 log.GetEntries(&entries);
825
826 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00827 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53828 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00829 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
830 NetLogEventPhase::NONE));
831 EXPECT_TRUE(LogContainsEvent(entries, 2,
832 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
833 NetLogEventPhase::NONE));
834 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09835}
836
[email protected]ab838892009-06-30 18:49:05837TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53838 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20839
[email protected]ab838892009-06-30 18:49:05840 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51841 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53842
[email protected]2431756e2010-09-29 20:26:13843 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52844 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18845 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13846 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43847 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45848 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13849 handle.set_ssl_error_response_info(info);
850 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:15851 handle.Init("a", params_, DEFAULT_PRIORITY,
852 ClientSocketPool::RespectLimits::ENABLED,
853 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13854 EXPECT_FALSE(handle.socket());
855 EXPECT_FALSE(handle.is_ssl_error());
856 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48857 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30858
mmenke43758e62015-05-04 21:09:46859 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40860 log.GetEntries(&entries);
861
862 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00863 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17864 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00865 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
866 NetLogEventPhase::NONE));
867 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09868}
869
[email protected]211d21722009-07-22 15:48:53870TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
871 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
872
[email protected]9e743cd2010-03-16 07:03:53873 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30874
robpercival214763f2016-07-01 23:27:01875 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
876 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
877 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
878 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53879
[email protected]2431756e2010-09-29 20:26:13880 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53881 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13882 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53883
robpercival214763f2016-07-01 23:27:01884 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
885 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
886 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53887
[email protected]2431756e2010-09-29 20:26:13888 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53889
[email protected]2431756e2010-09-29 20:26:13890 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53891 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13892 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53893
894 EXPECT_EQ(1, GetOrderOfRequest(1));
895 EXPECT_EQ(2, GetOrderOfRequest(2));
896 EXPECT_EQ(3, GetOrderOfRequest(3));
897 EXPECT_EQ(4, GetOrderOfRequest(4));
898 EXPECT_EQ(5, GetOrderOfRequest(5));
899 EXPECT_EQ(6, GetOrderOfRequest(6));
900 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17901
902 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13903 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53904}
905
906TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
907 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
908
[email protected]9e743cd2010-03-16 07:03:53909 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30910
[email protected]211d21722009-07-22 15:48:53911 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01912 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
913 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
914 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
915 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53916
[email protected]2431756e2010-09-29 20:26:13917 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53918 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13919 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53920
921 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01922 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53923
[email protected]2431756e2010-09-29 20:26:13924 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53925
[email protected]2431756e2010-09-29 20:26:13926 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53927 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13928 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53929
930 EXPECT_EQ(1, GetOrderOfRequest(1));
931 EXPECT_EQ(2, GetOrderOfRequest(2));
932 EXPECT_EQ(3, GetOrderOfRequest(3));
933 EXPECT_EQ(4, GetOrderOfRequest(4));
934 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17935
936 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13937 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53938}
939
940TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
941 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
942
robpercival214763f2016-07-01 23:27:01943 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
944 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
945 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
946 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53947
[email protected]2431756e2010-09-29 20:26:13948 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53949 client_socket_factory_.allocation_count());
950
robpercival214763f2016-07-01 23:27:01951 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
952 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
953 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53954
[email protected]2431756e2010-09-29 20:26:13955 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53956
[email protected]2431756e2010-09-29 20:26:13957 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53958
959 // First 4 requests don't have to wait, and finish in order.
960 EXPECT_EQ(1, GetOrderOfRequest(1));
961 EXPECT_EQ(2, GetOrderOfRequest(2));
962 EXPECT_EQ(3, GetOrderOfRequest(3));
963 EXPECT_EQ(4, GetOrderOfRequest(4));
964
[email protected]ac790b42009-12-02 04:31:31965 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
966 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53967 EXPECT_EQ(7, GetOrderOfRequest(5));
968 EXPECT_EQ(6, GetOrderOfRequest(6));
969 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17970
971 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13972 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53973}
974
975TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
976 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
977
robpercival214763f2016-07-01 23:27:01978 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
979 EXPECT_THAT(StartRequest("a", LOW), IsOk());
980 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
981 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:53982
[email protected]2431756e2010-09-29 20:26:13983 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53984 client_socket_factory_.allocation_count());
985
robpercival214763f2016-07-01 23:27:01986 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
987 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
988 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53989
[email protected]2431756e2010-09-29 20:26:13990 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53991
[email protected]2431756e2010-09-29 20:26:13992 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53993 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13994 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53995
996 // First 4 requests don't have to wait, and finish in order.
997 EXPECT_EQ(1, GetOrderOfRequest(1));
998 EXPECT_EQ(2, GetOrderOfRequest(2));
999 EXPECT_EQ(3, GetOrderOfRequest(3));
1000 EXPECT_EQ(4, GetOrderOfRequest(4));
1001
1002 // Request ("b", 7) has the highest priority, but we can't make new socket for
1003 // group "b", because it has reached the per-group limit. Then we make
1004 // socket for ("c", 6), because it has higher priority than ("a", 4),
1005 // and we still can't make a socket for group "b".
1006 EXPECT_EQ(5, GetOrderOfRequest(5));
1007 EXPECT_EQ(6, GetOrderOfRequest(6));
1008 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171009
1010 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131011 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531012}
1013
1014// Make sure that we count connecting sockets against the total limit.
1015TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1016 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1017
robpercival214763f2016-07-01 23:27:011018 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1019 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1020 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531021
1022 // Create one asynchronous request.
1023 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011024 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531025
[email protected]6b175382009-10-13 06:47:471026 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1027 // actually become pending until 2ms after they have been created. In order
1028 // to flush all tasks, we need to wait so that we know there are no
1029 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:001030 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281031 base::RunLoop().RunUntilIdle();
[email protected]6b175382009-10-13 06:47:471032
[email protected]211d21722009-07-22 15:48:531033 // The next synchronous request should wait for its turn.
1034 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011035 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531036
[email protected]2431756e2010-09-29 20:26:131037 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531038
[email protected]2431756e2010-09-29 20:26:131039 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531040 client_socket_factory_.allocation_count());
1041
1042 EXPECT_EQ(1, GetOrderOfRequest(1));
1043 EXPECT_EQ(2, GetOrderOfRequest(2));
1044 EXPECT_EQ(3, GetOrderOfRequest(3));
1045 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171046 EXPECT_EQ(5, GetOrderOfRequest(5));
1047
1048 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131049 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531050}
1051
[email protected]6427fe22010-04-16 22:27:411052TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1053 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1054 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1055
robpercival214763f2016-07-01 23:27:011056 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1057 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1058 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1059 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411060
1061 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1062
1063 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1064
robpercival214763f2016-07-01 23:27:011065 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1066 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411067
1068 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1069
[email protected]2431756e2010-09-29 20:26:131070 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411071 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131072 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411073 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131074 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1075 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411076 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1077}
1078
[email protected]d7027bb2010-05-10 18:58:541079TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1080 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1081 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1082
1083 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521084 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131085 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151086 handle.Init("a", params_, DEFAULT_PRIORITY,
1087 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201088 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541089
1090 ClientSocketHandle handles[4];
1091 for (size_t i = 0; i < arraysize(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521092 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201093 EXPECT_EQ(
1094 ERR_IO_PENDING,
1095 handles[i].Init("b", params_, DEFAULT_PRIORITY,
1096 ClientSocketPool::RespectLimits::ENABLED,
1097 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541098 }
1099
1100 // One will be stalled, cancel all the handles now.
1101 // This should hit the OnAvailableSocketSlot() code where we previously had
1102 // stalled groups, but no longer have any.
1103 for (size_t i = 0; i < arraysize(handles); ++i)
1104 handles[i].Reset();
1105}
1106
[email protected]eb5a99382010-07-11 03:18:261107TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541108 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1109 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1110
[email protected]eb5a99382010-07-11 03:18:261111 {
1112 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521113 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261114 for (int i = 0; i < kDefaultMaxSockets; ++i) {
tfarina428341112016-09-22 13:38:201115 EXPECT_EQ(OK,
1116 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1117 ClientSocketPool::RespectLimits::ENABLED,
1118 callbacks[i].callback(), pool_.get(),
1119 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261120 }
1121
1122 // Force a stalled group.
1123 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521124 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201125 EXPECT_EQ(ERR_IO_PENDING,
1126 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1127 ClientSocketPool::RespectLimits::ENABLED,
1128 callback.callback(), pool_.get(),
1129 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261130
1131 // Cancel the stalled request.
1132 stalled_handle.Reset();
1133
1134 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1135 EXPECT_EQ(0, pool_->IdleSocketCount());
1136
1137 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541138 }
1139
[email protected]43a21b82010-06-10 21:30:541140 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1141 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261142}
[email protected]43a21b82010-06-10 21:30:541143
[email protected]eb5a99382010-07-11 03:18:261144TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1145 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1146 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1147
1148 {
1149 ClientSocketHandle handles[kDefaultMaxSockets];
1150 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521151 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201152 EXPECT_EQ(ERR_IO_PENDING,
1153 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1154 ClientSocketPool::RespectLimits::ENABLED,
1155 callback.callback(), pool_.get(),
1156 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261157 }
1158
1159 // Force a stalled group.
1160 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1161 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521162 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201163 EXPECT_EQ(ERR_IO_PENDING,
1164 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1165 ClientSocketPool::RespectLimits::ENABLED,
1166 callback.callback(), pool_.get(),
1167 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261168
1169 // Since it is stalled, it should have no connect jobs.
1170 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101171 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261172
1173 // Cancel the stalled request.
1174 handles[0].Reset();
1175
[email protected]eb5a99382010-07-11 03:18:261176 // Now we should have a connect job.
1177 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101178 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261179
1180 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011181 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261182
1183 EXPECT_EQ(kDefaultMaxSockets + 1,
1184 client_socket_factory_.allocation_count());
1185 EXPECT_EQ(0, pool_->IdleSocketCount());
1186 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101187 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261188
1189 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541190 }
1191
[email protected]eb5a99382010-07-11 03:18:261192 EXPECT_EQ(1, pool_->IdleSocketCount());
1193}
[email protected]43a21b82010-06-10 21:30:541194
[email protected]eb5a99382010-07-11 03:18:261195TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1196 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1197 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541198
[email protected]eb5a99382010-07-11 03:18:261199 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521200 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261201 {
[email protected]51fdc7c2012-04-10 19:19:481202 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261203 ClientSocketHandle handles[kDefaultMaxSockets];
1204 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521205 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201206 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
1207 params_, DEFAULT_PRIORITY,
1208 ClientSocketPool::RespectLimits::ENABLED,
1209 callback.callback(), pool_.get(),
1210 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261211 }
1212
1213 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1214 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481215 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261216
1217 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201218 EXPECT_EQ(ERR_IO_PENDING,
1219 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1220 ClientSocketPool::RespectLimits::ENABLED,
1221 callback.callback(), pool_.get(),
1222 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481223 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261224
1225 // Dropping out of scope will close all handles and return them to idle.
1226 }
[email protected]43a21b82010-06-10 21:30:541227
1228 // But if we wait for it, the released idle sockets will be closed in
1229 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011230 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261231
1232 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1233 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541234}
1235
1236// Regression test for http://crbug.com/40952.
1237TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1238 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221239 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541240 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1241
1242 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1243 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521244 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201245 EXPECT_EQ(
1246 OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1247 ClientSocketPool::RespectLimits::ENABLED,
1248 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541249 }
1250
1251 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281252 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541253
1254 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1255 // reuse a socket.
1256 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1257 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521258 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541259
1260 // "0" is special here, since it should be the first entry in the sorted map,
1261 // which is the one which we would close an idle socket for. We shouldn't
1262 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201263 EXPECT_EQ(OK,
1264 handle.Init("0", params_, DEFAULT_PRIORITY,
1265 ClientSocketPool::RespectLimits::ENABLED,
1266 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541267
1268 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1269 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1270}
1271
[email protected]ab838892009-06-30 18:49:051272TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531273 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091274
robpercival214763f2016-07-01 23:27:011275 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1276 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1277 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1278 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1279 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1280 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1281 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1282 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091283
[email protected]2431756e2010-09-29 20:26:131284 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091285
[email protected]c9d6a1d2009-07-14 16:15:201286 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1287 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131288 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1289 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091290
[email protected]c9d6a1d2009-07-14 16:15:201291 EXPECT_EQ(1, GetOrderOfRequest(1));
1292 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031293 EXPECT_EQ(8, GetOrderOfRequest(3));
1294 EXPECT_EQ(6, GetOrderOfRequest(4));
1295 EXPECT_EQ(4, GetOrderOfRequest(5));
1296 EXPECT_EQ(3, GetOrderOfRequest(6));
1297 EXPECT_EQ(5, GetOrderOfRequest(7));
1298 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171299
1300 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131301 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091302}
1303
[email protected]ab838892009-06-30 18:49:051304TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531305 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091306
robpercival214763f2016-07-01 23:27:011307 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1308 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1309 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1310 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1311 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1312 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1313 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091314
[email protected]2431756e2010-09-29 20:26:131315 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091316
[email protected]2431756e2010-09-29 20:26:131317 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011318 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201319
[email protected]2431756e2010-09-29 20:26:131320 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201321 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131322 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1323 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091324}
1325
1326// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051327// The pending connect job will be cancelled and should not call back into
1328// ClientSocketPoolBase.
1329TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531330 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201331
[email protected]ab838892009-06-30 18:49:051332 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131333 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521334 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151335 EXPECT_EQ(ERR_IO_PENDING,
1336 handle.Init("a", params_, DEFAULT_PRIORITY,
1337 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201338 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131339 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091340}
1341
[email protected]ab838892009-06-30 18:49:051342TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531343 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201344
[email protected]ab838892009-06-30 18:49:051345 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061346 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521347 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091348
mmenked3641e12016-01-28 16:06:151349 EXPECT_EQ(ERR_IO_PENDING,
1350 handle.Init("a", params_, DEFAULT_PRIORITY,
1351 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201352 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091353
1354 handle.Reset();
1355
[email protected]6ecf2b92011-12-15 01:14:521356 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131357 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151358 handle.Init("a", params_, DEFAULT_PRIORITY,
1359 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201360 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091361
robpercival214763f2016-07-01 23:27:011362 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091363 EXPECT_FALSE(callback.have_result());
1364
1365 handle.Reset();
1366}
1367
[email protected]ab838892009-06-30 18:49:051368TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531369 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091370
robpercival214763f2016-07-01 23:27:011371 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1372 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1373 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1374 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1375 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1376 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1377 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091378
1379 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201380 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131381 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1382 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091383
[email protected]2431756e2010-09-29 20:26:131384 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091385
[email protected]c9d6a1d2009-07-14 16:15:201386 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1387 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131388 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1389 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091390
[email protected]c9d6a1d2009-07-14 16:15:201391 EXPECT_EQ(1, GetOrderOfRequest(1));
1392 EXPECT_EQ(2, GetOrderOfRequest(2));
1393 EXPECT_EQ(5, GetOrderOfRequest(3));
1394 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131395 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1396 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201397 EXPECT_EQ(4, GetOrderOfRequest(6));
1398 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171399
1400 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131401 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091402}
1403
mmenke33d24423d2015-05-19 19:41:091404// Function to be used as a callback on socket request completion. It first
1405// disconnects the successfully connected socket from the first request, and
1406// then reuses the ClientSocketHandle to request another socket.
1407//
1408// |nested_callback| is called with the result of the second socket request.
1409void RequestSocketOnComplete(ClientSocketHandle* handle,
1410 TestClientSocketPool* pool,
1411 TestConnectJobFactory* test_connect_job_factory,
1412 TestConnectJob::JobType next_job_type,
1413 const CompletionCallback& nested_callback,
1414 int first_request_result) {
robpercival214763f2016-07-01 23:27:011415 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091416
1417 test_connect_job_factory->set_job_type(next_job_type);
1418
1419 // Don't allow reuse of the socket. Disconnect it and then release it.
1420 if (handle->socket())
1421 handle->socket()->Disconnect();
1422 handle->Reset();
1423
mmenked3641e12016-01-28 16:06:151424 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091425 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151426 int rv = handle->Init("a", params, LOWEST,
1427 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201428 nested_callback, pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091429 if (rv != ERR_IO_PENDING) {
1430 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
1431 nested_callback.Run(rv);
1432 } else {
1433 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521434 }
mmenke33d24423d2015-05-19 19:41:091435}
[email protected]f6d1d6eb2009-06-24 20:16:091436
mmenke33d24423d2015-05-19 19:41:091437// Tests the case where a second socket is requested in a completion callback,
1438// and the second socket connects asynchronously. Reuses the same
1439// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581440TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531441 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201442
[email protected]0b7648c2009-07-06 20:14:011443 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061444 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091445 TestCompletionCallback second_result_callback;
1446 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151447 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091448 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1449 connect_job_factory_, TestConnectJob::kMockPendingJob,
1450 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201451 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011452 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091453
robpercival214763f2016-07-01 23:27:011454 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581455}
[email protected]f6d1d6eb2009-06-24 20:16:091456
mmenke33d24423d2015-05-19 19:41:091457// Tests the case where a second socket is requested in a completion callback,
1458// and the second socket connects synchronously. Reuses the same
1459// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581460TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531461 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201462
[email protected]0b7648c2009-07-06 20:14:011463 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061464 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091465 TestCompletionCallback second_result_callback;
1466 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151467 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091468 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1469 connect_job_factory_, TestConnectJob::kMockPendingJob,
1470 second_result_callback.callback()),
tfarina428341112016-09-22 13:38:201471 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011472 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581473
robpercival214763f2016-07-01 23:27:011474 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091475}
1476
1477// Make sure that pending requests get serviced after active requests get
1478// cancelled.
[email protected]ab838892009-06-30 18:49:051479TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531480 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201481
[email protected]0b7648c2009-07-06 20:14:011482 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091483
robpercival214763f2016-07-01 23:27:011484 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1485 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1486 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1487 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1488 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1489 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1490 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091491
[email protected]c9d6a1d2009-07-14 16:15:201492 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1493 // Let's cancel them.
1494 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131495 ASSERT_FALSE(request(i)->handle()->is_initialized());
1496 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091497 }
1498
[email protected]f6d1d6eb2009-06-24 20:16:091499 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131500 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011501 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131502 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091503 }
1504
[email protected]2431756e2010-09-29 20:26:131505 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1506 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091507}
1508
1509// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051510TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531511 const size_t kMaxSockets = 5;
1512 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201513
[email protected]0b7648c2009-07-06 20:14:011514 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091515
[email protected]211d21722009-07-22 15:48:531516 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1517 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091518
1519 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531520 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011521 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091522
[email protected]211d21722009-07-22 15:48:531523 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011524 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091525}
1526
[email protected]5fc08e32009-07-15 17:09:571527TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531528 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571529
1530 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1531
[email protected]2431756e2010-09-29 20:26:131532 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521533 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151534 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1535 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201536 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011537 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571538
1539 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131540 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571541
mmenked3641e12016-01-28 16:06:151542 rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1543 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201544 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011545 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1546 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571547
[email protected]2431756e2010-09-29 20:26:131548 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481549 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571550 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1551}
1552
[email protected]2b7523d2009-07-29 20:29:231553// Regression test for http://crbug.com/17985.
1554TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1555 const int kMaxSockets = 3;
1556 const int kMaxSocketsPerGroup = 2;
1557 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1558
[email protected]ac790b42009-12-02 04:31:311559 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231560
robpercival214763f2016-07-01 23:27:011561 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1562 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231563
1564 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011565 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231566
1567 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011568 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231569
1570 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011571 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1572 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231573
[email protected]eb5a99382010-07-11 03:18:261574 // Release the first two sockets from "a". Because this is a keepalive,
1575 // the first release will unblock the pending request for "a". The
1576 // second release will unblock a request for "c", becaue it is the next
1577 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131578 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1579 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231580
1581 // Closing idle sockets should not get us into trouble, but in the bug
1582 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411583 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541584 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261585
[email protected]2da659e2013-05-23 20:51:341586 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281587 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231588}
1589
[email protected]4d3b05d2010-01-27 21:27:291590TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531591 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571592
1593 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131594 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521595 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511596 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:151597 int rv = handle.Init("a", params_, LOWEST,
1598 ClientSocketPool::RespectLimits::ENABLED,
1599 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011600 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131601 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481602 TestLoadTimingInfoNotConnected(handle);
1603
robpercival214763f2016-07-01 23:27:011604 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131605 EXPECT_TRUE(handle.is_initialized());
1606 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481607 TestLoadTimingInfoConnectedNotReused(handle);
1608
[email protected]2431756e2010-09-29 20:26:131609 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481610 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301611
mmenke43758e62015-05-04 21:09:461612 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401613 log.GetEntries(&entries);
1614
1615 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001616 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171617 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001618 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1619 NetLogEventPhase::NONE));
1620 EXPECT_TRUE(LogContainsEvent(entries, 2,
1621 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1622 NetLogEventPhase::NONE));
1623 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571624}
1625
[email protected]4d3b05d2010-01-27 21:27:291626TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571627 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531628 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571629
1630 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131631 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521632 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511633 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181634 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131635 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431636 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451637 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131638 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151639 EXPECT_EQ(ERR_IO_PENDING,
1640 handle.Init("a", params_, DEFAULT_PRIORITY,
1641 ClientSocketPool::RespectLimits::ENABLED,
1642 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131643 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011644 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131645 EXPECT_FALSE(handle.is_ssl_error());
1646 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301647
mmenke43758e62015-05-04 21:09:461648 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401649 log.GetEntries(&entries);
1650
1651 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001652 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171653 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001654 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1655 NetLogEventPhase::NONE));
1656 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571657}
1658
mmenke6be122f2015-03-09 22:22:471659// Check that an async ConnectJob failure does not result in creation of a new
1660// ConnectJob when there's another pending request also waiting on its own
1661// ConnectJob. See http://crbug.com/463960.
1662TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1663 CreatePool(2, 2);
1664 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1665
robpercival214763f2016-07-01 23:27:011666 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1667 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471668
robpercival214763f2016-07-01 23:27:011669 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1670 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471671
1672 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1673}
1674
[email protected]4d3b05d2010-01-27 21:27:291675TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101676 // TODO(eroman): Add back the log expectations! Removed them because the
1677 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531678 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571679
1680 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131681 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521682 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131683 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521684 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571685
[email protected]2431756e2010-09-29 20:26:131686 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151687 handle.Init("a", params_, DEFAULT_PRIORITY,
1688 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201689 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511690 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201691 EXPECT_EQ(
1692 ERR_IO_PENDING,
1693 handle2.Init("a", params_, DEFAULT_PRIORITY,
1694 ClientSocketPool::RespectLimits::ENABLED,
1695 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571696
[email protected]2431756e2010-09-29 20:26:131697 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571698
[email protected]fd7b7c92009-08-20 19:38:301699
1700 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301701
robpercival214763f2016-07-01 23:27:011702 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131703 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301704
1705 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531706 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571707}
1708
[email protected]4d3b05d2010-01-27 21:27:291709TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341710 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1711
[email protected]17a0c6c2009-08-04 00:07:041712 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1713
robpercival214763f2016-07-01 23:27:011714 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1715 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1716 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1717 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341718
1719 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131720 (*requests())[2]->handle()->Reset();
1721 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341722 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1723
[email protected]2431756e2010-09-29 20:26:131724 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341725 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1726
[email protected]2431756e2010-09-29 20:26:131727 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261728 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341729}
1730
[email protected]5fc08e32009-07-15 17:09:571731// When requests and ConnectJobs are not coupled, the request will get serviced
1732// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291733TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531734 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571735
1736 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321737 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571738
[email protected]2431756e2010-09-29 20:26:131739 std::vector<TestSocketRequest*> request_order;
1740 size_t completion_count; // unused
1741 TestSocketRequest req1(&request_order, &completion_count);
tfarina428341112016-09-22 13:38:201742 int rv = req1.handle()->Init(
1743 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
1744 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011745 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1746 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571747
1748 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1749 // without a job.
1750 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1751
[email protected]2431756e2010-09-29 20:26:131752 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151753 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
1754 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201755 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011756 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131757 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151758 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
1759 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201760 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011761 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571762
1763 // Both Requests 2 and 3 are pending. We release socket 1 which should
1764 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331765 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341766 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281767 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331768 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011769 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331770 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571771
1772 // Signal job 2, which should service request 3.
1773
1774 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011775 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571776
[email protected]2431756e2010-09-29 20:26:131777 ASSERT_EQ(3U, request_order.size());
1778 EXPECT_EQ(&req1, request_order[0]);
1779 EXPECT_EQ(&req2, request_order[1]);
1780 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571781 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1782}
1783
1784// The requests are not coupled to the jobs. So, the requests should finish in
1785// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:291786TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531787 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571788 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:321789 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:571790
[email protected]2431756e2010-09-29 20:26:131791 std::vector<TestSocketRequest*> request_order;
1792 size_t completion_count; // unused
1793 TestSocketRequest req1(&request_order, &completion_count);
tfarina428341112016-09-22 13:38:201794 int rv = req1.handle()->Init(
1795 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
1796 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011797 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571798
[email protected]2431756e2010-09-29 20:26:131799 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151800 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
1801 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201802 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011803 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571804
1805 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:321806 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:571807
[email protected]2431756e2010-09-29 20:26:131808 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151809 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
1810 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201811 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011812 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571813
robpercival214763f2016-07-01 23:27:011814 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1815 EXPECT_THAT(req2.WaitForResult(), IsOk());
1816 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:571817
[email protected]2431756e2010-09-29 20:26:131818 ASSERT_EQ(3U, request_order.size());
1819 EXPECT_EQ(&req1, request_order[0]);
1820 EXPECT_EQ(&req2, request_order[1]);
1821 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571822}
1823
[email protected]03b7c8c2013-07-20 04:38:551824// Test GetLoadState in the case there's only one socket request.
1825TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:531826 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:551827 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:571828
[email protected]2431756e2010-09-29 20:26:131829 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521830 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151831 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1832 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201833 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011834 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551835 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:571836
[email protected]03b7c8c2013-07-20 04:38:551837 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
1838 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
1839
1840 // No point in completing the connection, since ClientSocketHandles only
1841 // expect the LoadState to be checked while connecting.
1842}
1843
1844// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:001845// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:551846TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
1847 CreatePool(2, 2);
1848 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1849
1850 ClientSocketHandle handle;
1851 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151852 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1853 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201854 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011855 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:001856 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
1857
1858 ClientSocketHandle handle2;
1859 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:151860 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
1861 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201862 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011863 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:001864 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
1865
1866 // Check that both handles report the state of the first job.
1867 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
1868 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
1869
1870 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
1871
1872 // Check that both handles change to LOAD_STATE_CONNECTING.
1873 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1874 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
1875}
1876
1877// Test that the second connection request does not affect the pool's load
1878// status.
1879TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
1880 CreatePool(2, 2);
1881 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1882
1883 ClientSocketHandle handle;
1884 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151885 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1886 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201887 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011888 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571889
[email protected]2431756e2010-09-29 20:26:131890 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521891 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:151892 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
1893 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201894 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011895 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:001896 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:551897
[email protected]03b7c8c2013-07-20 04:38:551898 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1899 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
1900
haavardm835c1d62015-04-22 08:18:001901 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:551902 // second handle switches to the state of the remaining ConnectJob.
1903 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:011904 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:001905 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:551906}
1907
1908// Test GetLoadState in the case the per-group limit is reached.
1909TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
1910 CreatePool(2, 1);
1911 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1912
1913 ClientSocketHandle handle;
1914 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151915 int rv = handle.Init("a", params_, MEDIUM,
1916 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201917 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011918 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551919 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1920
1921 // Request another socket from the same pool, buth with a higher priority.
1922 // The first request should now be stalled at the socket group limit.
1923 ClientSocketHandle handle2;
1924 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:151925 rv = handle2.Init("a", params_, HIGHEST,
1926 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201927 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011928 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551929 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
1930 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
1931
1932 // The first handle should remain stalled as the other socket goes through
1933 // the connect process.
1934
1935 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
1936 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
1937 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
1938
1939 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:011940 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:551941 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
1942
1943 // Closing the second socket should cause the stalled handle to finally get a
1944 // ConnectJob.
1945 handle2.socket()->Disconnect();
1946 handle2.Reset();
1947 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1948}
1949
1950// Test GetLoadState in the case the per-pool limit is reached.
1951TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
1952 CreatePool(2, 2);
1953 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1954
1955 ClientSocketHandle handle;
1956 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151957 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1958 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201959 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011960 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551961
1962 // Request for socket from another pool.
1963 ClientSocketHandle handle2;
1964 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:151965 rv = handle2.Init("b", params_, DEFAULT_PRIORITY,
1966 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201967 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011968 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551969
1970 // Request another socket from the first pool. Request should stall at the
1971 // socket pool limit.
1972 ClientSocketHandle handle3;
1973 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:151974 rv = handle3.Init("a", params_, DEFAULT_PRIORITY,
1975 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201976 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011977 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551978
1979 // The third handle should remain stalled as the other sockets in its group
1980 // goes through the connect process.
1981
1982 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1983 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
1984
1985 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
1986 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
1987 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
1988
1989 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:011990 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:551991 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
1992
1993 // Closing a socket should allow the stalled handle to finally get a new
1994 // ConnectJob.
1995 handle.socket()->Disconnect();
1996 handle.Reset();
1997 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:571998}
1999
[email protected]e772db3f2010-07-12 18:11:132000TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2001 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2002 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2003
[email protected]2431756e2010-09-29 20:26:132004 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522005 TestCompletionCallback callback;
2006 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
mmenked3641e12016-01-28 16:06:152007 handle.Init("a", params_, DEFAULT_PRIORITY,
2008 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202009 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132010 EXPECT_TRUE(handle.is_initialized());
2011 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132012}
2013
2014TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2015 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2016
2017 connect_job_factory_->set_job_type(
2018 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132019 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522020 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132021 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152022 handle.Init("a", params_, DEFAULT_PRIORITY,
2023 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202024 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132025 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012026 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132027 EXPECT_TRUE(handle.is_initialized());
2028 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132029}
2030
[email protected]e60e47a2010-07-14 03:37:182031TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2032 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2033 connect_job_factory_->set_job_type(
2034 TestConnectJob::kMockAdditionalErrorStateJob);
2035
[email protected]2431756e2010-09-29 20:26:132036 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522037 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132038 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:152039 handle.Init("a", params_, DEFAULT_PRIORITY,
2040 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202041 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132042 EXPECT_FALSE(handle.is_initialized());
2043 EXPECT_FALSE(handle.socket());
2044 EXPECT_TRUE(handle.is_ssl_error());
2045 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182046}
2047
2048TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2049 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2050
2051 connect_job_factory_->set_job_type(
2052 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132053 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522054 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132055 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152056 handle.Init("a", params_, DEFAULT_PRIORITY,
2057 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202058 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132059 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012060 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132061 EXPECT_FALSE(handle.is_initialized());
2062 EXPECT_FALSE(handle.socket());
2063 EXPECT_TRUE(handle.is_ssl_error());
2064 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182065}
2066
martijn003cd612016-05-19 22:24:382067// Make sure we can reuse sockets.
2068TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412069 CreatePoolWithIdleTimeouts(
2070 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032071 base::TimeDelta(), // Time out unused sockets immediately.
2072 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2073
2074 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2075
2076 ClientSocketHandle handle;
2077 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152078 int rv = handle.Init("a", params_, LOWEST,
2079 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202080 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012081 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032082 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012083 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032084
2085 // Use and release the socket.
2086 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]034df0f32013-01-07 23:17:482087 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032088 handle.Reset();
2089
2090 // Should now have one idle socket.
2091 ASSERT_EQ(1, pool_->IdleSocketCount());
2092
2093 // Request a new socket. This should reuse the old socket and complete
2094 // synchronously.
vishal.b62985ca92015-04-17 08:45:512095 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:152096 rv = handle.Init("a", params_, LOWEST,
2097 ClientSocketPool::RespectLimits::ENABLED,
2098 CompletionCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012099 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032100 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482101 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032102
2103 ASSERT_TRUE(pool_->HasGroup("a"));
2104 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2105 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2106
mmenke43758e62015-05-04 21:09:462107 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032108 log.GetEntries(&entries);
2109 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002110 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032111}
2112
blundellb8163592f2015-12-16 14:22:422113#if defined(OS_IOS)
2114// TODO(droger): Enable this test (crbug.com/512595).
martijn003cd612016-05-19 22:24:382115#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2116 DISABLED_CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422117#else
martijn003cd612016-05-19 22:24:382118#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2119 CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422120#endif
martijn003cd612016-05-19 22:24:382121// Make sure we cleanup old unused sockets.
2122TEST_F(ClientSocketPoolBaseTest, MAYBE_CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032123 CreatePoolWithIdleTimeouts(
2124 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2125 base::TimeDelta(), // Time out unused sockets immediately
2126 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412127
2128 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2129
2130 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2131
2132 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522133 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152134 int rv = handle.Init("a", params_, LOWEST,
2135 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202136 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012137 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412138 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2139
2140 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522141 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152142 rv = handle2.Init("a", params_, LOWEST,
2143 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202144 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012145 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412146 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2147
2148 // Cancel one of the requests. Wait for the other, which will get the first
2149 // job. Release the socket. Run the loop again to make sure the second
2150 // socket is sitting idle and the first one is released (since ReleaseSocket()
2151 // just posts a DoReleaseSocket() task).
2152
2153 handle.Reset();
robpercival214763f2016-07-01 23:27:012154 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412155 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552156 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]64770b7d2011-11-16 04:30:412157 handle2.Reset();
2158
[email protected]e7b1c6d2c2012-05-05 00:54:032159 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2160 // actually become pending until 2ms after they have been created. In order
2161 // to flush all tasks, we need to wait so that we know there are no
2162 // soon-to-be-pending tasks waiting.
2163 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:282164 base::RunLoop().RunUntilIdle();
[email protected]64770b7d2011-11-16 04:30:412165
[email protected]e7b1c6d2c2012-05-05 00:54:032166 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412167 ASSERT_EQ(2, pool_->IdleSocketCount());
2168
2169 // Request a new socket. This should cleanup the unused and timed out ones.
2170 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512171 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522172 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152173 rv = handle.Init("a", params_, LOWEST,
2174 ClientSocketPool::RespectLimits::ENABLED,
2175 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012176 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2177 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412178 EXPECT_FALSE(handle.is_reused());
2179
[email protected]e7b1c6d2c2012-05-05 00:54:032180 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412181 ASSERT_TRUE(pool_->HasGroup("a"));
2182 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2183 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2184
mmenke43758e62015-05-04 21:09:462185 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412186 log.GetEntries(&entries);
2187 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002188 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412189}
2190
[email protected]2041cf342010-02-19 03:15:592191// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162192// because of multiple releasing disconnected sockets.
2193TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2194 CreatePoolWithIdleTimeouts(
2195 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2196 base::TimeDelta(), // Time out unused sockets immediately.
2197 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2198
2199 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2200
2201 // Startup 4 connect jobs. Two of them will be pending.
2202
[email protected]2431756e2010-09-29 20:26:132203 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522204 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152205 int rv = handle.Init("a", params_, LOWEST,
2206 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202207 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012208 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162209
[email protected]2431756e2010-09-29 20:26:132210 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522211 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152212 rv = handle2.Init("a", params_, LOWEST,
2213 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202214 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012215 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162216
[email protected]2431756e2010-09-29 20:26:132217 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522218 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152219 rv = handle3.Init("a", params_, LOWEST,
2220 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202221 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012222 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162223
[email protected]2431756e2010-09-29 20:26:132224 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522225 TestCompletionCallback callback4;
mmenked3641e12016-01-28 16:06:152226 rv = handle4.Init("a", params_, LOWEST,
2227 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202228 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012229 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162230
2231 // Release two disconnected sockets.
2232
[email protected]2431756e2010-09-29 20:26:132233 handle.socket()->Disconnect();
2234 handle.Reset();
2235 handle2.socket()->Disconnect();
2236 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162237
robpercival214763f2016-07-01 23:27:012238 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132239 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012240 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132241 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162242}
2243
[email protected]d7027bb2010-05-10 18:58:542244// Regression test for http://crbug.com/42267.
2245// When DoReleaseSocket() is processed for one socket, it is blocked because the
2246// other stalled groups all have releasing sockets, so no progress can be made.
2247TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2248 CreatePoolWithIdleTimeouts(
2249 4 /* socket limit */, 4 /* socket limit per group */,
2250 base::TimeDelta(), // Time out unused sockets immediately.
2251 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2252
2253 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2254
2255 // Max out the socket limit with 2 per group.
2256
[email protected]2431756e2010-09-29 20:26:132257 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522258 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132259 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522260 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542261
2262 for (int i = 0; i < 2; ++i) {
mmenked3641e12016-01-28 16:06:152263 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST,
2264 ClientSocketPool::RespectLimits::ENABLED,
2265 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202266 NetLogWithSource()));
mmenked3641e12016-01-28 16:06:152267 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST,
2268 ClientSocketPool::RespectLimits::ENABLED,
2269 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202270 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542271 }
[email protected]b89f7e42010-05-20 20:37:002272
[email protected]d7027bb2010-05-10 18:58:542273 // Make 4 pending requests, 2 per group.
2274
2275 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202276 EXPECT_EQ(ERR_IO_PENDING,
2277 handle_a[i].Init("a", params_, LOWEST,
2278 ClientSocketPool::RespectLimits::ENABLED,
2279 callback_a[i].callback(), pool_.get(),
2280 NetLogWithSource()));
2281 EXPECT_EQ(ERR_IO_PENDING,
2282 handle_b[i].Init("b", params_, LOWEST,
2283 ClientSocketPool::RespectLimits::ENABLED,
2284 callback_b[i].callback(), pool_.get(),
2285 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542286 }
2287
2288 // Release b's socket first. The order is important, because in
2289 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2290 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2291 // first, which has a releasing socket, so it refuses to start up another
2292 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132293 handle_b[0].socket()->Disconnect();
2294 handle_b[0].Reset();
2295 handle_a[0].socket()->Disconnect();
2296 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542297
2298 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282299 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542300
[email protected]2431756e2010-09-29 20:26:132301 handle_b[1].socket()->Disconnect();
2302 handle_b[1].Reset();
2303 handle_a[1].socket()->Disconnect();
2304 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542305
2306 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012307 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2308 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542309 }
2310}
2311
[email protected]fd4fe0b2010-02-08 23:02:152312TEST_F(ClientSocketPoolBaseTest,
2313 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2314 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2315
2316 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2317
robpercival214763f2016-07-01 23:27:012318 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2319 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2320 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2321 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152322
robpercival214763f2016-07-01 23:27:012323 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2324 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132325 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152326
2327 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132328 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012329 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152330
[email protected]2431756e2010-09-29 20:26:132331 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012332 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132333 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152334
2335 EXPECT_EQ(1, GetOrderOfRequest(1));
2336 EXPECT_EQ(2, GetOrderOfRequest(2));
2337 EXPECT_EQ(3, GetOrderOfRequest(3));
2338 EXPECT_EQ(4, GetOrderOfRequest(4));
2339
2340 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132341 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152342}
2343
[email protected]6ecf2b92011-12-15 01:14:522344class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042345 public:
[email protected]2431756e2010-09-29 20:26:132346 TestReleasingSocketRequest(TestClientSocketPool* pool,
2347 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182348 bool reset_releasing_handle)
2349 : pool_(pool),
2350 expected_result_(expected_result),
[email protected]6ecf2b92011-12-15 01:14:522351 reset_releasing_handle_(reset_releasing_handle),
[email protected]aa249b52013-04-30 01:04:322352 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete,
2353 base::Unretained(this))) {
[email protected]6ecf2b92011-12-15 01:14:522354 }
2355
dchengb03027d2014-10-21 12:00:202356 ~TestReleasingSocketRequest() override {}
[email protected]4f1e4982010-03-02 18:31:042357
2358 ClientSocketHandle* handle() { return &handle_; }
2359
[email protected]6ecf2b92011-12-15 01:14:522360 const CompletionCallback& callback() const { return callback_; }
[email protected]4f1e4982010-03-02 18:31:042361
2362 private:
[email protected]6ecf2b92011-12-15 01:14:522363 void OnComplete(int result) {
2364 SetResult(result);
2365 if (reset_releasing_handle_)
2366 handle_.Reset();
2367
mmenked3641e12016-01-28 16:06:152368 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
[email protected]6ecf2b92011-12-15 01:14:522369 EXPECT_EQ(expected_result_,
[email protected]bb1c4662013-11-14 00:00:072370 handle2_.Init("a", con_params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:152371 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202372 callback2_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522373 }
2374
[email protected]2431756e2010-09-29 20:26:132375 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182376 int expected_result_;
2377 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042378 ClientSocketHandle handle_;
2379 ClientSocketHandle handle2_;
[email protected]6ecf2b92011-12-15 01:14:522380 CompletionCallback callback_;
2381 TestCompletionCallback callback2_;
[email protected]4f1e4982010-03-02 18:31:042382};
2383
[email protected]e60e47a2010-07-14 03:37:182384
2385TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2386 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2387
robpercival214763f2016-07-01 23:27:012388 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2389 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2390 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182391
[email protected]2431756e2010-09-29 20:26:132392 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182393 client_socket_factory_.allocation_count());
2394
2395 connect_job_factory_->set_job_type(
2396 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2397 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202398 EXPECT_EQ(
2399 ERR_IO_PENDING,
2400 req.handle()->Init("a", params_, DEFAULT_PRIORITY,
2401 ClientSocketPool::RespectLimits::ENABLED,
2402 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182403 // The next job should complete synchronously
2404 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2405
robpercival214763f2016-07-01 23:27:012406 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182407 EXPECT_FALSE(req.handle()->is_initialized());
2408 EXPECT_FALSE(req.handle()->socket());
2409 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432410 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182411}
2412
[email protected]b6501d3d2010-06-03 23:53:342413// http://crbug.com/44724 regression test.
2414// We start releasing the pool when we flush on network change. When that
2415// happens, the only active references are in the ClientSocketHandles. When a
2416// ConnectJob completes and calls back into the last ClientSocketHandle, that
2417// callback can release the last reference and delete the pool. After the
2418// callback finishes, we go back to the stack frame within the now-deleted pool.
2419// Executing any code that refers to members of the now-deleted pool can cause
2420// crashes.
2421TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2422 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2423 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2424
2425 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522426 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152427 EXPECT_EQ(ERR_IO_PENDING,
2428 handle.Init("a", params_, DEFAULT_PRIORITY,
2429 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202430 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342431
[email protected]7af985a2012-12-14 22:40:422432 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342433
2434 // We'll call back into this now.
2435 callback.WaitForResult();
2436}
2437
[email protected]a7e38572010-06-07 18:22:242438TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2439 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2440 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2441
2442 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522443 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152444 EXPECT_EQ(ERR_IO_PENDING,
2445 handle.Init("a", params_, DEFAULT_PRIORITY,
2446 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202447 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012448 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242449 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2450
[email protected]7af985a2012-12-14 22:40:422451 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242452
2453 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282454 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242455
mmenked3641e12016-01-28 16:06:152456 EXPECT_EQ(ERR_IO_PENDING,
2457 handle.Init("a", params_, DEFAULT_PRIORITY,
2458 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202459 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012460 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242461 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2462}
2463
[email protected]6ecf2b92011-12-15 01:14:522464class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142465 public:
2466 ConnectWithinCallback(
2467 const std::string& group_name,
2468 const scoped_refptr<TestSocketParams>& params,
[email protected]2431756e2010-09-29 20:26:132469 TestClientSocketPool* pool)
[email protected]6ecf2b92011-12-15 01:14:522470 : group_name_(group_name),
2471 params_(params),
2472 pool_(pool),
[email protected]aa249b52013-04-30 01:04:322473 callback_(base::Bind(&ConnectWithinCallback::OnComplete,
2474 base::Unretained(this))) {
[email protected]06f92462010-08-31 19:24:142475 }
2476
dchengb03027d2014-10-21 12:00:202477 ~ConnectWithinCallback() override {}
[email protected]06f92462010-08-31 19:24:142478
2479 int WaitForNestedResult() {
2480 return nested_callback_.WaitForResult();
2481 }
2482
[email protected]6ecf2b92011-12-15 01:14:522483 const CompletionCallback& callback() const { return callback_; }
2484
[email protected]06f92462010-08-31 19:24:142485 private:
[email protected]6ecf2b92011-12-15 01:14:522486 void OnComplete(int result) {
2487 SetResult(result);
tfarina428341112016-09-22 13:38:202488 EXPECT_EQ(
2489 ERR_IO_PENDING,
2490 handle_.Init(group_name_, params_, DEFAULT_PRIORITY,
2491 ClientSocketPool::RespectLimits::ENABLED,
2492 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522493 }
2494
[email protected]06f92462010-08-31 19:24:142495 const std::string group_name_;
2496 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132497 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142498 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522499 CompletionCallback callback_;
2500 TestCompletionCallback nested_callback_;
2501
2502 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142503};
2504
2505TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2506 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2507
2508 // First job will be waiting until it gets aborted.
2509 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2510
2511 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132512 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152513 EXPECT_EQ(ERR_IO_PENDING,
2514 handle.Init("a", params_, DEFAULT_PRIORITY,
2515 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202516 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142517
2518 // Second job will be started during the first callback, and will
2519 // asynchronously complete with OK.
2520 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422521 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012522 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2523 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142524}
2525
[email protected]25eea382010-07-10 23:55:262526// Cancel a pending socket request while we're at max sockets,
2527// and verify that the backup socket firing doesn't cause a crash.
2528TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2529 // Max 4 sockets globally, max 4 sockets per group.
2530 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222531 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262532
[email protected]4baaf9d2010-08-31 15:15:442533 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2534 // timer.
[email protected]25eea382010-07-10 23:55:262535 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2536 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522537 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152538 EXPECT_EQ(ERR_IO_PENDING,
2539 handle.Init("bar", params_, DEFAULT_PRIORITY,
2540 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202541 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262542
2543 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2544 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2545 ClientSocketHandle handles[kDefaultMaxSockets];
2546 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522547 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:202548 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY,
2549 ClientSocketPool::RespectLimits::ENABLED,
2550 callback.callback(), pool_.get(),
2551 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262552 }
2553
fdoray5eeb7642016-06-22 16:11:282554 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262555
2556 // Cancel the pending request.
2557 handle.Reset();
2558
2559 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002560 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2561 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262562
fdoray5eeb7642016-06-22 16:11:282563 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262564 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2565}
2566
[email protected]3f00be82010-09-27 19:50:022567TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442568 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2569 pool_->EnableConnectBackupJobs();
2570
2571 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2572 // timer.
2573 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2574 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522575 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152576 EXPECT_EQ(ERR_IO_PENDING,
2577 handle.Init("bar", params_, DEFAULT_PRIORITY,
2578 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202579 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442580 ASSERT_TRUE(pool_->HasGroup("bar"));
2581 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102582 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442583
2584 // Cancel the socket request. This should cancel the backup timer. Wait for
2585 // the backup time to see if it indeed got canceled.
2586 handle.Reset();
2587 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002588 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2589 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282590 base::RunLoop().RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442591 ASSERT_TRUE(pool_->HasGroup("bar"));
2592 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2593}
2594
[email protected]3f00be82010-09-27 19:50:022595TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2596 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2597 pool_->EnableConnectBackupJobs();
2598
2599 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2600 // timer.
2601 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2602 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522603 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152604 EXPECT_EQ(ERR_IO_PENDING,
2605 handle.Init("bar", params_, DEFAULT_PRIORITY,
2606 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202607 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022608 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2609 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522610 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202611 EXPECT_EQ(
2612 ERR_IO_PENDING,
2613 handle2.Init("bar", params_, DEFAULT_PRIORITY,
2614 ClientSocketPool::RespectLimits::ENABLED,
2615 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022616 ASSERT_TRUE(pool_->HasGroup("bar"));
2617 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2618
2619 // Cancel request 1 and then complete request 2. With the requests finished,
2620 // the backup timer should be cancelled.
2621 handle.Reset();
robpercival214763f2016-07-01 23:27:012622 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022623 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002624 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2625 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282626 base::RunLoop().RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022627}
2628
[email protected]eb5a99382010-07-11 03:18:262629// Test delayed socket binding for the case where we have two connects,
2630// and while one is waiting on a connect, the other frees up.
2631// The socket waiting on a connect should switch immediately to the freed
2632// up socket.
2633TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2634 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2635 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2636
2637 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522638 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132639 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152640 handle1.Init("a", params_, DEFAULT_PRIORITY,
2641 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202642 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012643 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262644
2645 // No idle sockets, no pending jobs.
2646 EXPECT_EQ(0, pool_->IdleSocketCount());
2647 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2648
2649 // Create a second socket to the same host, but this one will wait.
2650 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2651 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132652 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152653 handle2.Init("a", params_, DEFAULT_PRIORITY,
2654 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202655 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262656 // No idle sockets, and one connecting job.
2657 EXPECT_EQ(0, pool_->IdleSocketCount());
2658 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2659
2660 // Return the first handle to the pool. This will initiate the delayed
2661 // binding.
2662 handle1.Reset();
2663
fdoray5eeb7642016-06-22 16:11:282664 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262665
2666 // Still no idle sockets, still one pending connect job.
2667 EXPECT_EQ(0, pool_->IdleSocketCount());
2668 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2669
2670 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012671 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262672
2673 // And we can see there is still one job waiting.
2674 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2675
2676 // Finally, signal the waiting Connect.
2677 client_socket_factory_.SignalJobs();
2678 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2679
fdoray5eeb7642016-06-22 16:11:282680 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262681}
2682
2683// Test delayed socket binding when a group is at capacity and one
2684// of the group's sockets frees up.
2685TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2686 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2687 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2688
2689 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522690 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132691 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152692 handle1.Init("a", params_, DEFAULT_PRIORITY,
2693 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202694 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012695 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262696
2697 // No idle sockets, no pending jobs.
2698 EXPECT_EQ(0, pool_->IdleSocketCount());
2699 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2700
2701 // Create a second socket to the same host, but this one will wait.
2702 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2703 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132704 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152705 handle2.Init("a", params_, DEFAULT_PRIORITY,
2706 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202707 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262708 // No idle sockets, and one connecting job.
2709 EXPECT_EQ(0, pool_->IdleSocketCount());
2710 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2711
2712 // Return the first handle to the pool. This will initiate the delayed
2713 // binding.
2714 handle1.Reset();
2715
fdoray5eeb7642016-06-22 16:11:282716 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262717
2718 // Still no idle sockets, still one pending connect job.
2719 EXPECT_EQ(0, pool_->IdleSocketCount());
2720 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2721
2722 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012723 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262724
2725 // And we can see there is still one job waiting.
2726 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2727
2728 // Finally, signal the waiting Connect.
2729 client_socket_factory_.SignalJobs();
2730 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2731
fdoray5eeb7642016-06-22 16:11:282732 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262733}
2734
2735// Test out the case where we have one socket connected, one
2736// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512737// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262738// should complete, by taking the first socket's idle socket.
2739TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2740 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2741 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2742
2743 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522744 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132745 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152746 handle1.Init("a", params_, DEFAULT_PRIORITY,
2747 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202748 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012749 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262750
2751 // No idle sockets, no pending jobs.
2752 EXPECT_EQ(0, pool_->IdleSocketCount());
2753 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2754
2755 // Create a second socket to the same host, but this one will wait.
2756 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2757 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132758 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152759 handle2.Init("a", params_, DEFAULT_PRIORITY,
2760 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202761 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262762 // No idle sockets, and one connecting job.
2763 EXPECT_EQ(0, pool_->IdleSocketCount());
2764 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2765
2766 // Return the first handle to the pool. This will initiate the delayed
2767 // binding.
2768 handle1.Reset();
2769
fdoray5eeb7642016-06-22 16:11:282770 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262771
2772 // Still no idle sockets, still one pending connect job.
2773 EXPECT_EQ(0, pool_->IdleSocketCount());
2774 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2775
2776 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012777 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262778
2779 // And we can see there is still one job waiting.
2780 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2781
2782 // Finally, signal the waiting Connect.
2783 client_socket_factory_.SignalJobs();
2784 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2785
fdoray5eeb7642016-06-22 16:11:282786 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262787}
2788
[email protected]2abfe90a2010-08-25 17:49:512789// Cover the case where on an available socket slot, we have one pending
2790// request that completes synchronously, thereby making the Group empty.
2791TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
2792 const int kUnlimitedSockets = 100;
2793 const int kOneSocketPerGroup = 1;
2794 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
2795
2796 // Make the first request asynchronous fail.
2797 // This will free up a socket slot later.
2798 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2799
2800 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522801 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:202802 EXPECT_EQ(
2803 ERR_IO_PENDING,
2804 handle1.Init("a", params_, DEFAULT_PRIORITY,
2805 ClientSocketPool::RespectLimits::ENABLED,
2806 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:512807 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2808
2809 // Make the second request synchronously fail. This should make the Group
2810 // empty.
2811 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
2812 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522813 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:512814 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
2815 // when created.
tfarina428341112016-09-22 13:38:202816 EXPECT_EQ(
2817 ERR_IO_PENDING,
2818 handle2.Init("a", params_, DEFAULT_PRIORITY,
2819 ClientSocketPool::RespectLimits::ENABLED,
2820 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:512821
2822 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2823
robpercival214763f2016-07-01 23:27:012824 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2825 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:512826 EXPECT_FALSE(pool_->HasGroup("a"));
2827}
2828
[email protected]e1b54dc2010-10-06 21:27:222829TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
2830 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2831
2832 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2833
2834 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522835 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:202836 EXPECT_EQ(
2837 ERR_IO_PENDING,
2838 handle1.Init("a", params_, DEFAULT_PRIORITY,
2839 ClientSocketPool::RespectLimits::ENABLED,
2840 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:222841
2842 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522843 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202844 EXPECT_EQ(
2845 ERR_IO_PENDING,
2846 handle2.Init("a", params_, DEFAULT_PRIORITY,
2847 ClientSocketPool::RespectLimits::ENABLED,
2848 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:222849 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522850 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:202851 EXPECT_EQ(
2852 ERR_IO_PENDING,
2853 handle3.Init("a", params_, DEFAULT_PRIORITY,
2854 ClientSocketPool::RespectLimits::ENABLED,
2855 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:222856
robpercival214763f2016-07-01 23:27:012857 EXPECT_THAT(callback1.WaitForResult(), IsOk());
2858 EXPECT_THAT(callback2.WaitForResult(), IsOk());
2859 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:222860
2861 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552862 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback()));
2863 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]e1b54dc2010-10-06 21:27:222864
2865 handle1.Reset();
2866 handle2.Reset();
2867 handle3.Reset();
2868
tfarina428341112016-09-22 13:38:202869 EXPECT_EQ(
2870 OK, handle1.Init("a", params_, DEFAULT_PRIORITY,
2871 ClientSocketPool::RespectLimits::ENABLED,
2872 callback1.callback(), pool_.get(), NetLogWithSource()));
2873 EXPECT_EQ(
2874 OK, handle2.Init("a", params_, DEFAULT_PRIORITY,
2875 ClientSocketPool::RespectLimits::ENABLED,
2876 callback2.callback(), pool_.get(), NetLogWithSource()));
2877 EXPECT_EQ(
2878 OK, handle3.Init("a", params_, DEFAULT_PRIORITY,
2879 ClientSocketPool::RespectLimits::ENABLED,
2880 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:222881
2882 EXPECT_TRUE(handle1.socket()->WasEverUsed());
2883 EXPECT_TRUE(handle2.socket()->WasEverUsed());
2884 EXPECT_FALSE(handle3.socket()->WasEverUsed());
2885}
2886
[email protected]2c2bef152010-10-13 00:55:032887TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
2888 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2889 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2890
tfarina428341112016-09-22 13:38:202891 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:032892
2893 ASSERT_TRUE(pool_->HasGroup("a"));
2894 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102895 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032896 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2897
2898 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522899 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:202900 EXPECT_EQ(
2901 ERR_IO_PENDING,
2902 handle1.Init("a", params_, DEFAULT_PRIORITY,
2903 ClientSocketPool::RespectLimits::ENABLED,
2904 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:032905
2906 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522907 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202908 EXPECT_EQ(
2909 ERR_IO_PENDING,
2910 handle2.Init("a", params_, DEFAULT_PRIORITY,
2911 ClientSocketPool::RespectLimits::ENABLED,
2912 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:032913
2914 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102915 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032916 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2917
robpercival214763f2016-07-01 23:27:012918 EXPECT_THAT(callback1.WaitForResult(), IsOk());
2919 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:032920 handle1.Reset();
2921 handle2.Reset();
2922
2923 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102924 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032925 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
2926}
2927
2928TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
2929 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2930 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2931
2932 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522933 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:202934 EXPECT_EQ(
2935 ERR_IO_PENDING,
2936 handle1.Init("a", params_, DEFAULT_PRIORITY,
2937 ClientSocketPool::RespectLimits::ENABLED,
2938 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:032939
2940 ASSERT_TRUE(pool_->HasGroup("a"));
2941 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102942 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032943 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2944
tfarina428341112016-09-22 13:38:202945 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:032946
2947 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102948 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032949 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2950
2951 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522952 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202953 EXPECT_EQ(
2954 ERR_IO_PENDING,
2955 handle2.Init("a", params_, DEFAULT_PRIORITY,
2956 ClientSocketPool::RespectLimits::ENABLED,
2957 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:032958
2959 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102960 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032961 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2962
robpercival214763f2016-07-01 23:27:012963 EXPECT_THAT(callback1.WaitForResult(), IsOk());
2964 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:032965 handle1.Reset();
2966 handle2.Reset();
2967
2968 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102969 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032970 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
2971}
2972
2973TEST_F(ClientSocketPoolBaseTest,
2974 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
2975 CreatePool(4, 4);
2976 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2977
2978 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522979 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:202980 EXPECT_EQ(
2981 ERR_IO_PENDING,
2982 handle1.Init("a", params_, DEFAULT_PRIORITY,
2983 ClientSocketPool::RespectLimits::ENABLED,
2984 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:032985
2986 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522987 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202988 EXPECT_EQ(
2989 ERR_IO_PENDING,
2990 handle2.Init("a", params_, DEFAULT_PRIORITY,
2991 ClientSocketPool::RespectLimits::ENABLED,
2992 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:032993
2994 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522995 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:202996 EXPECT_EQ(
2997 ERR_IO_PENDING,
2998 handle3.Init("a", params_, DEFAULT_PRIORITY,
2999 ClientSocketPool::RespectLimits::ENABLED,
3000 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033001
3002 ASSERT_TRUE(pool_->HasGroup("a"));
3003 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103004 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033005 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3006
tfarina428341112016-09-22 13:38:203007 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033008
3009 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103010 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033011 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3012
robpercival214763f2016-07-01 23:27:013013 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3014 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3015 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033016 handle1.Reset();
3017 handle2.Reset();
3018 handle3.Reset();
3019
3020 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103021 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033022 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3023}
3024
3025TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3026 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3027 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3028
3029 ASSERT_FALSE(pool_->HasGroup("a"));
3030
tfarina428341112016-09-22 13:38:203031 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033032
3033 ASSERT_TRUE(pool_->HasGroup("a"));
3034 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103035 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033036
3037 ASSERT_FALSE(pool_->HasGroup("b"));
3038
tfarina428341112016-09-22 13:38:203039 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033040
3041 ASSERT_FALSE(pool_->HasGroup("b"));
3042}
3043
3044TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3045 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3046 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3047
3048 ASSERT_FALSE(pool_->HasGroup("a"));
3049
3050 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
tfarina428341112016-09-22 13:38:203051 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033052
3053 ASSERT_TRUE(pool_->HasGroup("a"));
3054 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103055 EXPECT_EQ(kDefaultMaxSockets - 1,
3056 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483057 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033058
3059 ASSERT_FALSE(pool_->HasGroup("b"));
3060
tfarina428341112016-09-22 13:38:203061 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033062
3063 ASSERT_TRUE(pool_->HasGroup("b"));
3064 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483065 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033066}
3067
3068TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3069 CreatePool(4, 4);
3070 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3071
3072 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523073 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203074 EXPECT_EQ(
3075 ERR_IO_PENDING,
3076 handle1.Init("a", params_, DEFAULT_PRIORITY,
3077 ClientSocketPool::RespectLimits::ENABLED,
3078 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013079 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033080 handle1.Reset();
3081
3082 ASSERT_TRUE(pool_->HasGroup("a"));
3083 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103084 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033085 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3086
tfarina428341112016-09-22 13:38:203087 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033088
3089 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103090 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033091 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3092}
3093
3094TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3095 CreatePool(4, 4);
3096 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3097
3098 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523099 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203100 EXPECT_EQ(
3101 ERR_IO_PENDING,
3102 handle1.Init("a", params_, DEFAULT_PRIORITY,
3103 ClientSocketPool::RespectLimits::ENABLED,
3104 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013105 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033106
3107 ASSERT_TRUE(pool_->HasGroup("a"));
3108 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103109 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033110 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3111 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3112
tfarina428341112016-09-22 13:38:203113 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033114
3115 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103116 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033117 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3118 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3119}
3120
3121TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3122 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3123 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3124
3125 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203126 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033127
3128 ASSERT_TRUE(pool_->HasGroup("a"));
3129 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103130 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033131 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3132
3133 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203134 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033135
3136 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103137 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033138 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3139}
3140
[email protected]3c819f522010-12-02 02:03:123141TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3142 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3143 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3144
3145 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203146 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123147
3148 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523149
3150 connect_job_factory_->set_job_type(
3151 TestConnectJob::kMockAdditionalErrorStateJob);
3152 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
tfarina428341112016-09-22 13:38:203153 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523154
3155 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123156}
3157
[email protected]8159a1c2012-06-07 00:00:103158TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033159 CreatePool(4, 4);
3160 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3161
tfarina428341112016-09-22 13:38:203162 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033163
3164 ASSERT_TRUE(pool_->HasGroup("a"));
3165 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103166 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033167 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3168
tfarina428341112016-09-22 13:38:203169 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033170 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103171 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033172 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3173
3174 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523175 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203176 EXPECT_EQ(
3177 ERR_IO_PENDING,
3178 handle1.Init("a", params_, DEFAULT_PRIORITY,
3179 ClientSocketPool::RespectLimits::ENABLED,
3180 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013181 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033182
3183 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523184 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153185 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
3186 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203187 callback2.callback(), pool_.get(), NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033188 if (rv != OK) {
robpercival214763f2016-07-01 23:27:013189 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3190 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033191 }
3192
[email protected]8159a1c2012-06-07 00:00:103193 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3194 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3195 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3196 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3197
[email protected]2c2bef152010-10-13 00:55:033198 handle1.Reset();
3199 handle2.Reset();
3200
[email protected]8159a1c2012-06-07 00:00:103201 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3202 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033203 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3204
tfarina428341112016-09-22 13:38:203205 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033206 EXPECT_EQ(0, 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(2, pool_->IdleSocketCountInGroup("a"));
3209}
3210
3211TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3212 CreatePool(4, 4);
3213 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3214
tfarina428341112016-09-22 13:38:203215 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033216
3217 ASSERT_TRUE(pool_->HasGroup("a"));
3218 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103219 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033220 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3221
tfarina428341112016-09-22 13:38:203222 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033223 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103224 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033225 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3226
tfarina428341112016-09-22 13:38:203227 pool_->RequestSockets("a", &params_, 3, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033228 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103229 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033230 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3231
tfarina428341112016-09-22 13:38:203232 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033233 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103234 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033235 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3236}
3237
3238TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3239 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3240 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3241
tfarina428341112016-09-22 13:38:203242 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033243
3244 ASSERT_TRUE(pool_->HasGroup("a"));
3245 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103246 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033247 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3248
3249 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523250 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203251 EXPECT_EQ(
3252 ERR_IO_PENDING,
3253 handle1.Init("a", params_, DEFAULT_PRIORITY,
3254 ClientSocketPool::RespectLimits::ENABLED,
3255 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033256
3257 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103258 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033259 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3260
robpercival214763f2016-07-01 23:27:013261 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033262
[email protected]0dc88b32014-03-26 20:12:283263 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483264 // starts, it has a connect start time.
3265 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033266 handle1.Reset();
3267
3268 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3269}
3270
[email protected]034df0f32013-01-07 23:17:483271// Checks that fully connected preconnect jobs have no connect times, and are
3272// marked as reused.
3273TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3274 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3275 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
tfarina428341112016-09-22 13:38:203276 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483277
3278 ASSERT_TRUE(pool_->HasGroup("a"));
3279 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3280 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3281 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3282
3283 ClientSocketHandle handle;
3284 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203285 EXPECT_EQ(OK,
3286 handle.Init("a", params_, DEFAULT_PRIORITY,
3287 ClientSocketPool::RespectLimits::ENABLED,
3288 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483289
3290 // Make sure the idle socket was used.
3291 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3292
3293 TestLoadTimingInfoConnectedReused(handle);
3294 handle.Reset();
3295 TestLoadTimingInfoNotConnected(handle);
3296}
3297
[email protected]dcbe168a2010-12-02 03:14:463298// http://crbug.com/64940 regression test.
3299TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3300 const int kMaxTotalSockets = 3;
3301 const int kMaxSocketsPerGroup = 2;
3302 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3303 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3304
3305 // Note that group name ordering matters here. "a" comes before "b", so
3306 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3307
3308 // Set up one idle socket in "a".
3309 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523310 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203311 EXPECT_EQ(
3312 ERR_IO_PENDING,
3313 handle1.Init("a", params_, DEFAULT_PRIORITY,
3314 ClientSocketPool::RespectLimits::ENABLED,
3315 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463316
robpercival214763f2016-07-01 23:27:013317 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463318 handle1.Reset();
3319 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3320
3321 // Set up two active sockets in "b".
3322 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523323 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203324 EXPECT_EQ(
3325 ERR_IO_PENDING,
3326 handle1.Init("b", params_, DEFAULT_PRIORITY,
3327 ClientSocketPool::RespectLimits::ENABLED,
3328 callback1.callback(), pool_.get(), NetLogWithSource()));
3329 EXPECT_EQ(
3330 ERR_IO_PENDING,
3331 handle2.Init("b", params_, DEFAULT_PRIORITY,
3332 ClientSocketPool::RespectLimits::ENABLED,
3333 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463334
robpercival214763f2016-07-01 23:27:013335 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3336 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463337 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103338 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463339 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3340
3341 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3342 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3343 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3344 // sockets for "a", and "b" should still have 2 active sockets.
3345
tfarina428341112016-09-22 13:38:203346 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463347 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103348 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463349 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3350 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3351 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103352 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463353 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3354 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3355
3356 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3357 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3358 // "a" should result in closing 1 for "b".
3359 handle1.Reset();
3360 handle2.Reset();
3361 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3362 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3363
tfarina428341112016-09-22 13:38:203364 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463365 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103366 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463367 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3368 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3369 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103370 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463371 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3372 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3373}
3374
[email protected]b7b8be42011-07-12 12:46:413375TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073376 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3377 pool_->EnableConnectBackupJobs();
3378
3379 // Make the ConnectJob hang until it times out, shorten the timeout.
3380 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3381 connect_job_factory_->set_timeout_duration(
3382 base::TimeDelta::FromMilliseconds(500));
tfarina428341112016-09-22 13:38:203383 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073384 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103385 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073386 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073387
[email protected]b7b8be42011-07-12 12:46:413388 // Verify the backup timer doesn't create a backup job, by making
3389 // the backup job a pending job instead of a waiting job, so it
3390 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073391 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453392 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
ki.stfu375812e2015-10-09 20:23:173393 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
[email protected]2da659e2013-05-23 20:51:343394 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283395 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073396 EXPECT_FALSE(pool_->HasGroup("a"));
3397}
3398
[email protected]b7b8be42011-07-12 12:46:413399TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073400 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3401 pool_->EnableConnectBackupJobs();
3402
3403 // Make the ConnectJob hang forever.
3404 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
tfarina428341112016-09-22 13:38:203405 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073406 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103407 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073408 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283409 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073410
3411 // Make the backup job be a pending job, so it completes normally.
3412 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3413 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523414 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153415 EXPECT_EQ(ERR_IO_PENDING,
3416 handle.Init("a", params_, DEFAULT_PRIORITY,
3417 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203418 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413419 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073420 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103421 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073422 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3423 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013424 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073425
3426 // The hung connect job should still be there, but everything else should be
3427 // complete.
3428 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103429 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073430 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3431 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3432}
3433
[email protected]0dc88b32014-03-26 20:12:283434// Tests that a preconnect that starts out with unread data can still be used.
3435// http://crbug.com/334467
3436TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3437 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3438 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3439
tfarina428341112016-09-22 13:38:203440 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283441
3442 ASSERT_TRUE(pool_->HasGroup("a"));
3443 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3444 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3445 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3446
3447 // Fail future jobs to be sure that handle receives the preconnected socket
3448 // rather than closing it and making a new one.
3449 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3450 ClientSocketHandle handle;
3451 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203452 EXPECT_EQ(OK,
3453 handle.Init("a", params_, DEFAULT_PRIORITY,
3454 ClientSocketPool::RespectLimits::ENABLED,
3455 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283456
3457 ASSERT_TRUE(pool_->HasGroup("a"));
3458 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3459 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3460 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3461
3462 // Drain the pending read.
3463 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
3464
3465 TestLoadTimingInfoConnectedReused(handle);
3466 handle.Reset();
3467
3468 // The socket should be usable now that it's idle again.
3469 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3470}
3471
[email protected]043b68c82013-08-22 23:41:523472class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203473 public:
3474 MockLayeredPool(TestClientSocketPool* pool,
3475 const std::string& group_name)
3476 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203477 group_name_(group_name),
3478 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523479 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203480 }
3481
3482 ~MockLayeredPool() {
[email protected]043b68c82013-08-22 23:41:523483 pool_->RemoveHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203484 }
3485
3486 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153487 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073488 return handle_.Init(group_name_, params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:153489 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203490 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203491 }
3492
3493 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153494 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073495 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:153496 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:203497 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203498 }
3499
3500 bool ReleaseOneConnection() {
3501 if (!handle_.is_initialized() || !can_release_connection_) {
3502 return false;
3503 }
3504 handle_.socket()->Disconnect();
3505 handle_.Reset();
3506 return true;
3507 }
3508
3509 void set_can_release_connection(bool can_release_connection) {
3510 can_release_connection_ = can_release_connection;
3511 }
3512
3513 MOCK_METHOD0(CloseOneIdleConnection, bool());
3514
3515 private:
3516 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203517 ClientSocketHandle handle_;
3518 TestCompletionCallback callback_;
3519 const std::string group_name_;
3520 bool can_release_connection_;
3521};
3522
3523TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3524 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3525 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3526
3527 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013528 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203529 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3530 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523531 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203532}
3533
3534TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
3535 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3536 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3537
3538 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013539 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203540 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3541 .WillOnce(Invoke(&mock_layered_pool,
3542 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523543 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203544}
3545
3546// Tests the basic case of closing an idle socket in a higher layered pool when
3547// a new request is issued and the lower layer pool is stalled.
3548TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3549 CreatePool(1, 1);
3550 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3551
3552 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013553 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203554 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3555 .WillOnce(Invoke(&mock_layered_pool,
3556 &MockLayeredPool::ReleaseOneConnection));
3557 ClientSocketHandle handle;
3558 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153559 EXPECT_EQ(ERR_IO_PENDING,
3560 handle.Init("a", params_, DEFAULT_PRIORITY,
3561 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203562 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013563 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203564}
3565
3566// Same as above, but the idle socket is in the same group as the stalled
3567// socket, and closes the only other request in its group when closing requests
3568// in higher layered pools. This generally shouldn't happen, but it may be
3569// possible if a higher level pool issues a request and the request is
3570// subsequently cancelled. Even if it's not possible, best not to crash.
3571TEST_F(ClientSocketPoolBaseTest,
3572 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3573 CreatePool(2, 2);
3574 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3575
3576 // Need a socket in another group for the pool to be stalled (If a group
3577 // has the maximum number of connections already, it's not stalled).
3578 ClientSocketHandle handle1;
3579 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203580 EXPECT_EQ(
3581 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3582 ClientSocketPool::RespectLimits::ENABLED,
3583 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203584
3585 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013586 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203587 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3588 .WillOnce(Invoke(&mock_layered_pool,
3589 &MockLayeredPool::ReleaseOneConnection));
3590 ClientSocketHandle handle;
3591 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153592 EXPECT_EQ(ERR_IO_PENDING,
3593 handle.Init("group2", params_, DEFAULT_PRIORITY,
3594 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203595 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013596 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203597}
3598
3599// Tests the case when an idle socket can be closed when a new request is
3600// issued, and the new request belongs to a group that was previously stalled.
3601TEST_F(ClientSocketPoolBaseTest,
3602 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3603 CreatePool(2, 2);
3604 std::list<TestConnectJob::JobType> job_types;
3605 job_types.push_back(TestConnectJob::kMockJob);
3606 job_types.push_back(TestConnectJob::kMockJob);
3607 job_types.push_back(TestConnectJob::kMockJob);
3608 job_types.push_back(TestConnectJob::kMockJob);
3609 connect_job_factory_->set_job_types(&job_types);
3610
3611 ClientSocketHandle handle1;
3612 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203613 EXPECT_EQ(
3614 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3615 ClientSocketPool::RespectLimits::ENABLED,
3616 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203617
3618 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013619 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203620 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3621 .WillRepeatedly(Invoke(&mock_layered_pool,
3622 &MockLayeredPool::ReleaseOneConnection));
3623 mock_layered_pool.set_can_release_connection(false);
3624
3625 // The third request is made when the socket pool is in a stalled state.
3626 ClientSocketHandle handle3;
3627 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203628 EXPECT_EQ(
3629 ERR_IO_PENDING,
3630 handle3.Init("group3", params_, DEFAULT_PRIORITY,
3631 ClientSocketPool::RespectLimits::ENABLED,
3632 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203633
3634 base::RunLoop().RunUntilIdle();
3635 EXPECT_FALSE(callback3.have_result());
3636
3637 // The fourth request is made when the pool is no longer stalled. The third
3638 // request should be serviced first, since it was issued first and has the
3639 // same priority.
3640 mock_layered_pool.set_can_release_connection(true);
3641 ClientSocketHandle handle4;
3642 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203643 EXPECT_EQ(
3644 ERR_IO_PENDING,
3645 handle4.Init("group3", params_, DEFAULT_PRIORITY,
3646 ClientSocketPool::RespectLimits::ENABLED,
3647 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013648 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203649 EXPECT_FALSE(callback4.have_result());
3650
3651 // Closing a handle should free up another socket slot.
3652 handle1.Reset();
robpercival214763f2016-07-01 23:27:013653 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203654}
3655
3656// Tests the case when an idle socket can be closed when a new request is
3657// issued, and the new request belongs to a group that was previously stalled.
3658//
3659// The two differences from the above test are that the stalled requests are not
3660// in the same group as the layered pool's request, and the the fourth request
3661// has a higher priority than the third one, so gets a socket first.
3662TEST_F(ClientSocketPoolBaseTest,
3663 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3664 CreatePool(2, 2);
3665 std::list<TestConnectJob::JobType> job_types;
3666 job_types.push_back(TestConnectJob::kMockJob);
3667 job_types.push_back(TestConnectJob::kMockJob);
3668 job_types.push_back(TestConnectJob::kMockJob);
3669 job_types.push_back(TestConnectJob::kMockJob);
3670 connect_job_factory_->set_job_types(&job_types);
3671
3672 ClientSocketHandle handle1;
3673 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203674 EXPECT_EQ(
3675 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3676 ClientSocketPool::RespectLimits::ENABLED,
3677 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203678
3679 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013680 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203681 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3682 .WillRepeatedly(Invoke(&mock_layered_pool,
3683 &MockLayeredPool::ReleaseOneConnection));
3684 mock_layered_pool.set_can_release_connection(false);
3685
3686 // The third request is made when the socket pool is in a stalled state.
3687 ClientSocketHandle handle3;
3688 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203689 EXPECT_EQ(
3690 ERR_IO_PENDING,
3691 handle3.Init("group3", params_, MEDIUM,
3692 ClientSocketPool::RespectLimits::ENABLED,
3693 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203694
3695 base::RunLoop().RunUntilIdle();
3696 EXPECT_FALSE(callback3.have_result());
3697
3698 // The fourth request is made when the pool is no longer stalled. This
3699 // request has a higher priority than the third request, so is serviced first.
3700 mock_layered_pool.set_can_release_connection(true);
3701 ClientSocketHandle handle4;
3702 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203703 EXPECT_EQ(
3704 ERR_IO_PENDING,
3705 handle4.Init("group3", params_, HIGHEST,
3706 ClientSocketPool::RespectLimits::ENABLED,
3707 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013708 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203709 EXPECT_FALSE(callback3.have_result());
3710
3711 // Closing a handle should free up another socket slot.
3712 handle1.Reset();
robpercival214763f2016-07-01 23:27:013713 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203714}
3715
3716TEST_F(ClientSocketPoolBaseTest,
3717 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
3718 CreatePool(1, 1);
3719 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3720
3721 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013722 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203723 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
3724 .WillRepeatedly(Invoke(&mock_layered_pool1,
3725 &MockLayeredPool::ReleaseOneConnection));
3726 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:013727 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
3728 IsOk());
[email protected]58e562f2013-04-22 17:32:203729 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
3730 .WillRepeatedly(Invoke(&mock_layered_pool2,
3731 &MockLayeredPool::ReleaseOneConnection));
3732 ClientSocketHandle handle;
3733 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153734 EXPECT_EQ(ERR_IO_PENDING,
3735 handle.Init("a", params_, DEFAULT_PRIORITY,
3736 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203737 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013738 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203739}
3740
[email protected]b021ece62013-06-11 11:06:333741// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:153742// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
3743// socket instead of a request with the same priority that was issued earlier,
3744// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:333745TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:333746 CreatePool(1, 1);
3747
3748 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153749 EXPECT_EQ(
3750 OK, StartRequestWithIgnoreLimits(
3751 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333752 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3753
3754 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3755
mmenked3641e12016-01-28 16:06:153756 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3757 "a", MAXIMUM_PRIORITY,
3758 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333759 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3760
mmenked3641e12016-01-28 16:06:153761 // Issue a request that ignores the limits, so a new ConnectJob is
3762 // created.
3763 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3764 "a", MAXIMUM_PRIORITY,
3765 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:333766 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3767
robpercival214763f2016-07-01 23:27:013768 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:333769 EXPECT_FALSE(request(1)->have_result());
3770}
3771
[email protected]c55fabd2013-11-04 23:26:563772// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:153773// issued for a request with RespectLimits::DISABLED is not cancelled when a
3774// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:563775TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:563776 CreatePool(1, 1);
3777
3778 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153779 EXPECT_EQ(
3780 OK, StartRequestWithIgnoreLimits(
3781 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563782 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3783
3784 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3785
mmenked3641e12016-01-28 16:06:153786 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3787 "a", MAXIMUM_PRIORITY,
3788 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563789 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3790
mmenked3641e12016-01-28 16:06:153791 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
3792 // created.
3793 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3794 "a", MAXIMUM_PRIORITY,
3795 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:333796 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3797
mmenked3641e12016-01-28 16:06:153798 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:333799 // should not be cancelled.
3800 request(1)->handle()->Reset();
3801 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3802
robpercival214763f2016-07-01 23:27:013803 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:333804 EXPECT_FALSE(request(1)->have_result());
3805}
3806
[email protected]f6d1d6eb2009-06-24 20:16:093807} // namespace
3808
3809} // namespace net