blob: 6eea7e1dc8fba0d6392a89fa002132bfa2f775dd [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"
mmenke16a7cbdd2015-04-24 23:00:5635#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4636#include "net/log/test_net_log_entry.h"
37#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0938#include "net/socket/client_socket_factory.h"
39#include "net/socket/client_socket_handle.h"
tbansalca83c002016-04-28 20:56:2840#include "net/socket/socket_performance_watcher.h"
[email protected]75439d3b2009-07-23 22:11:1741#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4442#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1043#include "net/socket/stream_socket.h"
robpercival214763f2016-07-01 23:27:0144#include "net/test/gtest_util.h"
[email protected]18ccfdb2013-08-15 00:13:4445#include "net/udp/datagram_client_socket.h"
[email protected]51fdc7c2012-04-10 19:19:4846#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0947#include "testing/gtest/include/gtest/gtest.h"
48
robpercival214763f2016-07-01 23:27:0149using net::test::IsError;
50using net::test::IsOk;
51
[email protected]51fdc7c2012-04-10 19:19:4852using ::testing::Invoke;
53using ::testing::Return;
54
[email protected]f6d1d6eb2009-06-24 20:16:0955namespace net {
56
57namespace {
58
[email protected]211d21722009-07-22 15:48:5359const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2060const int kDefaultMaxSocketsPerGroup = 2;
[email protected]0b7648c2009-07-06 20:14:0161
[email protected]034df0f32013-01-07 23:17:4862// Make sure |handle| sets load times correctly when it has been assigned a
63// reused socket.
64void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
65 LoadTimingInfo load_timing_info;
66 // Only pass true in as |is_reused|, as in general, HttpStream types should
67 // have stricter concepts of reuse than socket pools.
68 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
69
70 EXPECT_EQ(true, load_timing_info.socket_reused);
71 EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
72
[email protected]b258e0792013-01-12 07:11:5973 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
74 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4875}
76
77// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3378// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4879// of a connection where |is_reused| is false may consider the connection
80// reused.
81void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
82 EXPECT_FALSE(handle.is_reused());
83
84 LoadTimingInfo load_timing_info;
85 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
86
87 EXPECT_FALSE(load_timing_info.socket_reused);
88 EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
89
[email protected]b258e0792013-01-12 07:11:5990 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
91 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
92 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4893
94 TestLoadTimingInfoConnectedReused(handle);
95}
96
97// Make sure |handle| sets load times correctly, in the case that it does not
98// currently have a socket.
99void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
100 // Should only be set to true once a socket is assigned, if at all.
101 EXPECT_FALSE(handle.is_reused());
102
103 LoadTimingInfo load_timing_info;
104 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
105
106 EXPECT_FALSE(load_timing_info.socket_reused);
107 EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
108
[email protected]b258e0792013-01-12 07:11:59109 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
110 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48111}
112
[email protected]df4b4ef2010-07-12 18:25:21113class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20114 public:
mmenked3641e12016-01-28 16:06:15115 explicit TestSocketParams() {}
[email protected]51fdc7c2012-04-10 19:19:48116
[email protected]df4b4ef2010-07-12 18:25:21117 private:
118 friend class base::RefCounted<TestSocketParams>;
119 ~TestSocketParams() {}
120};
[email protected]7fc5b09a2010-02-27 00:07:38121typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49122
[email protected]3268023f2011-05-05 00:08:10123class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09124 public:
[email protected]034df0f32013-01-07 23:17:48125 explicit MockClientSocket(net::NetLog* net_log)
126 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28127 has_unread_data_(false),
ttuttle859dc7a2015-04-23 19:42:29128 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)),
129 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09130
[email protected]0dc88b32014-03-26 20:12:28131 // Sets whether the socket has unread data. If true, the next call to Read()
132 // will return 1 byte and IsConnectedAndIdle() will return false.
133 void set_has_unread_data(bool has_unread_data) {
134 has_unread_data_ = has_unread_data;
135 }
136
[email protected]3f55aa12011-12-07 02:03:33137 // Socket implementation.
dchengb03027d2014-10-21 12:00:20138 int Read(IOBuffer* /* buf */,
139 int len,
140 const CompletionCallback& /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28141 if (has_unread_data_ && len > 0) {
142 has_unread_data_ = false;
143 was_used_to_convey_data_ = true;
144 return 1;
145 }
[email protected]e86df8dc2013-03-30 13:18:28146 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33147 }
[email protected]ab838892009-06-30 18:49:05148
dchengb03027d2014-10-21 12:00:20149 int Write(IOBuffer* /* buf */,
150 int len,
151 const CompletionCallback& /* callback */) override {
[email protected]0f873e82010-09-02 16:09:01152 was_used_to_convey_data_ = true;
153 return len;
[email protected]ab838892009-06-30 18:49:05154 }
Avi Drissman13fc8932015-12-20 04:40:46155 int SetReceiveBufferSize(int32_t size) override { return OK; }
156 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05157
[email protected]dbf036f2011-12-06 23:33:24158 // StreamSocket implementation.
dchengb03027d2014-10-21 12:00:20159 int Connect(const CompletionCallback& callback) override {
[email protected]dbf036f2011-12-06 23:33:24160 connected_ = true;
161 return OK;
162 }
[email protected]f6d1d6eb2009-06-24 20:16:09163
dchengb03027d2014-10-21 12:00:20164 void Disconnect() override { connected_ = false; }
165 bool IsConnected() const override { return connected_; }
166 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28167 return connected_ && !has_unread_data_;
168 }
[email protected]0b7648c2009-07-06 20:14:01169
dchengb03027d2014-10-21 12:00:20170 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16171 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09172 }
[email protected]f6d1d6eb2009-06-24 20:16:09173
dchengb03027d2014-10-21 12:00:20174 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35175 return ERR_UNEXPECTED;
176 }
177
dchengb03027d2014-10-21 12:00:20178 const BoundNetLog& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02179
dchengb03027d2014-10-21 12:00:20180 void SetSubresourceSpeculation() override {}
181 void SetOmniboxSpeculation() override {}
182 bool WasEverUsed() const override { return was_used_to_convey_data_; }
dchengb03027d2014-10-21 12:00:20183 bool WasNpnNegotiated() const override { return false; }
184 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
185 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03186 void GetConnectionAttempts(ConnectionAttempts* out) const override {
187 out->clear();
188 }
189 void ClearConnectionAttempts() override {}
190 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49191 int64_t GetTotalReceivedBytes() const override {
192 NOTIMPLEMENTED();
193 return 0;
194 }
[email protected]9b5614a2010-08-25 20:29:45195
[email protected]f6d1d6eb2009-06-24 20:16:09196 private:
197 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28198 bool has_unread_data_;
[email protected]a2006ece2010-04-23 16:44:02199 BoundNetLog net_log_;
[email protected]0f873e82010-09-02 16:09:01200 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09201
[email protected]ab838892009-06-30 18:49:05202 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09203};
204
[email protected]5fc08e32009-07-15 17:09:57205class TestConnectJob;
206
[email protected]f6d1d6eb2009-06-24 20:16:09207class MockClientSocketFactory : public ClientSocketFactory {
208 public:
[email protected]ab838892009-06-30 18:49:05209 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09210
danakj655b66c2016-04-16 00:51:38211 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04212 DatagramSocket::BindType bind_type,
213 const RandIntCallback& rand_int_cb,
[email protected]98b0e582011-06-22 14:31:41214 NetLog* net_log,
mostynbba063d6032014-10-09 11:01:13215 const NetLog::Source& source) override {
[email protected]98b0e582011-06-22 14:31:41216 NOTREACHED();
danakj655b66c2016-04-16 00:51:38217 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41218 }
219
danakj655b66c2016-04-16 00:51:38220 std::unique_ptr<StreamSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07221 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38222 std::unique_ptr<
223 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07224 NetLog* /* net_log */,
mostynbba063d6032014-10-09 11:01:13225 const NetLog::Source& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09226 allocation_count_++;
danakj655b66c2016-04-16 00:51:38227 return std::unique_ptr<StreamSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09228 }
229
danakj655b66c2016-04-16 00:51:38230 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
231 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27232 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21233 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13234 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09235 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38236 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09237 }
238
dchengb03027d2014-10-21 12:00:20239 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59240
[email protected]5fc08e32009-07-15 17:09:57241 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55242
[email protected]5fc08e32009-07-15 17:09:57243 void SignalJobs();
244
[email protected]03b7c8c2013-07-20 04:38:55245 void SignalJob(size_t job);
246
247 void SetJobLoadState(size_t job, LoadState load_state);
248
[email protected]f6d1d6eb2009-06-24 20:16:09249 int allocation_count() const { return allocation_count_; }
250
[email protected]f6d1d6eb2009-06-24 20:16:09251 private:
252 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57253 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09254};
255
[email protected]ab838892009-06-30 18:49:05256class TestConnectJob : public ConnectJob {
257 public:
258 enum JobType {
259 kMockJob,
260 kMockFailingJob,
261 kMockPendingJob,
262 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57263 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13264 kMockRecoverableJob,
265 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18266 kMockAdditionalErrorStateJob,
267 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28268 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05269 };
270
[email protected]994d4932010-07-12 17:55:13271 // The kMockPendingJob uses a slight delay before allowing the connect
272 // to complete.
273 static const int kPendingConnectDelay = 2;
274
[email protected]ab838892009-06-30 18:49:05275 TestConnectJob(JobType job_type,
276 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49277 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34278 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05279 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30280 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17281 NetLog* net_log)
mmenked3641e12016-01-28 16:06:15282 : ConnectJob(group_name,
283 timeout_duration,
284 request.priority(),
285 request.respect_limits(),
286 delegate,
[email protected]06650c52010-06-03 00:49:17287 BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58288 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05289 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18290 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39291 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15292 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05293
[email protected]974ebd62009-08-03 23:14:34294 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13295 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34296 }
297
[email protected]03b7c8c2013-07-20 04:38:55298 void set_load_state(LoadState load_state) { load_state_ = load_state; }
299
300 // From ConnectJob:
301
dchengb03027d2014-10-21 12:00:20302 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21303
dchengb03027d2014-10-21 12:00:20304 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18305 if (store_additional_error_state_) {
306 // Set all of the additional error state fields in some way.
307 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43308 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45309 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43310 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18311 }
312 }
313
[email protected]974ebd62009-08-03 23:14:34314 private:
[email protected]03b7c8c2013-07-20 04:38:55315 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05316
dchengb03027d2014-10-21 12:00:20317 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05318 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21319 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
ttuttle859dc7a2015-04-23 19:42:29320 NetLog::Source());
danakj655b66c2016-04-16 00:51:38321 SetSocket(std::unique_ptr<StreamSocket>(
322 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05323 switch (job_type_) {
324 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13325 return DoConnect(true /* successful */, false /* sync */,
326 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05327 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13328 return DoConnect(false /* error */, false /* sync */,
329 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05330 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57331 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47332
333 // Depending on execution timings, posting a delayed task can result
334 // in the task getting executed the at the earliest possible
335 // opportunity or only after returning once from the message loop and
336 // then a second call into the message loop. In order to make behavior
337 // more deterministic, we change the default delay to 2ms. This should
338 // always require us to wait for the second call into the message loop.
339 //
340 // N.B. The correct fix for this and similar timing problems is to
341 // abstract time for the purpose of unittests. Unfortunately, we have
342 // a lot of third-party components that directly call the various
343 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45344 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05345 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13346 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45347 weak_factory_.GetWeakPtr(), true /* successful */,
348 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53349 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05350 return ERR_IO_PENDING;
351 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57352 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45353 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05354 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13355 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45356 weak_factory_.GetWeakPtr(), false /* error */,
357 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53358 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05359 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57360 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55361 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57362 client_socket_factory_->WaitForSignal(this);
363 waiting_success_ = true;
364 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13365 case kMockRecoverableJob:
366 return DoConnect(false /* error */, false /* sync */,
367 true /* recoverable */);
368 case kMockPendingRecoverableJob:
369 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45370 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13371 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13372 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45373 weak_factory_.GetWeakPtr(), false /* error */,
374 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53375 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13376 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18377 case kMockAdditionalErrorStateJob:
378 store_additional_error_state_ = true;
379 return DoConnect(false /* error */, false /* sync */,
380 false /* recoverable */);
381 case kMockPendingAdditionalErrorStateJob:
382 set_load_state(LOAD_STATE_CONNECTING);
383 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45384 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18385 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13386 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45387 weak_factory_.GetWeakPtr(), false /* error */,
388 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53389 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18390 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28391 case kMockUnreadDataJob: {
392 int ret = DoConnect(true /* successful */, false /* sync */,
393 false /* recoverable */);
394 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
395 return ret;
396 }
[email protected]ab838892009-06-30 18:49:05397 default:
398 NOTREACHED();
danakj655b66c2016-04-16 00:51:38399 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05400 return ERR_FAILED;
401 }
402 }
403
[email protected]e772db3f2010-07-12 18:11:13404 int DoConnect(bool succeed, bool was_async, bool recoverable) {
405 int result = OK;
[email protected]ab838892009-06-30 18:49:05406 if (succeed) {
[email protected]83039bb2011-12-09 18:43:55407 socket()->Connect(CompletionCallback());
[email protected]e772db3f2010-07-12 18:11:13408 } else if (recoverable) {
409 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40410 } else {
[email protected]e772db3f2010-07-12 18:11:13411 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38412 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05413 }
[email protected]2ab05b52009-07-01 23:57:58414
415 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30416 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05417 return result;
418 }
419
[email protected]5fc08e32009-07-15 17:09:57420 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05421 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57422 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21423 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18424 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05425
[email protected]d5492c52013-11-10 20:44:39426 base::WeakPtrFactory<TestConnectJob> weak_factory_;
427
[email protected]ab838892009-06-30 18:49:05428 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
429};
430
[email protected]d80a4322009-08-14 07:07:49431class TestConnectJobFactory
432 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05433 public:
[email protected]034df0f32013-01-07 23:17:48434 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
435 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05436 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48437 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48438 client_socket_factory_(client_socket_factory),
439 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33440 }
[email protected]ab838892009-06-30 18:49:05441
dchengb03027d2014-10-21 12:00:20442 ~TestConnectJobFactory() override {}
[email protected]ab838892009-06-30 18:49:05443
444 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
445
[email protected]51fdc7c2012-04-10 19:19:48446 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
447 job_types_ = job_types;
448 CHECK(!job_types_->empty());
449 }
450
[email protected]974ebd62009-08-03 23:14:34451 void set_timeout_duration(base::TimeDelta timeout_duration) {
452 timeout_duration_ = timeout_duration;
453 }
454
[email protected]3f55aa12011-12-07 02:03:33455 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55456
danakj655b66c2016-04-16 00:51:38457 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05458 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49459 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13460 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48461 EXPECT_TRUE(!job_types_ || !job_types_->empty());
462 TestConnectJob::JobType job_type = job_type_;
463 if (job_types_ && !job_types_->empty()) {
464 job_type = job_types_->front();
465 job_types_->pop_front();
466 }
danakj655b66c2016-04-16 00:51:38467 return std::unique_ptr<ConnectJob>(
468 new TestConnectJob(job_type, group_name, request, timeout_duration_,
469 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05470 }
471
dchengb03027d2014-10-21 12:00:20472 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26473 return timeout_duration_;
474 }
475
[email protected]ab838892009-06-30 18:49:05476 private:
477 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48478 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34479 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57480 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48481 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05482
483 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
484};
485
486class TestClientSocketPool : public ClientSocketPool {
487 public:
[email protected]12322e7e2013-08-15 17:49:26488 typedef TestSocketParams SocketParams;
489
[email protected]ab838892009-06-30 18:49:05490 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53491 int max_sockets,
[email protected]ab838892009-06-30 18:49:05492 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16493 base::TimeDelta unused_idle_socket_timeout,
494 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49495 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41496 : base_(NULL,
497 max_sockets,
498 max_sockets_per_group,
499 unused_idle_socket_timeout,
500 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38501 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05502
dchengb03027d2014-10-21 12:00:20503 ~TestClientSocketPool() override {}
[email protected]2431756e2010-09-29 20:26:13504
dchengb03027d2014-10-21 12:00:20505 int RequestSocket(const std::string& group_name,
506 const void* params,
ttuttle859dc7a2015-04-23 19:42:29507 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15508 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20509 ClientSocketHandle* handle,
510 const CompletionCallback& callback,
511 const BoundNetLog& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21512 const scoped_refptr<TestSocketParams>* casted_socket_params =
513 static_cast<const scoped_refptr<TestSocketParams>*>(params);
514 return base_.RequestSocket(group_name, *casted_socket_params, priority,
mmenked3641e12016-01-28 16:06:15515 respect_limits, handle, callback, net_log);
[email protected]ab838892009-06-30 18:49:05516 }
517
dchengb03027d2014-10-21 12:00:20518 void RequestSockets(const std::string& group_name,
519 const void* params,
520 int num_sockets,
521 const BoundNetLog& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03522 const scoped_refptr<TestSocketParams>* casted_params =
523 static_cast<const scoped_refptr<TestSocketParams>*>(params);
524
525 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
526 }
527
dchengb03027d2014-10-21 12:00:20528 void CancelRequest(const std::string& group_name,
529 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49530 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05531 }
532
dchengb03027d2014-10-21 12:00:20533 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38534 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20535 int id) override {
dchengc7eeda422015-12-26 03:56:48536 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24537 }
538
dchengb03027d2014-10-21 12:00:20539 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05540
dchengb03027d2014-10-21 12:00:20541 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48542
dchengb03027d2014-10-21 12:00:20543 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05544
dchengb03027d2014-10-21 12:00:20545 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05546
dchengb03027d2014-10-21 12:00:20547 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49548 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05549 }
550
dchengb03027d2014-10-21 12:00:20551 LoadState GetLoadState(const std::string& group_name,
552 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49553 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05554 }
555
dchengb03027d2014-10-21 12:00:20556 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52557 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48558 }
559
dchengb03027d2014-10-21 12:00:20560 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52561 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48562 }
563
danakj655b66c2016-04-16 00:51:38564 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59565 const std::string& name,
566 const std::string& type,
mostynbba063d6032014-10-09 11:01:13567 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27568 return base_.GetInfoAsValue(name, type);
569 }
570
dchengb03027d2014-10-21 12:00:20571 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26572 return base_.ConnectionTimeout();
573 }
574
[email protected]d80a4322009-08-14 07:07:49575 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20576
[email protected]8159a1c2012-06-07 00:00:10577 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
578 return base_.NumUnassignedConnectJobsInGroup(group_name);
579 }
580
[email protected]974ebd62009-08-03 23:14:34581 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49582 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34583 }
584
[email protected]2c2bef152010-10-13 00:55:03585 int NumActiveSocketsInGroup(const std::string& group_name) const {
586 return base_.NumActiveSocketsInGroup(group_name);
587 }
588
[email protected]2abfe90a2010-08-25 17:49:51589 bool HasGroup(const std::string& group_name) const {
590 return base_.HasGroup(group_name);
591 }
592
[email protected]9bf28db2009-08-29 01:35:16593 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
594
[email protected]06d94042010-08-25 01:45:22595 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54596
[email protected]043b68c82013-08-22 23:41:52597 bool CloseOneIdleConnectionInHigherLayeredPool() {
598 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48599 }
600
[email protected]ab838892009-06-30 18:49:05601 private:
[email protected]d80a4322009-08-14 07:07:49602 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05603
604 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
605};
606
[email protected]a937a06d2009-08-19 21:19:24607} // namespace
608
[email protected]a937a06d2009-08-19 21:19:24609namespace {
610
[email protected]5fc08e32009-07-15 17:09:57611void MockClientSocketFactory::SignalJobs() {
612 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
613 it != waiting_jobs_.end(); ++it) {
614 (*it)->Signal();
615 }
616 waiting_jobs_.clear();
617}
618
[email protected]03b7c8c2013-07-20 04:38:55619void MockClientSocketFactory::SignalJob(size_t job) {
620 ASSERT_LT(job, waiting_jobs_.size());
621 waiting_jobs_[job]->Signal();
622 waiting_jobs_.erase(waiting_jobs_.begin() + job);
623}
624
625void MockClientSocketFactory::SetJobLoadState(size_t job,
626 LoadState load_state) {
627 ASSERT_LT(job, waiting_jobs_.size());
628 waiting_jobs_[job]->set_load_state(load_state);
629}
630
[email protected]974ebd62009-08-03 23:14:34631class TestConnectJobDelegate : public ConnectJob::Delegate {
632 public:
633 TestConnectJobDelegate()
634 : have_result_(false), waiting_for_result_(false), result_(OK) {}
dchengb03027d2014-10-21 12:00:20635 ~TestConnectJobDelegate() override {}
[email protected]974ebd62009-08-03 23:14:34636
dchengb03027d2014-10-21 12:00:20637 void OnConnectJobComplete(int result, ConnectJob* job) override {
[email protected]974ebd62009-08-03 23:14:34638 result_ = result;
danakj655b66c2016-04-16 00:51:38639 std::unique_ptr<ConnectJob> owned_job(job);
640 std::unique_ptr<StreamSocket> socket = owned_job->PassSocket();
[email protected]9b6fee12009-09-29 18:13:07641 // socket.get() should be NULL iff result != OK
[email protected]18ccfdb2013-08-15 00:13:44642 EXPECT_EQ(socket == NULL, result != OK);
[email protected]974ebd62009-08-03 23:14:34643 have_result_ = true;
644 if (waiting_for_result_)
ki.stfu375812e2015-10-09 20:23:17645 base::MessageLoop::current()->QuitWhenIdle();
[email protected]974ebd62009-08-03 23:14:34646 }
647
648 int WaitForResult() {
649 DCHECK(!waiting_for_result_);
650 while (!have_result_) {
651 waiting_for_result_ = true;
fdoray5eeb7642016-06-22 16:11:28652 base::RunLoop().Run();
[email protected]974ebd62009-08-03 23:14:34653 waiting_for_result_ = false;
654 }
655 have_result_ = false; // auto-reset for next callback
656 return result_;
657 }
658
659 private:
660 bool have_result_;
661 bool waiting_for_result_;
662 int result_;
663};
664
[email protected]2431756e2010-09-29 20:26:13665class ClientSocketPoolBaseTest : public testing::Test {
[email protected]f6d1d6eb2009-06-24 20:16:09666 protected:
mmenked3641e12016-01-28 16:06:15667 ClientSocketPoolBaseTest() : params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54668 connect_backup_jobs_enabled_ =
669 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
670 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54671 }
[email protected]2431756e2010-09-29 20:26:13672
dcheng67be2b1f2014-10-27 21:47:29673 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54674 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
675 connect_backup_jobs_enabled_);
[email protected]636b8252011-04-08 19:56:54676 }
[email protected]c9d6a1d2009-07-14 16:15:20677
[email protected]211d21722009-07-22 15:48:53678 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16679 CreatePoolWithIdleTimeouts(
680 max_sockets,
681 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30682 ClientSocketPool::unused_idle_socket_timeout(),
683 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16684 }
685
686 void CreatePoolWithIdleTimeouts(
687 int max_sockets, int max_sockets_per_group,
688 base::TimeDelta unused_idle_socket_timeout,
689 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20690 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48691 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
692 &net_log_);
[email protected]2431756e2010-09-29 20:26:13693 pool_.reset(new TestClientSocketPool(max_sockets,
694 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13695 unused_idle_socket_timeout,
696 used_idle_socket_timeout,
697 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20698 }
[email protected]f6d1d6eb2009-06-24 20:16:09699
mmenked3641e12016-01-28 16:06:15700 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33701 const std::string& group_name,
702 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15703 ClientSocketPool::RespectLimits respect_limits) {
704 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
705 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33706 }
707
708 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15709 return StartRequestWithIgnoreLimits(
710 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09711 }
712
[email protected]2431756e2010-09-29 20:26:13713 int GetOrderOfRequest(size_t index) const {
714 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09715 }
716
[email protected]2431756e2010-09-29 20:26:13717 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
718 return test_base_.ReleaseOneConnection(keep_alive);
719 }
720
721 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
722 test_base_.ReleaseAllConnections(keep_alive);
723 }
724
725 TestSocketRequest* request(int i) { return test_base_.request(i); }
726 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38727 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42728 return test_base_.requests();
729 }
[email protected]2431756e2010-09-29 20:26:13730 size_t completion_count() const { return test_base_.completion_count(); }
731
vishal.b62985ca92015-04-17 08:45:51732 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54733 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09734 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04735 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21736 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38737 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13738 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09739};
740
[email protected]974ebd62009-08-03 23:14:34741// Even though a timeout is specified, it doesn't time out on a synchronous
742// completion.
743TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
744 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06745 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49746 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07747 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15748 ClientSocketPool::RespectLimits::ENABLED,
749 internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog());
danakj655b66c2016-04-16 00:51:38750 std::unique_ptr<TestConnectJob> job(
751 new TestConnectJob(TestConnectJob::kMockJob, "a", request,
752 base::TimeDelta::FromMicroseconds(1), &delegate,
753 &client_socket_factory_, NULL));
robpercival214763f2016-07-01 23:27:01754 EXPECT_THAT(job->Connect(), IsOk());
[email protected]974ebd62009-08-03 23:14:34755}
756
757TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
758 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06759 ClientSocketHandle ignored;
vishal.b62985ca92015-04-17 08:45:51760 TestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53761
[email protected]d80a4322009-08-14 07:07:49762 TestClientSocketPoolBase::Request request(
[email protected]bb1c4662013-11-14 00:00:07763 &ignored, CompletionCallback(), DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:15764 ClientSocketPool::RespectLimits::ENABLED,
765 internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog());
[email protected]974ebd62009-08-03 23:14:34766 // Deleted by TestConnectJobDelegate.
767 TestConnectJob* job =
768 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12769 "a",
[email protected]974ebd62009-08-03 23:14:34770 request,
771 base::TimeDelta::FromMicroseconds(1),
772 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30773 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17774 &log);
robpercival214763f2016-07-01 23:27:01775 ASSERT_THAT(job->Connect(), IsError(ERR_IO_PENDING));
[email protected]26b9973962012-01-28 00:57:00776 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
robpercival214763f2016-07-01 23:27:01777 EXPECT_THAT(delegate.WaitForResult(), IsError(ERR_TIMED_OUT));
[email protected]fd7b7c92009-08-20 19:38:30778
mmenke43758e62015-05-04 21:09:46779 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40780 log.GetEntries(&entries);
781
782 EXPECT_EQ(6u, entries.size());
[email protected]e9002a92010-01-29 07:10:46783 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40784 entries, 0, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB));
[email protected]06650c52010-06-03 00:49:17785 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40786 entries, 1, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT));
[email protected]e9002a92010-01-29 07:10:46787 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:40788 entries, 2, NetLog::TYPE_CONNECT_JOB_SET_SOCKET,
[email protected]06650c52010-06-03 00:49:17789 NetLog::PHASE_NONE));
790 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:40791 entries, 3, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
[email protected]9e743cd2010-03-16 07:03:53792 NetLog::PHASE_NONE));
[email protected]e9002a92010-01-29 07:10:46793 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40794 entries, 4, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_CONNECT));
[email protected]06650c52010-06-03 00:49:17795 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40796 entries, 5, NetLog::TYPE_SOCKET_POOL_CONNECT_JOB));
[email protected]974ebd62009-08-03 23:14:34797}
798
[email protected]5fc08e32009-07-15 17:09:57799TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53800 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20801
[email protected]6ecf2b92011-12-15 01:14:52802 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06803 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51804 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48805 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53806
mmenked3641e12016-01-28 16:06:15807 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY,
808 ClientSocketPool::RespectLimits::ENABLED,
809 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09810 EXPECT_TRUE(handle.is_initialized());
811 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48812 TestLoadTimingInfoConnectedNotReused(handle);
813
[email protected]f6d1d6eb2009-06-24 20:16:09814 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48815 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30816
mmenke43758e62015-05-04 21:09:46817 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40818 log.GetEntries(&entries);
819
820 EXPECT_EQ(4u, entries.size());
[email protected]e9002a92010-01-29 07:10:46821 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40822 entries, 0, NetLog::TYPE_SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53823 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:40824 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
[email protected]06650c52010-06-03 00:49:17825 NetLog::PHASE_NONE));
826 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:40827 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET,
[email protected]9e743cd2010-03-16 07:03:53828 NetLog::PHASE_NONE));
829 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40830 entries, 3, NetLog::TYPE_SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09831}
832
[email protected]ab838892009-06-30 18:49:05833TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53834 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20835
[email protected]ab838892009-06-30 18:49:05836 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51837 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53838
[email protected]2431756e2010-09-29 20:26:13839 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52840 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18841 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13842 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43843 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45844 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13845 handle.set_ssl_error_response_info(info);
846 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:15847 handle.Init("a", params_, DEFAULT_PRIORITY,
848 ClientSocketPool::RespectLimits::ENABLED,
849 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13850 EXPECT_FALSE(handle.socket());
851 EXPECT_FALSE(handle.is_ssl_error());
852 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48853 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30854
mmenke43758e62015-05-04 21:09:46855 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40856 log.GetEntries(&entries);
857
858 EXPECT_EQ(3u, entries.size());
[email protected]5a1d7ca2010-04-28 20:12:27859 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40860 entries, 0, NetLog::TYPE_SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17861 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:40862 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
[email protected]06650c52010-06-03 00:49:17863 NetLog::PHASE_NONE));
[email protected]a2006ece2010-04-23 16:44:02864 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40865 entries, 2, NetLog::TYPE_SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09866}
867
[email protected]211d21722009-07-22 15:48:53868TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
869 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
870
[email protected]9e743cd2010-03-16 07:03:53871 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30872
robpercival214763f2016-07-01 23:27:01873 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
874 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
875 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
876 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53877
[email protected]2431756e2010-09-29 20:26:13878 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53879 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13880 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53881
robpercival214763f2016-07-01 23:27:01882 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
883 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
884 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53885
[email protected]2431756e2010-09-29 20:26:13886 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53887
[email protected]2431756e2010-09-29 20:26:13888 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53889 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13890 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53891
892 EXPECT_EQ(1, GetOrderOfRequest(1));
893 EXPECT_EQ(2, GetOrderOfRequest(2));
894 EXPECT_EQ(3, GetOrderOfRequest(3));
895 EXPECT_EQ(4, GetOrderOfRequest(4));
896 EXPECT_EQ(5, GetOrderOfRequest(5));
897 EXPECT_EQ(6, GetOrderOfRequest(6));
898 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17899
900 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13901 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53902}
903
904TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
905 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
906
[email protected]9e743cd2010-03-16 07:03:53907 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30908
[email protected]211d21722009-07-22 15:48:53909 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01910 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
911 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
912 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
913 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53914
[email protected]2431756e2010-09-29 20:26:13915 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53916 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13917 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53918
919 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01920 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53921
[email protected]2431756e2010-09-29 20:26:13922 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53923
[email protected]2431756e2010-09-29 20:26:13924 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53925 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13926 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53927
928 EXPECT_EQ(1, GetOrderOfRequest(1));
929 EXPECT_EQ(2, GetOrderOfRequest(2));
930 EXPECT_EQ(3, GetOrderOfRequest(3));
931 EXPECT_EQ(4, GetOrderOfRequest(4));
932 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17933
934 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13935 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53936}
937
938TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
939 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
940
robpercival214763f2016-07-01 23:27:01941 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
942 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
943 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
944 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53945
[email protected]2431756e2010-09-29 20:26:13946 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53947 client_socket_factory_.allocation_count());
948
robpercival214763f2016-07-01 23:27:01949 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
950 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
951 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53952
[email protected]2431756e2010-09-29 20:26:13953 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53954
[email protected]2431756e2010-09-29 20:26:13955 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53956
957 // First 4 requests don't have to wait, and finish in order.
958 EXPECT_EQ(1, GetOrderOfRequest(1));
959 EXPECT_EQ(2, GetOrderOfRequest(2));
960 EXPECT_EQ(3, GetOrderOfRequest(3));
961 EXPECT_EQ(4, GetOrderOfRequest(4));
962
[email protected]ac790b42009-12-02 04:31:31963 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
964 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53965 EXPECT_EQ(7, GetOrderOfRequest(5));
966 EXPECT_EQ(6, GetOrderOfRequest(6));
967 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17968
969 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13970 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53971}
972
973TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
974 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
975
robpercival214763f2016-07-01 23:27:01976 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
977 EXPECT_THAT(StartRequest("a", LOW), IsOk());
978 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
979 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:53980
[email protected]2431756e2010-09-29 20:26:13981 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53982 client_socket_factory_.allocation_count());
983
robpercival214763f2016-07-01 23:27:01984 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
985 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
986 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53987
[email protected]2431756e2010-09-29 20:26:13988 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53989
[email protected]2431756e2010-09-29 20:26:13990 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53991 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13992 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53993
994 // First 4 requests don't have to wait, and finish in order.
995 EXPECT_EQ(1, GetOrderOfRequest(1));
996 EXPECT_EQ(2, GetOrderOfRequest(2));
997 EXPECT_EQ(3, GetOrderOfRequest(3));
998 EXPECT_EQ(4, GetOrderOfRequest(4));
999
1000 // Request ("b", 7) has the highest priority, but we can't make new socket for
1001 // group "b", because it has reached the per-group limit. Then we make
1002 // socket for ("c", 6), because it has higher priority than ("a", 4),
1003 // and we still can't make a socket for group "b".
1004 EXPECT_EQ(5, GetOrderOfRequest(5));
1005 EXPECT_EQ(6, GetOrderOfRequest(6));
1006 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171007
1008 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131009 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531010}
1011
1012// Make sure that we count connecting sockets against the total limit.
1013TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1014 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1015
robpercival214763f2016-07-01 23:27:011016 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1017 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1018 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531019
1020 // Create one asynchronous request.
1021 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011022 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531023
[email protected]6b175382009-10-13 06:47:471024 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1025 // actually become pending until 2ms after they have been created. In order
1026 // to flush all tasks, we need to wait so that we know there are no
1027 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:001028 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281029 base::RunLoop().RunUntilIdle();
[email protected]6b175382009-10-13 06:47:471030
[email protected]211d21722009-07-22 15:48:531031 // The next synchronous request should wait for its turn.
1032 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011033 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531034
[email protected]2431756e2010-09-29 20:26:131035 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531036
[email protected]2431756e2010-09-29 20:26:131037 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531038 client_socket_factory_.allocation_count());
1039
1040 EXPECT_EQ(1, GetOrderOfRequest(1));
1041 EXPECT_EQ(2, GetOrderOfRequest(2));
1042 EXPECT_EQ(3, GetOrderOfRequest(3));
1043 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171044 EXPECT_EQ(5, GetOrderOfRequest(5));
1045
1046 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131047 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531048}
1049
[email protected]6427fe22010-04-16 22:27:411050TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1051 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1052 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1053
robpercival214763f2016-07-01 23:27:011054 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1055 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1056 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1057 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411058
1059 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1060
1061 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1062
robpercival214763f2016-07-01 23:27:011063 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1064 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411065
1066 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1067
[email protected]2431756e2010-09-29 20:26:131068 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411069 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[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 + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131072 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1073 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411074 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1075}
1076
[email protected]d7027bb2010-05-10 18:58:541077TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1078 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1079 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1080
1081 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521082 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131083 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151084 handle.Init("a", params_, DEFAULT_PRIORITY,
1085 ClientSocketPool::RespectLimits::ENABLED,
1086 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]d7027bb2010-05-10 18:58:541087
1088 ClientSocketHandle handles[4];
1089 for (size_t i = 0; i < arraysize(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521090 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131091 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151092 handles[i].Init("b", params_, DEFAULT_PRIORITY,
1093 ClientSocketPool::RespectLimits::ENABLED,
1094 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]d7027bb2010-05-10 18:58:541095 }
1096
1097 // One will be stalled, cancel all the handles now.
1098 // This should hit the OnAvailableSocketSlot() code where we previously had
1099 // stalled groups, but no longer have any.
1100 for (size_t i = 0; i < arraysize(handles); ++i)
1101 handles[i].Reset();
1102}
1103
[email protected]eb5a99382010-07-11 03:18:261104TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541105 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1106 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1107
[email protected]eb5a99382010-07-11 03:18:261108 {
1109 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521110 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261111 for (int i = 0; i < kDefaultMaxSockets; ++i) {
mmenked3641e12016-01-28 16:06:151112 EXPECT_EQ(OK, handles[i].Init(
1113 base::IntToString(i), params_, DEFAULT_PRIORITY,
1114 ClientSocketPool::RespectLimits::ENABLED,
1115 callbacks[i].callback(), pool_.get(), BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:261116 }
1117
1118 // Force a stalled group.
1119 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521120 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151121 EXPECT_EQ(
1122 ERR_IO_PENDING,
1123 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1124 ClientSocketPool::RespectLimits::ENABLED,
1125 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:261126
1127 // Cancel the stalled request.
1128 stalled_handle.Reset();
1129
1130 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1131 EXPECT_EQ(0, pool_->IdleSocketCount());
1132
1133 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541134 }
1135
[email protected]43a21b82010-06-10 21:30:541136 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1137 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261138}
[email protected]43a21b82010-06-10 21:30:541139
[email protected]eb5a99382010-07-11 03:18:261140TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1141 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1142 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1143
1144 {
1145 ClientSocketHandle handles[kDefaultMaxSockets];
1146 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521147 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151148 EXPECT_EQ(
1149 ERR_IO_PENDING,
1150 handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1151 ClientSocketPool::RespectLimits::ENABLED,
1152 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:261153 }
1154
1155 // Force a stalled group.
1156 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1157 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521158 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151159 EXPECT_EQ(
1160 ERR_IO_PENDING,
1161 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1162 ClientSocketPool::RespectLimits::ENABLED,
1163 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:261164
1165 // Since it is stalled, it should have no connect jobs.
1166 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101167 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261168
1169 // Cancel the stalled request.
1170 handles[0].Reset();
1171
[email protected]eb5a99382010-07-11 03:18:261172 // Now we should have a connect job.
1173 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101174 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261175
1176 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011177 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261178
1179 EXPECT_EQ(kDefaultMaxSockets + 1,
1180 client_socket_factory_.allocation_count());
1181 EXPECT_EQ(0, pool_->IdleSocketCount());
1182 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101183 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261184
1185 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541186 }
1187
[email protected]eb5a99382010-07-11 03:18:261188 EXPECT_EQ(1, pool_->IdleSocketCount());
1189}
[email protected]43a21b82010-06-10 21:30:541190
[email protected]eb5a99382010-07-11 03:18:261191TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1192 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1193 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541194
[email protected]eb5a99382010-07-11 03:18:261195 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521196 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261197 {
[email protected]51fdc7c2012-04-10 19:19:481198 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261199 ClientSocketHandle handles[kDefaultMaxSockets];
1200 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521201 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151202 EXPECT_EQ(
1203 OK, handles[i].Init(base::StringPrintf("Take 2: %d", i), params_,
1204 DEFAULT_PRIORITY,
1205 ClientSocketPool::RespectLimits::ENABLED,
1206 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:261207 }
1208
1209 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1210 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481211 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261212
1213 // Now we will hit the socket limit.
mmenked3641e12016-01-28 16:06:151214 EXPECT_EQ(
1215 ERR_IO_PENDING,
1216 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY,
1217 ClientSocketPool::RespectLimits::ENABLED,
1218 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]51fdc7c2012-04-10 19:19:481219 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261220
1221 // Dropping out of scope will close all handles and return them to idle.
1222 }
[email protected]43a21b82010-06-10 21:30:541223
1224 // But if we wait for it, the released idle sockets will be closed in
1225 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011226 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261227
1228 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1229 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541230}
1231
1232// Regression test for http://crbug.com/40952.
1233TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1234 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221235 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541236 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1237
1238 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1239 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521240 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151241 EXPECT_EQ(OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
1242 ClientSocketPool::RespectLimits::ENABLED,
1243 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]43a21b82010-06-10 21:30:541244 }
1245
1246 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281247 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541248
1249 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1250 // reuse a socket.
1251 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1252 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521253 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541254
1255 // "0" is special here, since it should be the first entry in the sorted map,
1256 // which is the one which we would close an idle socket for. We shouldn't
1257 // close an idle socket though, since we should reuse the idle socket.
mmenked3641e12016-01-28 16:06:151258 EXPECT_EQ(OK, handle.Init("0", params_, DEFAULT_PRIORITY,
1259 ClientSocketPool::RespectLimits::ENABLED,
1260 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]43a21b82010-06-10 21:30:541261
1262 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1263 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1264}
1265
[email protected]ab838892009-06-30 18:49:051266TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531267 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091268
robpercival214763f2016-07-01 23:27:011269 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1270 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1271 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1272 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1273 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1274 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1275 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1276 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091277
[email protected]2431756e2010-09-29 20:26:131278 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091279
[email protected]c9d6a1d2009-07-14 16:15:201280 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1281 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131282 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1283 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091284
[email protected]c9d6a1d2009-07-14 16:15:201285 EXPECT_EQ(1, GetOrderOfRequest(1));
1286 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031287 EXPECT_EQ(8, GetOrderOfRequest(3));
1288 EXPECT_EQ(6, GetOrderOfRequest(4));
1289 EXPECT_EQ(4, GetOrderOfRequest(5));
1290 EXPECT_EQ(3, GetOrderOfRequest(6));
1291 EXPECT_EQ(5, GetOrderOfRequest(7));
1292 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171293
1294 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131295 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091296}
1297
[email protected]ab838892009-06-30 18:49:051298TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531299 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091300
robpercival214763f2016-07-01 23:27:011301 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1302 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1303 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1304 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1305 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1306 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1307 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091308
[email protected]2431756e2010-09-29 20:26:131309 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091310
[email protected]2431756e2010-09-29 20:26:131311 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011312 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201313
[email protected]2431756e2010-09-29 20:26:131314 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201315 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131316 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1317 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091318}
1319
1320// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051321// The pending connect job will be cancelled and should not call back into
1322// ClientSocketPoolBase.
1323TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531324 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201325
[email protected]ab838892009-06-30 18:49:051326 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131327 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521328 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151329 EXPECT_EQ(ERR_IO_PENDING,
1330 handle.Init("a", params_, DEFAULT_PRIORITY,
1331 ClientSocketPool::RespectLimits::ENABLED,
1332 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]2431756e2010-09-29 20:26:131333 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091334}
1335
[email protected]ab838892009-06-30 18:49:051336TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531337 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201338
[email protected]ab838892009-06-30 18:49:051339 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061340 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521341 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091342
mmenked3641e12016-01-28 16:06:151343 EXPECT_EQ(ERR_IO_PENDING,
1344 handle.Init("a", params_, DEFAULT_PRIORITY,
1345 ClientSocketPool::RespectLimits::ENABLED,
1346 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]f6d1d6eb2009-06-24 20:16:091347
1348 handle.Reset();
1349
[email protected]6ecf2b92011-12-15 01:14:521350 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131351 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151352 handle.Init("a", params_, DEFAULT_PRIORITY,
1353 ClientSocketPool::RespectLimits::ENABLED,
1354 callback2.callback(), pool_.get(), BoundNetLog()));
[email protected]f6d1d6eb2009-06-24 20:16:091355
robpercival214763f2016-07-01 23:27:011356 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091357 EXPECT_FALSE(callback.have_result());
1358
1359 handle.Reset();
1360}
1361
[email protected]ab838892009-06-30 18:49:051362TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531363 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091364
robpercival214763f2016-07-01 23:27:011365 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1366 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1367 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1368 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1369 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1370 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1371 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091372
1373 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201374 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131375 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1376 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091377
[email protected]2431756e2010-09-29 20:26:131378 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091379
[email protected]c9d6a1d2009-07-14 16:15:201380 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1381 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131382 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1383 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091384
[email protected]c9d6a1d2009-07-14 16:15:201385 EXPECT_EQ(1, GetOrderOfRequest(1));
1386 EXPECT_EQ(2, GetOrderOfRequest(2));
1387 EXPECT_EQ(5, GetOrderOfRequest(3));
1388 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131389 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1390 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201391 EXPECT_EQ(4, GetOrderOfRequest(6));
1392 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171393
1394 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131395 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091396}
1397
mmenke33d24423d2015-05-19 19:41:091398// Function to be used as a callback on socket request completion. It first
1399// disconnects the successfully connected socket from the first request, and
1400// then reuses the ClientSocketHandle to request another socket.
1401//
1402// |nested_callback| is called with the result of the second socket request.
1403void RequestSocketOnComplete(ClientSocketHandle* handle,
1404 TestClientSocketPool* pool,
1405 TestConnectJobFactory* test_connect_job_factory,
1406 TestConnectJob::JobType next_job_type,
1407 const CompletionCallback& nested_callback,
1408 int first_request_result) {
robpercival214763f2016-07-01 23:27:011409 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091410
1411 test_connect_job_factory->set_job_type(next_job_type);
1412
1413 // Don't allow reuse of the socket. Disconnect it and then release it.
1414 if (handle->socket())
1415 handle->socket()->Disconnect();
1416 handle->Reset();
1417
mmenked3641e12016-01-28 16:06:151418 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091419 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151420 int rv = handle->Init("a", params, LOWEST,
1421 ClientSocketPool::RespectLimits::ENABLED,
1422 nested_callback, pool, BoundNetLog());
mmenke33d24423d2015-05-19 19:41:091423 if (rv != ERR_IO_PENDING) {
1424 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
1425 nested_callback.Run(rv);
1426 } else {
1427 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521428 }
mmenke33d24423d2015-05-19 19:41:091429}
[email protected]f6d1d6eb2009-06-24 20:16:091430
mmenke33d24423d2015-05-19 19:41:091431// Tests the case where a second socket is requested in a completion callback,
1432// and the second socket connects asynchronously. Reuses the same
1433// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581434TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531435 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201436
[email protected]0b7648c2009-07-06 20:14:011437 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061438 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091439 TestCompletionCallback second_result_callback;
1440 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151441 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091442 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1443 connect_job_factory_, TestConnectJob::kMockPendingJob,
1444 second_result_callback.callback()),
1445 pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011446 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091447
robpercival214763f2016-07-01 23:27:011448 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581449}
[email protected]f6d1d6eb2009-06-24 20:16:091450
mmenke33d24423d2015-05-19 19:41:091451// Tests the case where a second socket is requested in a completion callback,
1452// and the second socket connects synchronously. Reuses the same
1453// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581454TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531455 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201456
[email protected]0b7648c2009-07-06 20:14:011457 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061458 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091459 TestCompletionCallback second_result_callback;
1460 int rv = handle.Init(
mmenked3641e12016-01-28 16:06:151461 "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091462 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1463 connect_job_factory_, TestConnectJob::kMockPendingJob,
1464 second_result_callback.callback()),
1465 pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011466 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581467
robpercival214763f2016-07-01 23:27:011468 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091469}
1470
1471// Make sure that pending requests get serviced after active requests get
1472// cancelled.
[email protected]ab838892009-06-30 18:49:051473TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531474 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201475
[email protected]0b7648c2009-07-06 20:14:011476 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091477
robpercival214763f2016-07-01 23:27:011478 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1479 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1480 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1481 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1482 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1483 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1484 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091485
[email protected]c9d6a1d2009-07-14 16:15:201486 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1487 // Let's cancel them.
1488 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131489 ASSERT_FALSE(request(i)->handle()->is_initialized());
1490 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091491 }
1492
[email protected]f6d1d6eb2009-06-24 20:16:091493 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131494 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011495 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131496 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091497 }
1498
[email protected]2431756e2010-09-29 20:26:131499 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1500 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091501}
1502
1503// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051504TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531505 const size_t kMaxSockets = 5;
1506 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201507
[email protected]0b7648c2009-07-06 20:14:011508 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091509
[email protected]211d21722009-07-22 15:48:531510 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1511 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091512
1513 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531514 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011515 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091516
[email protected]211d21722009-07-22 15:48:531517 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011518 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091519}
1520
[email protected]5fc08e32009-07-15 17:09:571521TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531522 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571523
1524 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1525
[email protected]2431756e2010-09-29 20:26:131526 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521527 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151528 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1529 ClientSocketPool::RespectLimits::ENABLED,
1530 callback.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011531 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571532
1533 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131534 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571535
mmenked3641e12016-01-28 16:06:151536 rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1537 ClientSocketPool::RespectLimits::ENABLED,
1538 callback.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011539 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1540 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571541
[email protected]2431756e2010-09-29 20:26:131542 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481543 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571544 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1545}
1546
[email protected]2b7523d2009-07-29 20:29:231547// Regression test for http://crbug.com/17985.
1548TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1549 const int kMaxSockets = 3;
1550 const int kMaxSocketsPerGroup = 2;
1551 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1552
[email protected]ac790b42009-12-02 04:31:311553 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231554
robpercival214763f2016-07-01 23:27:011555 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1556 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231557
1558 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011559 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231560
1561 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011562 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231563
1564 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011565 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1566 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231567
[email protected]eb5a99382010-07-11 03:18:261568 // Release the first two sockets from "a". Because this is a keepalive,
1569 // the first release will unblock the pending request for "a". The
1570 // second release will unblock a request for "c", becaue it is the next
1571 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131572 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1573 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231574
1575 // Closing idle sockets should not get us into trouble, but in the bug
1576 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411577 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541578 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261579
[email protected]2da659e2013-05-23 20:51:341580 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281581 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231582}
1583
[email protected]4d3b05d2010-01-27 21:27:291584TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531585 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571586
1587 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131588 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521589 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511590 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:151591 int rv = handle.Init("a", params_, LOWEST,
1592 ClientSocketPool::RespectLimits::ENABLED,
1593 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011594 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131595 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481596 TestLoadTimingInfoNotConnected(handle);
1597
robpercival214763f2016-07-01 23:27:011598 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131599 EXPECT_TRUE(handle.is_initialized());
1600 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481601 TestLoadTimingInfoConnectedNotReused(handle);
1602
[email protected]2431756e2010-09-29 20:26:131603 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481604 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301605
mmenke43758e62015-05-04 21:09:461606 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401607 log.GetEntries(&entries);
1608
1609 EXPECT_EQ(4u, entries.size());
[email protected]e9002a92010-01-29 07:10:461610 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:401611 entries, 0, NetLog::TYPE_SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171612 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:401613 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
[email protected]06650c52010-06-03 00:49:171614 NetLog::PHASE_NONE));
1615 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:401616 entries, 2, NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET,
[email protected]06650c52010-06-03 00:49:171617 NetLog::PHASE_NONE));
[email protected]e9002a92010-01-29 07:10:461618 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:401619 entries, 3, NetLog::TYPE_SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571620}
1621
[email protected]4d3b05d2010-01-27 21:27:291622TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571623 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531624 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571625
1626 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131627 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521628 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511629 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181630 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131631 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431632 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451633 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131634 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151635 EXPECT_EQ(ERR_IO_PENDING,
1636 handle.Init("a", params_, DEFAULT_PRIORITY,
1637 ClientSocketPool::RespectLimits::ENABLED,
1638 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131639 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011640 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131641 EXPECT_FALSE(handle.is_ssl_error());
1642 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301643
mmenke43758e62015-05-04 21:09:461644 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401645 log.GetEntries(&entries);
1646
1647 EXPECT_EQ(3u, entries.size());
[email protected]e9002a92010-01-29 07:10:461648 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:401649 entries, 0, NetLog::TYPE_SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171650 EXPECT_TRUE(LogContainsEvent(
[email protected]b2fcd0e2010-12-01 15:19:401651 entries, 1, NetLog::TYPE_SOCKET_POOL_BOUND_TO_CONNECT_JOB,
[email protected]06650c52010-06-03 00:49:171652 NetLog::PHASE_NONE));
[email protected]6b624c62010-03-14 08:37:321653 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:401654 entries, 2, NetLog::TYPE_SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571655}
1656
mmenke6be122f2015-03-09 22:22:471657// Check that an async ConnectJob failure does not result in creation of a new
1658// ConnectJob when there's another pending request also waiting on its own
1659// ConnectJob. See http://crbug.com/463960.
1660TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1661 CreatePool(2, 2);
1662 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1663
robpercival214763f2016-07-01 23:27:011664 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1665 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471666
robpercival214763f2016-07-01 23:27:011667 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1668 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471669
1670 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1671}
1672
[email protected]4d3b05d2010-01-27 21:27:291673TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101674 // TODO(eroman): Add back the log expectations! Removed them because the
1675 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531676 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571677
1678 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131679 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521680 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131681 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521682 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571683
[email protected]2431756e2010-09-29 20:26:131684 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151685 handle.Init("a", params_, DEFAULT_PRIORITY,
1686 ClientSocketPool::RespectLimits::ENABLED,
1687 callback.callback(), pool_.get(), BoundNetLog()));
vishal.b62985ca92015-04-17 08:45:511688 BoundTestNetLog log2;
[email protected]2431756e2010-09-29 20:26:131689 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:151690 handle2.Init("a", params_, DEFAULT_PRIORITY,
1691 ClientSocketPool::RespectLimits::ENABLED,
1692 callback2.callback(), pool_.get(), BoundNetLog()));
[email protected]5fc08e32009-07-15 17:09:571693
[email protected]2431756e2010-09-29 20:26:131694 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571695
[email protected]fd7b7c92009-08-20 19:38:301696
1697 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301698
robpercival214763f2016-07-01 23:27:011699 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131700 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301701
1702 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531703 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571704}
1705
[email protected]4d3b05d2010-01-27 21:27:291706TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341707 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1708
[email protected]17a0c6c2009-08-04 00:07:041709 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1710
robpercival214763f2016-07-01 23:27:011711 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1712 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1713 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1714 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341715
1716 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131717 (*requests())[2]->handle()->Reset();
1718 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341719 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1720
[email protected]2431756e2010-09-29 20:26:131721 (*requests())[1]->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())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261725 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341726}
1727
[email protected]5fc08e32009-07-15 17:09:571728// When requests and ConnectJobs are not coupled, the request will get serviced
1729// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291730TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531731 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571732
1733 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321734 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571735
[email protected]2431756e2010-09-29 20:26:131736 std::vector<TestSocketRequest*> request_order;
1737 size_t completion_count; // unused
1738 TestSocketRequest req1(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151739 int rv = req1.handle()->Init("a", params_, DEFAULT_PRIORITY,
1740 ClientSocketPool::RespectLimits::ENABLED,
1741 req1.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011742 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1743 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571744
1745 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1746 // without a job.
1747 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1748
[email protected]2431756e2010-09-29 20:26:131749 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151750 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
1751 ClientSocketPool::RespectLimits::ENABLED,
1752 req2.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011753 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131754 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151755 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
1756 ClientSocketPool::RespectLimits::ENABLED,
1757 req3.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011758 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571759
1760 // Both Requests 2 and 3 are pending. We release socket 1 which should
1761 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331762 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341763 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281764 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331765 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011766 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331767 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571768
1769 // Signal job 2, which should service request 3.
1770
1771 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011772 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571773
[email protected]2431756e2010-09-29 20:26:131774 ASSERT_EQ(3U, request_order.size());
1775 EXPECT_EQ(&req1, request_order[0]);
1776 EXPECT_EQ(&req2, request_order[1]);
1777 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571778 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1779}
1780
1781// The requests are not coupled to the jobs. So, the requests should finish in
1782// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:291783TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531784 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571785 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:321786 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:571787
[email protected]2431756e2010-09-29 20:26:131788 std::vector<TestSocketRequest*> request_order;
1789 size_t completion_count; // unused
1790 TestSocketRequest req1(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151791 int rv = req1.handle()->Init("a", params_, DEFAULT_PRIORITY,
1792 ClientSocketPool::RespectLimits::ENABLED,
1793 req1.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011794 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571795
[email protected]2431756e2010-09-29 20:26:131796 TestSocketRequest req2(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151797 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY,
1798 ClientSocketPool::RespectLimits::ENABLED,
1799 req2.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011800 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571801
1802 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:321803 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:571804
[email protected]2431756e2010-09-29 20:26:131805 TestSocketRequest req3(&request_order, &completion_count);
mmenked3641e12016-01-28 16:06:151806 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY,
1807 ClientSocketPool::RespectLimits::ENABLED,
1808 req3.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011809 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571810
robpercival214763f2016-07-01 23:27:011811 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1812 EXPECT_THAT(req2.WaitForResult(), IsOk());
1813 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:571814
[email protected]2431756e2010-09-29 20:26:131815 ASSERT_EQ(3U, request_order.size());
1816 EXPECT_EQ(&req1, request_order[0]);
1817 EXPECT_EQ(&req2, request_order[1]);
1818 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571819}
1820
[email protected]03b7c8c2013-07-20 04:38:551821// Test GetLoadState in the case there's only one socket request.
1822TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:531823 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:551824 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:571825
[email protected]2431756e2010-09-29 20:26:131826 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521827 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151828 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1829 ClientSocketPool::RespectLimits::ENABLED,
1830 callback.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011831 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551832 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:571833
[email protected]03b7c8c2013-07-20 04:38:551834 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
1835 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
1836
1837 // No point in completing the connection, since ClientSocketHandles only
1838 // expect the LoadState to be checked while connecting.
1839}
1840
1841// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:001842// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:551843TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
1844 CreatePool(2, 2);
1845 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1846
1847 ClientSocketHandle handle;
1848 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151849 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1850 ClientSocketPool::RespectLimits::ENABLED,
1851 callback.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011852 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:001853 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
1854
1855 ClientSocketHandle handle2;
1856 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:151857 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
1858 ClientSocketPool::RespectLimits::ENABLED,
1859 callback2.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011860 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:001861 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
1862
1863 // Check that both handles report the state of the first job.
1864 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
1865 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
1866
1867 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
1868
1869 // Check that both handles change to LOAD_STATE_CONNECTING.
1870 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1871 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
1872}
1873
1874// Test that the second connection request does not affect the pool's load
1875// status.
1876TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
1877 CreatePool(2, 2);
1878 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1879
1880 ClientSocketHandle handle;
1881 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151882 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1883 ClientSocketPool::RespectLimits::ENABLED,
1884 callback.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011885 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571886
[email protected]2431756e2010-09-29 20:26:131887 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521888 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:151889 rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
1890 ClientSocketPool::RespectLimits::ENABLED,
1891 callback2.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011892 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:001893 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:551894
[email protected]03b7c8c2013-07-20 04:38:551895 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1896 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
1897
haavardm835c1d62015-04-22 08:18:001898 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:551899 // second handle switches to the state of the remaining ConnectJob.
1900 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:011901 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:001902 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:551903}
1904
1905// Test GetLoadState in the case the per-group limit is reached.
1906TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
1907 CreatePool(2, 1);
1908 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1909
1910 ClientSocketHandle handle;
1911 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151912 int rv = handle.Init("a", params_, MEDIUM,
1913 ClientSocketPool::RespectLimits::ENABLED,
1914 callback.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011915 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551916 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1917
1918 // Request another socket from the same pool, buth with a higher priority.
1919 // The first request should now be stalled at the socket group limit.
1920 ClientSocketHandle handle2;
1921 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:151922 rv = handle2.Init("a", params_, HIGHEST,
1923 ClientSocketPool::RespectLimits::ENABLED,
1924 callback2.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011925 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551926 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
1927 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
1928
1929 // The first handle should remain stalled as the other socket goes through
1930 // the connect process.
1931
1932 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
1933 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
1934 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
1935
1936 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:011937 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:551938 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
1939
1940 // Closing the second socket should cause the stalled handle to finally get a
1941 // ConnectJob.
1942 handle2.socket()->Disconnect();
1943 handle2.Reset();
1944 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1945}
1946
1947// Test GetLoadState in the case the per-pool limit is reached.
1948TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
1949 CreatePool(2, 2);
1950 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1951
1952 ClientSocketHandle handle;
1953 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151954 int rv = handle.Init("a", params_, DEFAULT_PRIORITY,
1955 ClientSocketPool::RespectLimits::ENABLED,
1956 callback.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011957 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551958
1959 // Request for socket from another pool.
1960 ClientSocketHandle handle2;
1961 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:151962 rv = handle2.Init("b", params_, DEFAULT_PRIORITY,
1963 ClientSocketPool::RespectLimits::ENABLED,
1964 callback2.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011965 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551966
1967 // Request another socket from the first pool. Request should stall at the
1968 // socket pool limit.
1969 ClientSocketHandle handle3;
1970 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:151971 rv = handle3.Init("a", params_, DEFAULT_PRIORITY,
1972 ClientSocketPool::RespectLimits::ENABLED,
1973 callback2.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:011974 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551975
1976 // The third handle should remain stalled as the other sockets in its group
1977 // goes through the connect process.
1978
1979 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
1980 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
1981
1982 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
1983 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
1984 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
1985
1986 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:011987 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:551988 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
1989
1990 // Closing a socket should allow the stalled handle to finally get a new
1991 // ConnectJob.
1992 handle.socket()->Disconnect();
1993 handle.Reset();
1994 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:571995}
1996
[email protected]e772db3f2010-07-12 18:11:131997TEST_F(ClientSocketPoolBaseTest, Recoverable) {
1998 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1999 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2000
[email protected]2431756e2010-09-29 20:26:132001 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522002 TestCompletionCallback callback;
2003 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
mmenked3641e12016-01-28 16:06:152004 handle.Init("a", params_, DEFAULT_PRIORITY,
2005 ClientSocketPool::RespectLimits::ENABLED,
2006 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]2431756e2010-09-29 20:26:132007 EXPECT_TRUE(handle.is_initialized());
2008 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132009}
2010
2011TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2012 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2013
2014 connect_job_factory_->set_job_type(
2015 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132016 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522017 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132018 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152019 handle.Init("a", params_, DEFAULT_PRIORITY,
2020 ClientSocketPool::RespectLimits::ENABLED,
2021 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]2431756e2010-09-29 20:26:132022 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012023 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132024 EXPECT_TRUE(handle.is_initialized());
2025 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132026}
2027
[email protected]e60e47a2010-07-14 03:37:182028TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2029 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2030 connect_job_factory_->set_job_type(
2031 TestConnectJob::kMockAdditionalErrorStateJob);
2032
[email protected]2431756e2010-09-29 20:26:132033 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522034 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132035 EXPECT_EQ(ERR_CONNECTION_FAILED,
mmenked3641e12016-01-28 16:06:152036 handle.Init("a", params_, DEFAULT_PRIORITY,
2037 ClientSocketPool::RespectLimits::ENABLED,
2038 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]2431756e2010-09-29 20:26:132039 EXPECT_FALSE(handle.is_initialized());
2040 EXPECT_FALSE(handle.socket());
2041 EXPECT_TRUE(handle.is_ssl_error());
2042 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182043}
2044
2045TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2046 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2047
2048 connect_job_factory_->set_job_type(
2049 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132050 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522051 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132052 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152053 handle.Init("a", params_, DEFAULT_PRIORITY,
2054 ClientSocketPool::RespectLimits::ENABLED,
2055 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]2431756e2010-09-29 20:26:132056 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012057 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132058 EXPECT_FALSE(handle.is_initialized());
2059 EXPECT_FALSE(handle.socket());
2060 EXPECT_TRUE(handle.is_ssl_error());
2061 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182062}
2063
martijn003cd612016-05-19 22:24:382064// Make sure we can reuse sockets.
2065TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412066 CreatePoolWithIdleTimeouts(
2067 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032068 base::TimeDelta(), // Time out unused sockets immediately.
2069 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2070
2071 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2072
2073 ClientSocketHandle handle;
2074 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152075 int rv = handle.Init("a", params_, LOWEST,
2076 ClientSocketPool::RespectLimits::ENABLED,
2077 callback.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:012078 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032079 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012080 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032081
2082 // Use and release the socket.
2083 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]034df0f32013-01-07 23:17:482084 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032085 handle.Reset();
2086
2087 // Should now have one idle socket.
2088 ASSERT_EQ(1, pool_->IdleSocketCount());
2089
2090 // Request a new socket. This should reuse the old socket and complete
2091 // synchronously.
vishal.b62985ca92015-04-17 08:45:512092 BoundTestNetLog log;
mmenked3641e12016-01-28 16:06:152093 rv = handle.Init("a", params_, LOWEST,
2094 ClientSocketPool::RespectLimits::ENABLED,
2095 CompletionCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012096 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032097 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482098 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032099
2100 ASSERT_TRUE(pool_->HasGroup("a"));
2101 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2102 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2103
mmenke43758e62015-05-04 21:09:462104 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032105 log.GetEntries(&entries);
2106 EXPECT_TRUE(LogContainsEntryWithType(
2107 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
2108}
2109
blundellb8163592f2015-12-16 14:22:422110#if defined(OS_IOS)
2111// TODO(droger): Enable this test (crbug.com/512595).
martijn003cd612016-05-19 22:24:382112#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2113 DISABLED_CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422114#else
martijn003cd612016-05-19 22:24:382115#define MAYBE_CleanupTimedOutIdleSocketsNoReuse \
2116 CleanupTimedOutIdleSocketsNoReuse
blundellb8163592f2015-12-16 14:22:422117#endif
martijn003cd612016-05-19 22:24:382118// Make sure we cleanup old unused sockets.
2119TEST_F(ClientSocketPoolBaseTest, MAYBE_CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032120 CreatePoolWithIdleTimeouts(
2121 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2122 base::TimeDelta(), // Time out unused sockets immediately
2123 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412124
2125 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2126
2127 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2128
2129 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522130 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152131 int rv = handle.Init("a", params_, LOWEST,
2132 ClientSocketPool::RespectLimits::ENABLED,
2133 callback.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:012134 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412135 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2136
2137 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522138 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152139 rv = handle2.Init("a", params_, LOWEST,
2140 ClientSocketPool::RespectLimits::ENABLED,
2141 callback2.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:012142 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412143 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2144
2145 // Cancel one of the requests. Wait for the other, which will get the first
2146 // job. Release the socket. Run the loop again to make sure the second
2147 // socket is sitting idle and the first one is released (since ReleaseSocket()
2148 // just posts a DoReleaseSocket() task).
2149
2150 handle.Reset();
robpercival214763f2016-07-01 23:27:012151 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412152 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552153 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]64770b7d2011-11-16 04:30:412154 handle2.Reset();
2155
[email protected]e7b1c6d2c2012-05-05 00:54:032156 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2157 // actually become pending until 2ms after they have been created. In order
2158 // to flush all tasks, we need to wait so that we know there are no
2159 // soon-to-be-pending tasks waiting.
2160 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:282161 base::RunLoop().RunUntilIdle();
[email protected]64770b7d2011-11-16 04:30:412162
[email protected]e7b1c6d2c2012-05-05 00:54:032163 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412164 ASSERT_EQ(2, pool_->IdleSocketCount());
2165
2166 // Request a new socket. This should cleanup the unused and timed out ones.
2167 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512168 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522169 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152170 rv = handle.Init("a", params_, LOWEST,
2171 ClientSocketPool::RespectLimits::ENABLED,
2172 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012173 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2174 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412175 EXPECT_FALSE(handle.is_reused());
2176
[email protected]e7b1c6d2c2012-05-05 00:54:032177 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412178 ASSERT_TRUE(pool_->HasGroup("a"));
2179 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2180 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2181
mmenke43758e62015-05-04 21:09:462182 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412183 log.GetEntries(&entries);
2184 EXPECT_FALSE(LogContainsEntryWithType(
2185 entries, 1, NetLog::TYPE_SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
2186}
2187
[email protected]2041cf342010-02-19 03:15:592188// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162189// because of multiple releasing disconnected sockets.
2190TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2191 CreatePoolWithIdleTimeouts(
2192 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2193 base::TimeDelta(), // Time out unused sockets immediately.
2194 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2195
2196 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2197
2198 // Startup 4 connect jobs. Two of them will be pending.
2199
[email protected]2431756e2010-09-29 20:26:132200 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522201 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152202 int rv = handle.Init("a", params_, LOWEST,
2203 ClientSocketPool::RespectLimits::ENABLED,
2204 callback.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:012205 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162206
[email protected]2431756e2010-09-29 20:26:132207 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522208 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152209 rv = handle2.Init("a", params_, LOWEST,
2210 ClientSocketPool::RespectLimits::ENABLED,
2211 callback2.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:012212 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162213
[email protected]2431756e2010-09-29 20:26:132214 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522215 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152216 rv = handle3.Init("a", params_, LOWEST,
2217 ClientSocketPool::RespectLimits::ENABLED,
2218 callback3.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:012219 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162220
[email protected]2431756e2010-09-29 20:26:132221 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522222 TestCompletionCallback callback4;
mmenked3641e12016-01-28 16:06:152223 rv = handle4.Init("a", params_, LOWEST,
2224 ClientSocketPool::RespectLimits::ENABLED,
2225 callback4.callback(), pool_.get(), BoundNetLog());
robpercival214763f2016-07-01 23:27:012226 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162227
2228 // Release two disconnected sockets.
2229
[email protected]2431756e2010-09-29 20:26:132230 handle.socket()->Disconnect();
2231 handle.Reset();
2232 handle2.socket()->Disconnect();
2233 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162234
robpercival214763f2016-07-01 23:27:012235 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132236 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012237 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132238 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162239}
2240
[email protected]d7027bb2010-05-10 18:58:542241// Regression test for http://crbug.com/42267.
2242// When DoReleaseSocket() is processed for one socket, it is blocked because the
2243// other stalled groups all have releasing sockets, so no progress can be made.
2244TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2245 CreatePoolWithIdleTimeouts(
2246 4 /* socket limit */, 4 /* socket limit per group */,
2247 base::TimeDelta(), // Time out unused sockets immediately.
2248 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2249
2250 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2251
2252 // Max out the socket limit with 2 per group.
2253
[email protected]2431756e2010-09-29 20:26:132254 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522255 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132256 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522257 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542258
2259 for (int i = 0; i < 2; ++i) {
mmenked3641e12016-01-28 16:06:152260 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST,
2261 ClientSocketPool::RespectLimits::ENABLED,
2262 callback_a[i].callback(), pool_.get(),
[email protected]2431756e2010-09-29 20:26:132263 BoundNetLog()));
mmenked3641e12016-01-28 16:06:152264 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST,
2265 ClientSocketPool::RespectLimits::ENABLED,
2266 callback_b[i].callback(), pool_.get(),
[email protected]2431756e2010-09-29 20:26:132267 BoundNetLog()));
[email protected]d7027bb2010-05-10 18:58:542268 }
[email protected]b89f7e42010-05-20 20:37:002269
[email protected]d7027bb2010-05-10 18:58:542270 // Make 4 pending requests, 2 per group.
2271
2272 for (int i = 2; i < 4; ++i) {
mmenked3641e12016-01-28 16:06:152273 EXPECT_EQ(
2274 ERR_IO_PENDING,
2275 handle_a[i].Init("a", params_, LOWEST,
2276 ClientSocketPool::RespectLimits::ENABLED,
2277 callback_a[i].callback(), pool_.get(), BoundNetLog()));
2278 EXPECT_EQ(
2279 ERR_IO_PENDING,
2280 handle_b[i].Init("b", params_, LOWEST,
2281 ClientSocketPool::RespectLimits::ENABLED,
2282 callback_b[i].callback(), pool_.get(), BoundNetLog()));
[email protected]d7027bb2010-05-10 18:58:542283 }
2284
2285 // Release b's socket first. The order is important, because in
2286 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2287 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2288 // first, which has a releasing socket, so it refuses to start up another
2289 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132290 handle_b[0].socket()->Disconnect();
2291 handle_b[0].Reset();
2292 handle_a[0].socket()->Disconnect();
2293 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542294
2295 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282296 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542297
[email protected]2431756e2010-09-29 20:26:132298 handle_b[1].socket()->Disconnect();
2299 handle_b[1].Reset();
2300 handle_a[1].socket()->Disconnect();
2301 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542302
2303 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012304 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2305 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542306 }
2307}
2308
[email protected]fd4fe0b2010-02-08 23:02:152309TEST_F(ClientSocketPoolBaseTest,
2310 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2311 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2312
2313 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2314
robpercival214763f2016-07-01 23:27:012315 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2316 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2317 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2318 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152319
robpercival214763f2016-07-01 23:27:012320 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2321 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132322 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152323
2324 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132325 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012326 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152327
[email protected]2431756e2010-09-29 20:26:132328 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012329 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132330 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152331
2332 EXPECT_EQ(1, GetOrderOfRequest(1));
2333 EXPECT_EQ(2, GetOrderOfRequest(2));
2334 EXPECT_EQ(3, GetOrderOfRequest(3));
2335 EXPECT_EQ(4, GetOrderOfRequest(4));
2336
2337 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132338 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152339}
2340
[email protected]6ecf2b92011-12-15 01:14:522341class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042342 public:
[email protected]2431756e2010-09-29 20:26:132343 TestReleasingSocketRequest(TestClientSocketPool* pool,
2344 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182345 bool reset_releasing_handle)
2346 : pool_(pool),
2347 expected_result_(expected_result),
[email protected]6ecf2b92011-12-15 01:14:522348 reset_releasing_handle_(reset_releasing_handle),
[email protected]aa249b52013-04-30 01:04:322349 callback_(base::Bind(&TestReleasingSocketRequest::OnComplete,
2350 base::Unretained(this))) {
[email protected]6ecf2b92011-12-15 01:14:522351 }
2352
dchengb03027d2014-10-21 12:00:202353 ~TestReleasingSocketRequest() override {}
[email protected]4f1e4982010-03-02 18:31:042354
2355 ClientSocketHandle* handle() { return &handle_; }
2356
[email protected]6ecf2b92011-12-15 01:14:522357 const CompletionCallback& callback() const { return callback_; }
[email protected]4f1e4982010-03-02 18:31:042358
2359 private:
[email protected]6ecf2b92011-12-15 01:14:522360 void OnComplete(int result) {
2361 SetResult(result);
2362 if (reset_releasing_handle_)
2363 handle_.Reset();
2364
mmenked3641e12016-01-28 16:06:152365 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
[email protected]6ecf2b92011-12-15 01:14:522366 EXPECT_EQ(expected_result_,
[email protected]bb1c4662013-11-14 00:00:072367 handle2_.Init("a", con_params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:152368 ClientSocketPool::RespectLimits::ENABLED,
[email protected]6ecf2b92011-12-15 01:14:522369 callback2_.callback(), pool_, BoundNetLog()));
2370 }
2371
[email protected]2431756e2010-09-29 20:26:132372 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182373 int expected_result_;
2374 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042375 ClientSocketHandle handle_;
2376 ClientSocketHandle handle2_;
[email protected]6ecf2b92011-12-15 01:14:522377 CompletionCallback callback_;
2378 TestCompletionCallback callback2_;
[email protected]4f1e4982010-03-02 18:31:042379};
2380
[email protected]e60e47a2010-07-14 03:37:182381
2382TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2383 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2384
robpercival214763f2016-07-01 23:27:012385 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2386 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2387 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182388
[email protected]2431756e2010-09-29 20:26:132389 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182390 client_socket_factory_.allocation_count());
2391
2392 connect_job_factory_->set_job_type(
2393 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2394 TestReleasingSocketRequest req(pool_.get(), OK, false);
[email protected]2431756e2010-09-29 20:26:132395 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152396 req.handle()->Init("a", params_, DEFAULT_PRIORITY,
2397 ClientSocketPool::RespectLimits::ENABLED,
2398 req.callback(), pool_.get(), BoundNetLog()));
[email protected]e60e47a2010-07-14 03:37:182399 // The next job should complete synchronously
2400 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2401
robpercival214763f2016-07-01 23:27:012402 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182403 EXPECT_FALSE(req.handle()->is_initialized());
2404 EXPECT_FALSE(req.handle()->socket());
2405 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432406 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182407}
2408
[email protected]b6501d3d2010-06-03 23:53:342409// http://crbug.com/44724 regression test.
2410// We start releasing the pool when we flush on network change. When that
2411// happens, the only active references are in the ClientSocketHandles. When a
2412// ConnectJob completes and calls back into the last ClientSocketHandle, that
2413// callback can release the last reference and delete the pool. After the
2414// callback finishes, we go back to the stack frame within the now-deleted pool.
2415// Executing any code that refers to members of the now-deleted pool can cause
2416// crashes.
2417TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2418 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2419 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2420
2421 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522422 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152423 EXPECT_EQ(ERR_IO_PENDING,
2424 handle.Init("a", params_, DEFAULT_PRIORITY,
2425 ClientSocketPool::RespectLimits::ENABLED,
2426 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]b6501d3d2010-06-03 23:53:342427
[email protected]7af985a2012-12-14 22:40:422428 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342429
2430 // We'll call back into this now.
2431 callback.WaitForResult();
2432}
2433
[email protected]a7e38572010-06-07 18:22:242434TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2435 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2436 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2437
2438 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522439 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152440 EXPECT_EQ(ERR_IO_PENDING,
2441 handle.Init("a", params_, DEFAULT_PRIORITY,
2442 ClientSocketPool::RespectLimits::ENABLED,
2443 callback.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:012444 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242445 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2446
[email protected]7af985a2012-12-14 22:40:422447 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242448
2449 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282450 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242451
mmenked3641e12016-01-28 16:06:152452 EXPECT_EQ(ERR_IO_PENDING,
2453 handle.Init("a", params_, DEFAULT_PRIORITY,
2454 ClientSocketPool::RespectLimits::ENABLED,
2455 callback.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:012456 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242457 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2458}
2459
[email protected]6ecf2b92011-12-15 01:14:522460class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142461 public:
2462 ConnectWithinCallback(
2463 const std::string& group_name,
2464 const scoped_refptr<TestSocketParams>& params,
[email protected]2431756e2010-09-29 20:26:132465 TestClientSocketPool* pool)
[email protected]6ecf2b92011-12-15 01:14:522466 : group_name_(group_name),
2467 params_(params),
2468 pool_(pool),
[email protected]aa249b52013-04-30 01:04:322469 callback_(base::Bind(&ConnectWithinCallback::OnComplete,
2470 base::Unretained(this))) {
[email protected]06f92462010-08-31 19:24:142471 }
2472
dchengb03027d2014-10-21 12:00:202473 ~ConnectWithinCallback() override {}
[email protected]06f92462010-08-31 19:24:142474
2475 int WaitForNestedResult() {
2476 return nested_callback_.WaitForResult();
2477 }
2478
[email protected]6ecf2b92011-12-15 01:14:522479 const CompletionCallback& callback() const { return callback_; }
2480
[email protected]06f92462010-08-31 19:24:142481 private:
[email protected]6ecf2b92011-12-15 01:14:522482 void OnComplete(int result) {
2483 SetResult(result);
2484 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152485 handle_.Init(group_name_, params_, DEFAULT_PRIORITY,
2486 ClientSocketPool::RespectLimits::ENABLED,
2487 nested_callback_.callback(), pool_, BoundNetLog()));
[email protected]6ecf2b92011-12-15 01:14:522488 }
2489
[email protected]06f92462010-08-31 19:24:142490 const std::string group_name_;
2491 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132492 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142493 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522494 CompletionCallback callback_;
2495 TestCompletionCallback nested_callback_;
2496
2497 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142498};
2499
2500TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2501 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2502
2503 // First job will be waiting until it gets aborted.
2504 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2505
2506 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132507 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152508 EXPECT_EQ(ERR_IO_PENDING,
2509 handle.Init("a", params_, DEFAULT_PRIORITY,
2510 ClientSocketPool::RespectLimits::ENABLED,
2511 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]06f92462010-08-31 19:24:142512
2513 // Second job will be started during the first callback, and will
2514 // asynchronously complete with OK.
2515 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422516 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012517 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2518 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142519}
2520
[email protected]25eea382010-07-10 23:55:262521// Cancel a pending socket request while we're at max sockets,
2522// and verify that the backup socket firing doesn't cause a crash.
2523TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2524 // Max 4 sockets globally, max 4 sockets per group.
2525 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222526 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262527
[email protected]4baaf9d2010-08-31 15:15:442528 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2529 // timer.
[email protected]25eea382010-07-10 23:55:262530 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2531 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522532 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152533 EXPECT_EQ(ERR_IO_PENDING,
2534 handle.Init("bar", params_, DEFAULT_PRIORITY,
2535 ClientSocketPool::RespectLimits::ENABLED,
2536 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]25eea382010-07-10 23:55:262537
2538 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2539 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2540 ClientSocketHandle handles[kDefaultMaxSockets];
2541 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522542 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152543 EXPECT_EQ(OK,
2544 handles[i].Init("bar", params_, DEFAULT_PRIORITY,
2545 ClientSocketPool::RespectLimits::ENABLED,
2546 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]25eea382010-07-10 23:55:262547 }
2548
fdoray5eeb7642016-06-22 16:11:282549 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262550
2551 // Cancel the pending request.
2552 handle.Reset();
2553
2554 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002555 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2556 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262557
fdoray5eeb7642016-06-22 16:11:282558 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262559 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2560}
2561
[email protected]3f00be82010-09-27 19:50:022562TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442563 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2564 pool_->EnableConnectBackupJobs();
2565
2566 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2567 // timer.
2568 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2569 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522570 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152571 EXPECT_EQ(ERR_IO_PENDING,
2572 handle.Init("bar", params_, DEFAULT_PRIORITY,
2573 ClientSocketPool::RespectLimits::ENABLED,
2574 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]4baaf9d2010-08-31 15:15:442575 ASSERT_TRUE(pool_->HasGroup("bar"));
2576 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102577 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442578
2579 // Cancel the socket request. This should cancel the backup timer. Wait for
2580 // the backup time to see if it indeed got canceled.
2581 handle.Reset();
2582 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002583 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2584 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282585 base::RunLoop().RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442586 ASSERT_TRUE(pool_->HasGroup("bar"));
2587 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2588}
2589
[email protected]3f00be82010-09-27 19:50:022590TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2591 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2592 pool_->EnableConnectBackupJobs();
2593
2594 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2595 // timer.
2596 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2597 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522598 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152599 EXPECT_EQ(ERR_IO_PENDING,
2600 handle.Init("bar", params_, DEFAULT_PRIORITY,
2601 ClientSocketPool::RespectLimits::ENABLED,
2602 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]3f00be82010-09-27 19:50:022603 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2604 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522605 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152606 EXPECT_EQ(ERR_IO_PENDING,
2607 handle2.Init("bar", params_, DEFAULT_PRIORITY,
2608 ClientSocketPool::RespectLimits::ENABLED,
2609 callback2.callback(), pool_.get(), BoundNetLog()));
[email protected]3f00be82010-09-27 19:50:022610 ASSERT_TRUE(pool_->HasGroup("bar"));
2611 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2612
2613 // Cancel request 1 and then complete request 2. With the requests finished,
2614 // the backup timer should be cancelled.
2615 handle.Reset();
robpercival214763f2016-07-01 23:27:012616 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022617 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002618 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2619 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282620 base::RunLoop().RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022621}
2622
[email protected]eb5a99382010-07-11 03:18:262623// Test delayed socket binding for the case where we have two connects,
2624// and while one is waiting on a connect, the other frees up.
2625// The socket waiting on a connect should switch immediately to the freed
2626// up socket.
2627TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2628 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2629 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2630
2631 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522632 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132633 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152634 handle1.Init("a", params_, DEFAULT_PRIORITY,
2635 ClientSocketPool::RespectLimits::ENABLED,
2636 callback.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:012637 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262638
2639 // No idle sockets, no pending jobs.
2640 EXPECT_EQ(0, pool_->IdleSocketCount());
2641 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2642
2643 // Create a second socket to the same host, but this one will wait.
2644 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2645 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132646 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152647 handle2.Init("a", params_, DEFAULT_PRIORITY,
2648 ClientSocketPool::RespectLimits::ENABLED,
2649 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:262650 // No idle sockets, and one connecting job.
2651 EXPECT_EQ(0, pool_->IdleSocketCount());
2652 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2653
2654 // Return the first handle to the pool. This will initiate the delayed
2655 // binding.
2656 handle1.Reset();
2657
fdoray5eeb7642016-06-22 16:11:282658 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262659
2660 // Still no idle sockets, still one pending connect job.
2661 EXPECT_EQ(0, pool_->IdleSocketCount());
2662 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2663
2664 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012665 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262666
2667 // And we can see there is still one job waiting.
2668 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2669
2670 // Finally, signal the waiting Connect.
2671 client_socket_factory_.SignalJobs();
2672 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2673
fdoray5eeb7642016-06-22 16:11:282674 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262675}
2676
2677// Test delayed socket binding when a group is at capacity and one
2678// of the group's sockets frees up.
2679TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2680 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2681 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2682
2683 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522684 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132685 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152686 handle1.Init("a", params_, DEFAULT_PRIORITY,
2687 ClientSocketPool::RespectLimits::ENABLED,
2688 callback.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:012689 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262690
2691 // No idle sockets, no pending jobs.
2692 EXPECT_EQ(0, pool_->IdleSocketCount());
2693 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2694
2695 // Create a second socket to the same host, but this one will wait.
2696 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2697 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132698 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152699 handle2.Init("a", params_, DEFAULT_PRIORITY,
2700 ClientSocketPool::RespectLimits::ENABLED,
2701 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:262702 // No idle sockets, and one connecting job.
2703 EXPECT_EQ(0, pool_->IdleSocketCount());
2704 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2705
2706 // Return the first handle to the pool. This will initiate the delayed
2707 // binding.
2708 handle1.Reset();
2709
fdoray5eeb7642016-06-22 16:11:282710 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262711
2712 // Still no idle sockets, still one pending connect job.
2713 EXPECT_EQ(0, pool_->IdleSocketCount());
2714 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2715
2716 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012717 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262718
2719 // And we can see there is still one job waiting.
2720 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2721
2722 // Finally, signal the waiting Connect.
2723 client_socket_factory_.SignalJobs();
2724 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2725
fdoray5eeb7642016-06-22 16:11:282726 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262727}
2728
2729// Test out the case where we have one socket connected, one
2730// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512731// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262732// should complete, by taking the first socket's idle socket.
2733TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2734 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2735 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2736
2737 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522738 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132739 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152740 handle1.Init("a", params_, DEFAULT_PRIORITY,
2741 ClientSocketPool::RespectLimits::ENABLED,
2742 callback.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:012743 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262744
2745 // No idle sockets, no pending jobs.
2746 EXPECT_EQ(0, pool_->IdleSocketCount());
2747 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2748
2749 // Create a second socket to the same host, but this one will wait.
2750 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2751 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132752 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152753 handle2.Init("a", params_, DEFAULT_PRIORITY,
2754 ClientSocketPool::RespectLimits::ENABLED,
2755 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]eb5a99382010-07-11 03:18:262756 // No idle sockets, and one connecting job.
2757 EXPECT_EQ(0, pool_->IdleSocketCount());
2758 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2759
2760 // Return the first handle to the pool. This will initiate the delayed
2761 // binding.
2762 handle1.Reset();
2763
fdoray5eeb7642016-06-22 16:11:282764 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262765
2766 // Still no idle sockets, still one pending connect job.
2767 EXPECT_EQ(0, pool_->IdleSocketCount());
2768 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2769
2770 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012771 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262772
2773 // And we can see there is still one job waiting.
2774 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2775
2776 // Finally, signal the waiting Connect.
2777 client_socket_factory_.SignalJobs();
2778 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2779
fdoray5eeb7642016-06-22 16:11:282780 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262781}
2782
[email protected]2abfe90a2010-08-25 17:49:512783// Cover the case where on an available socket slot, we have one pending
2784// request that completes synchronously, thereby making the Group empty.
2785TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
2786 const int kUnlimitedSockets = 100;
2787 const int kOneSocketPerGroup = 1;
2788 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
2789
2790 // Make the first request asynchronous fail.
2791 // This will free up a socket slot later.
2792 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2793
2794 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522795 TestCompletionCallback callback1;
[email protected]2431756e2010-09-29 20:26:132796 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152797 handle1.Init("a", params_, DEFAULT_PRIORITY,
2798 ClientSocketPool::RespectLimits::ENABLED,
2799 callback1.callback(), pool_.get(), BoundNetLog()));
[email protected]2abfe90a2010-08-25 17:49:512800 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2801
2802 // Make the second request synchronously fail. This should make the Group
2803 // empty.
2804 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
2805 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522806 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:512807 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
2808 // when created.
[email protected]2431756e2010-09-29 20:26:132809 EXPECT_EQ(ERR_IO_PENDING,
mmenked3641e12016-01-28 16:06:152810 handle2.Init("a", params_, DEFAULT_PRIORITY,
2811 ClientSocketPool::RespectLimits::ENABLED,
2812 callback2.callback(), pool_.get(), BoundNetLog()));
[email protected]2abfe90a2010-08-25 17:49:512813
2814 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2815
robpercival214763f2016-07-01 23:27:012816 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2817 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:512818 EXPECT_FALSE(pool_->HasGroup("a"));
2819}
2820
[email protected]e1b54dc2010-10-06 21:27:222821TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
2822 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2823
2824 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2825
2826 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522827 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:152828 EXPECT_EQ(ERR_IO_PENDING,
2829 handle1.Init("a", params_, DEFAULT_PRIORITY,
2830 ClientSocketPool::RespectLimits::ENABLED,
2831 callback1.callback(), pool_.get(), BoundNetLog()));
[email protected]e1b54dc2010-10-06 21:27:222832
2833 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522834 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152835 EXPECT_EQ(ERR_IO_PENDING,
2836 handle2.Init("a", params_, DEFAULT_PRIORITY,
2837 ClientSocketPool::RespectLimits::ENABLED,
2838 callback2.callback(), pool_.get(), BoundNetLog()));
[email protected]e1b54dc2010-10-06 21:27:222839 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522840 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152841 EXPECT_EQ(ERR_IO_PENDING,
2842 handle3.Init("a", params_, DEFAULT_PRIORITY,
2843 ClientSocketPool::RespectLimits::ENABLED,
2844 callback3.callback(), pool_.get(), BoundNetLog()));
[email protected]e1b54dc2010-10-06 21:27:222845
robpercival214763f2016-07-01 23:27:012846 EXPECT_THAT(callback1.WaitForResult(), IsOk());
2847 EXPECT_THAT(callback2.WaitForResult(), IsOk());
2848 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:222849
2850 // Use the socket.
[email protected]83039bb2011-12-09 18:43:552851 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionCallback()));
2852 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionCallback()));
[email protected]e1b54dc2010-10-06 21:27:222853
2854 handle1.Reset();
2855 handle2.Reset();
2856 handle3.Reset();
2857
mmenked3641e12016-01-28 16:06:152858 EXPECT_EQ(OK, handle1.Init("a", params_, DEFAULT_PRIORITY,
2859 ClientSocketPool::RespectLimits::ENABLED,
2860 callback1.callback(), pool_.get(), BoundNetLog()));
2861 EXPECT_EQ(OK, handle2.Init("a", params_, DEFAULT_PRIORITY,
2862 ClientSocketPool::RespectLimits::ENABLED,
2863 callback2.callback(), pool_.get(), BoundNetLog()));
2864 EXPECT_EQ(OK, handle3.Init("a", params_, DEFAULT_PRIORITY,
2865 ClientSocketPool::RespectLimits::ENABLED,
2866 callback3.callback(), pool_.get(), BoundNetLog()));
[email protected]e1b54dc2010-10-06 21:27:222867
2868 EXPECT_TRUE(handle1.socket()->WasEverUsed());
2869 EXPECT_TRUE(handle2.socket()->WasEverUsed());
2870 EXPECT_FALSE(handle3.socket()->WasEverUsed());
2871}
2872
[email protected]2c2bef152010-10-13 00:55:032873TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
2874 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2875 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2876
2877 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
2878
2879 ASSERT_TRUE(pool_->HasGroup("a"));
2880 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102881 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032882 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2883
2884 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522885 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:152886 EXPECT_EQ(ERR_IO_PENDING,
2887 handle1.Init("a", params_, DEFAULT_PRIORITY,
2888 ClientSocketPool::RespectLimits::ENABLED,
2889 callback1.callback(), pool_.get(), BoundNetLog()));
[email protected]2c2bef152010-10-13 00:55:032890
2891 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522892 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152893 EXPECT_EQ(ERR_IO_PENDING,
2894 handle2.Init("a", params_, DEFAULT_PRIORITY,
2895 ClientSocketPool::RespectLimits::ENABLED,
2896 callback2.callback(), pool_.get(), BoundNetLog()));
[email protected]2c2bef152010-10-13 00:55:032897
2898 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102899 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032900 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2901
robpercival214763f2016-07-01 23:27:012902 EXPECT_THAT(callback1.WaitForResult(), IsOk());
2903 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:032904 handle1.Reset();
2905 handle2.Reset();
2906
2907 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102908 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032909 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
2910}
2911
2912TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
2913 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2914 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2915
2916 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522917 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:152918 EXPECT_EQ(ERR_IO_PENDING,
2919 handle1.Init("a", params_, DEFAULT_PRIORITY,
2920 ClientSocketPool::RespectLimits::ENABLED,
2921 callback1.callback(), pool_.get(), BoundNetLog()));
[email protected]2c2bef152010-10-13 00:55:032922
2923 ASSERT_TRUE(pool_->HasGroup("a"));
2924 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102925 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032926 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2927
2928 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
2929
2930 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102931 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032932 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2933
2934 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522935 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152936 EXPECT_EQ(ERR_IO_PENDING,
2937 handle2.Init("a", params_, DEFAULT_PRIORITY,
2938 ClientSocketPool::RespectLimits::ENABLED,
2939 callback2.callback(), pool_.get(), BoundNetLog()));
[email protected]2c2bef152010-10-13 00:55:032940
2941 EXPECT_EQ(2, 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
robpercival214763f2016-07-01 23:27:012945 EXPECT_THAT(callback1.WaitForResult(), IsOk());
2946 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:032947 handle1.Reset();
2948 handle2.Reset();
2949
2950 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102951 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032952 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
2953}
2954
2955TEST_F(ClientSocketPoolBaseTest,
2956 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
2957 CreatePool(4, 4);
2958 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2959
2960 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522961 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:152962 EXPECT_EQ(ERR_IO_PENDING,
2963 handle1.Init("a", params_, DEFAULT_PRIORITY,
2964 ClientSocketPool::RespectLimits::ENABLED,
2965 callback1.callback(), pool_.get(), BoundNetLog()));
[email protected]2c2bef152010-10-13 00:55:032966
2967 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522968 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:152969 EXPECT_EQ(ERR_IO_PENDING,
2970 handle2.Init("a", params_, DEFAULT_PRIORITY,
2971 ClientSocketPool::RespectLimits::ENABLED,
2972 callback2.callback(), pool_.get(), BoundNetLog()));
[email protected]2c2bef152010-10-13 00:55:032973
2974 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522975 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:152976 EXPECT_EQ(ERR_IO_PENDING,
2977 handle3.Init("a", params_, DEFAULT_PRIORITY,
2978 ClientSocketPool::RespectLimits::ENABLED,
2979 callback3.callback(), pool_.get(), BoundNetLog()));
[email protected]2c2bef152010-10-13 00:55:032980
2981 ASSERT_TRUE(pool_->HasGroup("a"));
2982 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102983 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032984 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2985
2986 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
2987
2988 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:102989 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:032990 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2991
robpercival214763f2016-07-01 23:27:012992 EXPECT_THAT(callback1.WaitForResult(), IsOk());
2993 EXPECT_THAT(callback2.WaitForResult(), IsOk());
2994 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:032995 handle1.Reset();
2996 handle2.Reset();
2997 handle3.Reset();
2998
2999 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103000 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033001 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3002}
3003
3004TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3005 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3006 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3007
3008 ASSERT_FALSE(pool_->HasGroup("a"));
3009
3010 pool_->RequestSockets("a", &params_, kDefaultMaxSockets,
3011 BoundNetLog());
3012
3013 ASSERT_TRUE(pool_->HasGroup("a"));
3014 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103015 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033016
3017 ASSERT_FALSE(pool_->HasGroup("b"));
3018
3019 pool_->RequestSockets("b", &params_, kDefaultMaxSockets,
3020 BoundNetLog());
3021
3022 ASSERT_FALSE(pool_->HasGroup("b"));
3023}
3024
3025TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3026 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3027 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3028
3029 ASSERT_FALSE(pool_->HasGroup("a"));
3030
3031 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
3032 BoundNetLog());
3033
3034 ASSERT_TRUE(pool_->HasGroup("a"));
3035 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103036 EXPECT_EQ(kDefaultMaxSockets - 1,
3037 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483038 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033039
3040 ASSERT_FALSE(pool_->HasGroup("b"));
3041
3042 pool_->RequestSockets("b", &params_, kDefaultMaxSockets,
3043 BoundNetLog());
3044
3045 ASSERT_TRUE(pool_->HasGroup("b"));
3046 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483047 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033048}
3049
3050TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3051 CreatePool(4, 4);
3052 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3053
3054 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523055 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:153056 EXPECT_EQ(ERR_IO_PENDING,
3057 handle1.Init("a", params_, DEFAULT_PRIORITY,
3058 ClientSocketPool::RespectLimits::ENABLED,
3059 callback1.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:013060 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033061 handle1.Reset();
3062
3063 ASSERT_TRUE(pool_->HasGroup("a"));
3064 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103065 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033066 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3067
3068 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3069
3070 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103071 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033072 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3073}
3074
3075TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3076 CreatePool(4, 4);
3077 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3078
3079 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523080 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:153081 EXPECT_EQ(ERR_IO_PENDING,
3082 handle1.Init("a", params_, DEFAULT_PRIORITY,
3083 ClientSocketPool::RespectLimits::ENABLED,
3084 callback1.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:013085 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033086
3087 ASSERT_TRUE(pool_->HasGroup("a"));
3088 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103089 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033090 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3091 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3092
3093 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3094
3095 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103096 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033097 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3098 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3099}
3100
3101TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3102 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3103 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3104
3105 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
3106 BoundNetLog());
3107
3108 ASSERT_TRUE(pool_->HasGroup("a"));
3109 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103110 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033111 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3112
3113 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
3114 BoundNetLog());
3115
3116 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103117 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033118 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3119}
3120
[email protected]3c819f522010-12-02 02:03:123121TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3122 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3123 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3124
3125 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
3126 BoundNetLog());
3127
3128 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523129
3130 connect_job_factory_->set_job_type(
3131 TestConnectJob::kMockAdditionalErrorStateJob);
3132 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
3133 BoundNetLog());
3134
3135 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123136}
3137
[email protected]8159a1c2012-06-07 00:00:103138TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033139 CreatePool(4, 4);
3140 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3141
3142 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3143
3144 ASSERT_TRUE(pool_->HasGroup("a"));
3145 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103146 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033147 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3148
3149 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3150 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103151 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033152 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3153
3154 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523155 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:153156 EXPECT_EQ(ERR_IO_PENDING,
3157 handle1.Init("a", params_, DEFAULT_PRIORITY,
3158 ClientSocketPool::RespectLimits::ENABLED,
3159 callback1.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:013160 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033161
3162 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523163 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153164 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY,
3165 ClientSocketPool::RespectLimits::ENABLED,
3166 callback2.callback(), pool_.get(), BoundNetLog());
[email protected]2c2bef152010-10-13 00:55:033167 if (rv != OK) {
robpercival214763f2016-07-01 23:27:013168 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3169 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033170 }
3171
[email protected]8159a1c2012-06-07 00:00:103172 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3173 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3174 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3175 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3176
[email protected]2c2bef152010-10-13 00:55:033177 handle1.Reset();
3178 handle2.Reset();
3179
[email protected]8159a1c2012-06-07 00:00:103180 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3181 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033182 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3183
3184 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3185 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103186 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033187 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3188}
3189
3190TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3191 CreatePool(4, 4);
3192 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3193
3194 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3195
3196 ASSERT_TRUE(pool_->HasGroup("a"));
3197 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103198 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033199 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3200
3201 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3202 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103203 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033204 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3205
3206 pool_->RequestSockets("a", &params_, 3, BoundNetLog());
3207 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103208 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033209 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3210
3211 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3212 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103213 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033214 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3215}
3216
3217TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3218 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3219 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3220
3221 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3222
3223 ASSERT_TRUE(pool_->HasGroup("a"));
3224 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103225 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033226 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3227
3228 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523229 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:153230 EXPECT_EQ(ERR_IO_PENDING,
3231 handle1.Init("a", params_, DEFAULT_PRIORITY,
3232 ClientSocketPool::RespectLimits::ENABLED,
3233 callback1.callback(), pool_.get(), BoundNetLog()));
[email protected]2c2bef152010-10-13 00:55:033234
3235 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103236 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033237 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3238
robpercival214763f2016-07-01 23:27:013239 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033240
[email protected]0dc88b32014-03-26 20:12:283241 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483242 // starts, it has a connect start time.
3243 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033244 handle1.Reset();
3245
3246 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3247}
3248
[email protected]034df0f32013-01-07 23:17:483249// Checks that fully connected preconnect jobs have no connect times, and are
3250// marked as reused.
3251TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3252 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3253 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3254 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3255
3256 ASSERT_TRUE(pool_->HasGroup("a"));
3257 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3258 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3259 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3260
3261 ClientSocketHandle handle;
3262 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153263 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY,
3264 ClientSocketPool::RespectLimits::ENABLED,
3265 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]034df0f32013-01-07 23:17:483266
3267 // Make sure the idle socket was used.
3268 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3269
3270 TestLoadTimingInfoConnectedReused(handle);
3271 handle.Reset();
3272 TestLoadTimingInfoNotConnected(handle);
3273}
3274
[email protected]dcbe168a2010-12-02 03:14:463275// http://crbug.com/64940 regression test.
3276TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3277 const int kMaxTotalSockets = 3;
3278 const int kMaxSocketsPerGroup = 2;
3279 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3280 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3281
3282 // Note that group name ordering matters here. "a" comes before "b", so
3283 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3284
3285 // Set up one idle socket in "a".
3286 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523287 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:153288 EXPECT_EQ(ERR_IO_PENDING,
3289 handle1.Init("a", params_, DEFAULT_PRIORITY,
3290 ClientSocketPool::RespectLimits::ENABLED,
3291 callback1.callback(), pool_.get(), BoundNetLog()));
[email protected]dcbe168a2010-12-02 03:14:463292
robpercival214763f2016-07-01 23:27:013293 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463294 handle1.Reset();
3295 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3296
3297 // Set up two active sockets in "b".
3298 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523299 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153300 EXPECT_EQ(ERR_IO_PENDING,
3301 handle1.Init("b", params_, DEFAULT_PRIORITY,
3302 ClientSocketPool::RespectLimits::ENABLED,
3303 callback1.callback(), pool_.get(), BoundNetLog()));
3304 EXPECT_EQ(ERR_IO_PENDING,
3305 handle2.Init("b", params_, DEFAULT_PRIORITY,
3306 ClientSocketPool::RespectLimits::ENABLED,
3307 callback2.callback(), pool_.get(), BoundNetLog()));
[email protected]dcbe168a2010-12-02 03:14:463308
robpercival214763f2016-07-01 23:27:013309 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3310 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463311 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103312 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463313 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3314
3315 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3316 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3317 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3318 // sockets for "a", and "b" should still have 2 active sockets.
3319
3320 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3321 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103322 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463323 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3324 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3325 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103326 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463327 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3328 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3329
3330 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3331 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3332 // "a" should result in closing 1 for "b".
3333 handle1.Reset();
3334 handle2.Reset();
3335 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3336 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3337
3338 pool_->RequestSockets("a", &params_, 2, BoundNetLog());
3339 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103340 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463341 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3342 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3343 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103344 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463345 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3346 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3347}
3348
[email protected]b7b8be42011-07-12 12:46:413349TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073350 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3351 pool_->EnableConnectBackupJobs();
3352
3353 // Make the ConnectJob hang until it times out, shorten the timeout.
3354 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3355 connect_job_factory_->set_timeout_duration(
3356 base::TimeDelta::FromMilliseconds(500));
3357 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3358 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103359 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073360 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073361
[email protected]b7b8be42011-07-12 12:46:413362 // Verify the backup timer doesn't create a backup job, by making
3363 // the backup job a pending job instead of a waiting job, so it
3364 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073365 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453366 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
ki.stfu375812e2015-10-09 20:23:173367 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
[email protected]2da659e2013-05-23 20:51:343368 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283369 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073370 EXPECT_FALSE(pool_->HasGroup("a"));
3371}
3372
[email protected]b7b8be42011-07-12 12:46:413373TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073374 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3375 pool_->EnableConnectBackupJobs();
3376
3377 // Make the ConnectJob hang forever.
3378 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3379 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3380 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103381 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073382 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283383 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073384
3385 // Make the backup job be a pending job, so it completes normally.
3386 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3387 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523388 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153389 EXPECT_EQ(ERR_IO_PENDING,
3390 handle.Init("a", params_, DEFAULT_PRIORITY,
3391 ClientSocketPool::RespectLimits::ENABLED,
3392 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]b7b8be42011-07-12 12:46:413393 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073394 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103395 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073396 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3397 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013398 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073399
3400 // The hung connect job should still be there, but everything else should be
3401 // complete.
3402 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103403 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073404 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3405 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3406}
3407
[email protected]0dc88b32014-03-26 20:12:283408// Tests that a preconnect that starts out with unread data can still be used.
3409// http://crbug.com/334467
3410TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3411 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3412 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3413
3414 pool_->RequestSockets("a", &params_, 1, BoundNetLog());
3415
3416 ASSERT_TRUE(pool_->HasGroup("a"));
3417 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3418 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3419 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3420
3421 // Fail future jobs to be sure that handle receives the preconnected socket
3422 // rather than closing it and making a new one.
3423 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3424 ClientSocketHandle handle;
3425 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153426 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY,
3427 ClientSocketPool::RespectLimits::ENABLED,
3428 callback.callback(), pool_.get(), BoundNetLog()));
[email protected]0dc88b32014-03-26 20:12:283429
3430 ASSERT_TRUE(pool_->HasGroup("a"));
3431 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3432 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3433 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3434
3435 // Drain the pending read.
3436 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionCallback()));
3437
3438 TestLoadTimingInfoConnectedReused(handle);
3439 handle.Reset();
3440
3441 // The socket should be usable now that it's idle again.
3442 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3443}
3444
[email protected]043b68c82013-08-22 23:41:523445class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203446 public:
3447 MockLayeredPool(TestClientSocketPool* pool,
3448 const std::string& group_name)
3449 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203450 group_name_(group_name),
3451 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523452 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203453 }
3454
3455 ~MockLayeredPool() {
[email protected]043b68c82013-08-22 23:41:523456 pool_->RemoveHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203457 }
3458
3459 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153460 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073461 return handle_.Init(group_name_, params, DEFAULT_PRIORITY,
mmenked3641e12016-01-28 16:06:153462 ClientSocketPool::RespectLimits::ENABLED,
[email protected]58e562f2013-04-22 17:32:203463 callback_.callback(), pool, BoundNetLog());
3464 }
3465
3466 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153467 scoped_refptr<TestSocketParams> params(new TestSocketParams());
[email protected]bb1c4662013-11-14 00:00:073468 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:153469 ClientSocketPool::RespectLimits::DISABLED,
[email protected]58e562f2013-04-22 17:32:203470 callback_.callback(), pool, BoundNetLog());
3471 }
3472
3473 bool ReleaseOneConnection() {
3474 if (!handle_.is_initialized() || !can_release_connection_) {
3475 return false;
3476 }
3477 handle_.socket()->Disconnect();
3478 handle_.Reset();
3479 return true;
3480 }
3481
3482 void set_can_release_connection(bool can_release_connection) {
3483 can_release_connection_ = can_release_connection;
3484 }
3485
3486 MOCK_METHOD0(CloseOneIdleConnection, bool());
3487
3488 private:
3489 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203490 ClientSocketHandle handle_;
3491 TestCompletionCallback callback_;
3492 const std::string group_name_;
3493 bool can_release_connection_;
3494};
3495
3496TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3497 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3498 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3499
3500 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013501 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203502 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3503 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523504 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203505}
3506
3507TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
3508 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3509 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3510
3511 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013512 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203513 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3514 .WillOnce(Invoke(&mock_layered_pool,
3515 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523516 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203517}
3518
3519// Tests the basic case of closing an idle socket in a higher layered pool when
3520// a new request is issued and the lower layer pool is stalled.
3521TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3522 CreatePool(1, 1);
3523 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3524
3525 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013526 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203527 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3528 .WillOnce(Invoke(&mock_layered_pool,
3529 &MockLayeredPool::ReleaseOneConnection));
3530 ClientSocketHandle handle;
3531 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153532 EXPECT_EQ(ERR_IO_PENDING,
3533 handle.Init("a", params_, DEFAULT_PRIORITY,
3534 ClientSocketPool::RespectLimits::ENABLED,
3535 callback.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:013536 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203537}
3538
3539// Same as above, but the idle socket is in the same group as the stalled
3540// socket, and closes the only other request in its group when closing requests
3541// in higher layered pools. This generally shouldn't happen, but it may be
3542// possible if a higher level pool issues a request and the request is
3543// subsequently cancelled. Even if it's not possible, best not to crash.
3544TEST_F(ClientSocketPoolBaseTest,
3545 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3546 CreatePool(2, 2);
3547 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3548
3549 // Need a socket in another group for the pool to be stalled (If a group
3550 // has the maximum number of connections already, it's not stalled).
3551 ClientSocketHandle handle1;
3552 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:153553 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3554 ClientSocketPool::RespectLimits::ENABLED,
3555 callback1.callback(), pool_.get(), BoundNetLog()));
[email protected]58e562f2013-04-22 17:32:203556
3557 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013558 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203559 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3560 .WillOnce(Invoke(&mock_layered_pool,
3561 &MockLayeredPool::ReleaseOneConnection));
3562 ClientSocketHandle handle;
3563 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153564 EXPECT_EQ(ERR_IO_PENDING,
3565 handle.Init("group2", params_, DEFAULT_PRIORITY,
3566 ClientSocketPool::RespectLimits::ENABLED,
3567 callback2.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:013568 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203569}
3570
3571// Tests the case when an idle socket can be closed when a new request is
3572// issued, and the new request belongs to a group that was previously stalled.
3573TEST_F(ClientSocketPoolBaseTest,
3574 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3575 CreatePool(2, 2);
3576 std::list<TestConnectJob::JobType> job_types;
3577 job_types.push_back(TestConnectJob::kMockJob);
3578 job_types.push_back(TestConnectJob::kMockJob);
3579 job_types.push_back(TestConnectJob::kMockJob);
3580 job_types.push_back(TestConnectJob::kMockJob);
3581 connect_job_factory_->set_job_types(&job_types);
3582
3583 ClientSocketHandle handle1;
3584 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:153585 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3586 ClientSocketPool::RespectLimits::ENABLED,
3587 callback1.callback(), pool_.get(), BoundNetLog()));
[email protected]58e562f2013-04-22 17:32:203588
3589 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013590 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203591 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3592 .WillRepeatedly(Invoke(&mock_layered_pool,
3593 &MockLayeredPool::ReleaseOneConnection));
3594 mock_layered_pool.set_can_release_connection(false);
3595
3596 // The third request is made when the socket pool is in a stalled state.
3597 ClientSocketHandle handle3;
3598 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:153599 EXPECT_EQ(ERR_IO_PENDING,
3600 handle3.Init("group3", params_, DEFAULT_PRIORITY,
3601 ClientSocketPool::RespectLimits::ENABLED,
3602 callback3.callback(), pool_.get(), BoundNetLog()));
[email protected]58e562f2013-04-22 17:32:203603
3604 base::RunLoop().RunUntilIdle();
3605 EXPECT_FALSE(callback3.have_result());
3606
3607 // The fourth request is made when the pool is no longer stalled. The third
3608 // request should be serviced first, since it was issued first and has the
3609 // same priority.
3610 mock_layered_pool.set_can_release_connection(true);
3611 ClientSocketHandle handle4;
3612 TestCompletionCallback callback4;
mmenked3641e12016-01-28 16:06:153613 EXPECT_EQ(ERR_IO_PENDING,
3614 handle4.Init("group3", params_, DEFAULT_PRIORITY,
3615 ClientSocketPool::RespectLimits::ENABLED,
3616 callback4.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:013617 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203618 EXPECT_FALSE(callback4.have_result());
3619
3620 // Closing a handle should free up another socket slot.
3621 handle1.Reset();
robpercival214763f2016-07-01 23:27:013622 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203623}
3624
3625// Tests the case when an idle socket can be closed when a new request is
3626// issued, and the new request belongs to a group that was previously stalled.
3627//
3628// The two differences from the above test are that the stalled requests are not
3629// in the same group as the layered pool's request, and the the fourth request
3630// has a higher priority than the third one, so gets a socket first.
3631TEST_F(ClientSocketPoolBaseTest,
3632 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3633 CreatePool(2, 2);
3634 std::list<TestConnectJob::JobType> job_types;
3635 job_types.push_back(TestConnectJob::kMockJob);
3636 job_types.push_back(TestConnectJob::kMockJob);
3637 job_types.push_back(TestConnectJob::kMockJob);
3638 job_types.push_back(TestConnectJob::kMockJob);
3639 connect_job_factory_->set_job_types(&job_types);
3640
3641 ClientSocketHandle handle1;
3642 TestCompletionCallback callback1;
mmenked3641e12016-01-28 16:06:153643 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY,
3644 ClientSocketPool::RespectLimits::ENABLED,
3645 callback1.callback(), pool_.get(), BoundNetLog()));
[email protected]58e562f2013-04-22 17:32:203646
3647 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013648 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203649 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3650 .WillRepeatedly(Invoke(&mock_layered_pool,
3651 &MockLayeredPool::ReleaseOneConnection));
3652 mock_layered_pool.set_can_release_connection(false);
3653
3654 // The third request is made when the socket pool is in a stalled state.
3655 ClientSocketHandle handle3;
3656 TestCompletionCallback callback3;
mmenked3641e12016-01-28 16:06:153657 EXPECT_EQ(ERR_IO_PENDING,
3658 handle3.Init("group3", params_, MEDIUM,
3659 ClientSocketPool::RespectLimits::ENABLED,
3660 callback3.callback(), pool_.get(), BoundNetLog()));
[email protected]58e562f2013-04-22 17:32:203661
3662 base::RunLoop().RunUntilIdle();
3663 EXPECT_FALSE(callback3.have_result());
3664
3665 // The fourth request is made when the pool is no longer stalled. This
3666 // request has a higher priority than the third request, so is serviced first.
3667 mock_layered_pool.set_can_release_connection(true);
3668 ClientSocketHandle handle4;
3669 TestCompletionCallback callback4;
mmenked3641e12016-01-28 16:06:153670 EXPECT_EQ(ERR_IO_PENDING,
3671 handle4.Init("group3", params_, HIGHEST,
3672 ClientSocketPool::RespectLimits::ENABLED,
3673 callback4.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:013674 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203675 EXPECT_FALSE(callback3.have_result());
3676
3677 // Closing a handle should free up another socket slot.
3678 handle1.Reset();
robpercival214763f2016-07-01 23:27:013679 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203680}
3681
3682TEST_F(ClientSocketPoolBaseTest,
3683 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
3684 CreatePool(1, 1);
3685 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3686
3687 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013688 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203689 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
3690 .WillRepeatedly(Invoke(&mock_layered_pool1,
3691 &MockLayeredPool::ReleaseOneConnection));
3692 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:013693 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
3694 IsOk());
[email protected]58e562f2013-04-22 17:32:203695 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
3696 .WillRepeatedly(Invoke(&mock_layered_pool2,
3697 &MockLayeredPool::ReleaseOneConnection));
3698 ClientSocketHandle handle;
3699 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153700 EXPECT_EQ(ERR_IO_PENDING,
3701 handle.Init("a", params_, DEFAULT_PRIORITY,
3702 ClientSocketPool::RespectLimits::ENABLED,
3703 callback.callback(), pool_.get(), BoundNetLog()));
robpercival214763f2016-07-01 23:27:013704 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203705}
3706
[email protected]b021ece62013-06-11 11:06:333707// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:153708// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
3709// socket instead of a request with the same priority that was issued earlier,
3710// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:333711TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:333712 CreatePool(1, 1);
3713
3714 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153715 EXPECT_EQ(
3716 OK, StartRequestWithIgnoreLimits(
3717 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333718 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3719
3720 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3721
mmenked3641e12016-01-28 16:06:153722 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3723 "a", MAXIMUM_PRIORITY,
3724 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333725 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3726
mmenked3641e12016-01-28 16:06:153727 // Issue a request that ignores the limits, so a new ConnectJob is
3728 // created.
3729 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3730 "a", MAXIMUM_PRIORITY,
3731 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:333732 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3733
robpercival214763f2016-07-01 23:27:013734 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:333735 EXPECT_FALSE(request(1)->have_result());
3736}
3737
[email protected]c55fabd2013-11-04 23:26:563738// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:153739// issued for a request with RespectLimits::DISABLED is not cancelled when a
3740// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:563741TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:563742 CreatePool(1, 1);
3743
3744 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153745 EXPECT_EQ(
3746 OK, StartRequestWithIgnoreLimits(
3747 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563748 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3749
3750 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3751
mmenked3641e12016-01-28 16:06:153752 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3753 "a", MAXIMUM_PRIORITY,
3754 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563755 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3756
mmenked3641e12016-01-28 16:06:153757 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
3758 // created.
3759 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3760 "a", MAXIMUM_PRIORITY,
3761 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:333762 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3763
mmenked3641e12016-01-28 16:06:153764 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:333765 // should not be cancelled.
3766 request(1)->handle()->Reset();
3767 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3768
robpercival214763f2016-07-01 23:27:013769 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:333770 EXPECT_FALSE(request(1)->have_result());
3771}
3772
[email protected]f6d1d6eb2009-06-24 20:16:093773} // namespace
3774
3775} // namespace net