blob: 309047a1e992435609b5de59e09a4d39e816fb84 [file] [log] [blame]
[email protected]e34400c32012-01-24 02:49:331// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]f6d1d6eb2009-06-24 20:16:092// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]ab838892009-06-30 18:49:055#include "net/socket/client_socket_pool_base.h"
[email protected]f6d1d6eb2009-06-24 20:16:096
tbansalf82cc8e2015-10-14 20:05:497#include <stdint.h>
dchengc7eeda422015-12-26 03:56:488#include <utility>
[email protected]51fdc7c2012-04-10 19:19:489#include <vector>
10
[email protected]6ecf2b92011-12-15 01:14:5211#include "base/bind.h"
12#include "base/bind_helpers.h"
[email protected]2041cf342010-02-19 03:15:5913#include "base/callback.h"
skyostil4891b25b2015-06-11 11:43:4514#include "base/location.h"
mmenke33d24423d2015-05-19 19:41:0915#include "base/logging.h"
Avi Drissman13fc8932015-12-20 04:40:4616#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1517#include "base/memory/ref_counted.h"
[email protected]6ea7b152011-12-21 21:21:1318#include "base/memory/weak_ptr.h"
[email protected]18b577412013-07-18 04:19:1519#include "base/message_loop/message_loop.h"
[email protected]034df0f32013-01-07 23:17:4820#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4521#include "base/single_thread_task_runner.h"
[email protected]fc9be5802013-06-11 10:56:5122#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1523#include "base/strings/stringprintf.h"
[email protected]f214f8792011-01-01 02:17:0824#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3525#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0326#include "base/values.h"
[email protected]034df0f32013-01-07 23:17:4827#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5928#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0629#include "net/base/net_errors.h"
[email protected]ac790b42009-12-02 04:31:3130#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0931#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3532#include "net/http/http_response_headers.h"
eroman87c53d62015-04-02 06:51:0733#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0034#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1935#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0036#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5637#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4638#include "net/log/test_net_log_entry.h"
39#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0940#include "net/socket/client_socket_factory.h"
41#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2642#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2843#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5444#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1745#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4446#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1047#include "net/socket/stream_socket.h"
robpercival214763f2016-07-01 23:27:0148#include "net/test/gtest_util.h"
Bence Béky98447b12018-05-08 03:14:0149#include "net/test/test_with_scoped_task_environment.h"
Ramin Halavati0a08cc82018-02-06 07:46:3850#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4851#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0952#include "testing/gtest/include/gtest/gtest.h"
53
robpercival214763f2016-07-01 23:27:0154using net::test::IsError;
55using net::test::IsOk;
56
[email protected]51fdc7c2012-04-10 19:19:4857using ::testing::Invoke;
58using ::testing::Return;
59
[email protected]f6d1d6eb2009-06-24 20:16:0960namespace net {
61
62namespace {
63
[email protected]211d21722009-07-22 15:48:5364const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2065const int kDefaultMaxSocketsPerGroup = 2;
[email protected]0b7648c2009-07-06 20:14:0166
[email protected]034df0f32013-01-07 23:17:4867// Make sure |handle| sets load times correctly when it has been assigned a
68// reused socket.
69void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
70 LoadTimingInfo load_timing_info;
71 // Only pass true in as |is_reused|, as in general, HttpStream types should
72 // have stricter concepts of reuse than socket pools.
73 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
74
75 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1976 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4877
[email protected]b258e0792013-01-12 07:11:5978 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
79 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4880}
81
82// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3383// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4884// of a connection where |is_reused| is false may consider the connection
85// reused.
86void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
87 EXPECT_FALSE(handle.is_reused());
88
89 LoadTimingInfo load_timing_info;
90 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
91
92 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1993 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4894
[email protected]b258e0792013-01-12 07:11:5995 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
96 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
97 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4898
99 TestLoadTimingInfoConnectedReused(handle);
100}
101
102// Make sure |handle| sets load times correctly, in the case that it does not
103// currently have a socket.
104void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
105 // Should only be set to true once a socket is assigned, if at all.
106 EXPECT_FALSE(handle.is_reused());
107
108 LoadTimingInfo load_timing_info;
109 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
110
111 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19112 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48113
[email protected]b258e0792013-01-12 07:11:59114 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
115 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48116}
117
[email protected]df4b4ef2010-07-12 18:25:21118class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20119 public:
Chris Watkins7a41d3552017-12-01 02:13:27120 explicit TestSocketParams() = default;
[email protected]51fdc7c2012-04-10 19:19:48121
[email protected]df4b4ef2010-07-12 18:25:21122 private:
123 friend class base::RefCounted<TestSocketParams>;
Chris Watkins7a41d3552017-12-01 02:13:27124 ~TestSocketParams() = default;
[email protected]df4b4ef2010-07-12 18:25:21125};
[email protected]7fc5b09a2010-02-27 00:07:38126typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49127
[email protected]3268023f2011-05-05 00:08:10128class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09129 public:
[email protected]034df0f32013-01-07 23:17:48130 explicit MockClientSocket(net::NetLog* net_log)
131 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28132 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20133 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30134 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09135
[email protected]0dc88b32014-03-26 20:12:28136 // Sets whether the socket has unread data. If true, the next call to Read()
137 // will return 1 byte and IsConnectedAndIdle() will return false.
138 void set_has_unread_data(bool has_unread_data) {
139 has_unread_data_ = has_unread_data;
140 }
141
[email protected]3f55aa12011-12-07 02:03:33142 // Socket implementation.
dchengb03027d2014-10-21 12:00:20143 int Read(IOBuffer* /* buf */,
144 int len,
Brad Lassey3a814172018-04-26 03:30:21145 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28146 if (has_unread_data_ && len > 0) {
147 has_unread_data_ = false;
148 was_used_to_convey_data_ = true;
149 return 1;
150 }
[email protected]e86df8dc2013-03-30 13:18:28151 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33152 }
[email protected]ab838892009-06-30 18:49:05153
[email protected]a2b2cfc2017-12-06 09:06:08154 int Write(
155 IOBuffer* /* buf */,
156 int len,
Brad Lassey3a814172018-04-26 03:30:21157 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08158 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01159 was_used_to_convey_data_ = true;
160 return len;
[email protected]ab838892009-06-30 18:49:05161 }
Avi Drissman13fc8932015-12-20 04:40:46162 int SetReceiveBufferSize(int32_t size) override { return OK; }
163 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05164
[email protected]dbf036f2011-12-06 23:33:24165 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21166 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24167 connected_ = true;
168 return OK;
169 }
[email protected]f6d1d6eb2009-06-24 20:16:09170
dchengb03027d2014-10-21 12:00:20171 void Disconnect() override { connected_ = false; }
172 bool IsConnected() const override { return connected_; }
173 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28174 return connected_ && !has_unread_data_;
175 }
[email protected]0b7648c2009-07-06 20:14:01176
dchengb03027d2014-10-21 12:00:20177 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16178 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09179 }
[email protected]f6d1d6eb2009-06-24 20:16:09180
dchengb03027d2014-10-21 12:00:20181 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35182 return ERR_UNEXPECTED;
183 }
184
tfarina428341112016-09-22 13:38:20185 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02186
dchengb03027d2014-10-21 12:00:20187 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37188 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20189 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
190 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03191 void GetConnectionAttempts(ConnectionAttempts* out) const override {
192 out->clear();
193 }
194 void ClearConnectionAttempts() override {}
195 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49196 int64_t GetTotalReceivedBytes() const override {
197 NOTIMPLEMENTED();
198 return 0;
199 }
Paul Jensen0f49dec2017-12-12 23:39:58200 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45201
[email protected]f6d1d6eb2009-06-24 20:16:09202 private:
203 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28204 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20205 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01206 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09207
[email protected]ab838892009-06-30 18:49:05208 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09209};
210
[email protected]5fc08e32009-07-15 17:09:57211class TestConnectJob;
212
[email protected]f6d1d6eb2009-06-24 20:16:09213class MockClientSocketFactory : public ClientSocketFactory {
214 public:
[email protected]ab838892009-06-30 18:49:05215 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09216
danakj655b66c2016-04-16 00:51:38217 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04218 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41219 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19220 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41221 NOTREACHED();
danakj655b66c2016-04-16 00:51:38222 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41223 }
224
Helen Lid5bb9222018-04-12 15:33:09225 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07226 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38227 std::unique_ptr<
228 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07229 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19230 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09231 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09232 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09233 }
234
danakj655b66c2016-04-16 00:51:38235 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
236 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27237 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21238 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13239 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09240 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38241 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09242 }
Helen Liac3c51e2018-04-24 00:02:13243 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
244 std::unique_ptr<ClientSocketHandle> transport_socket,
245 const std::string& user_agent,
246 const HostPortPair& endpoint,
247 HttpAuthController* http_auth_controller,
248 bool tunnel,
249 bool using_spdy,
250 NextProto negotiated_protocol,
251 bool is_https_proxy,
252 const NetworkTrafficAnnotationTag& traffic_annotation) override {
253 NOTIMPLEMENTED();
254 return nullptr;
255 }
[email protected]f6d1d6eb2009-06-24 20:16:09256
dchengb03027d2014-10-21 12:00:20257 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59258
[email protected]5fc08e32009-07-15 17:09:57259 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55260
[email protected]5fc08e32009-07-15 17:09:57261 void SignalJobs();
262
[email protected]03b7c8c2013-07-20 04:38:55263 void SignalJob(size_t job);
264
265 void SetJobLoadState(size_t job, LoadState load_state);
266
[email protected]f6d1d6eb2009-06-24 20:16:09267 int allocation_count() const { return allocation_count_; }
268
[email protected]f6d1d6eb2009-06-24 20:16:09269 private:
270 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57271 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09272};
273
[email protected]ab838892009-06-30 18:49:05274class TestConnectJob : public ConnectJob {
275 public:
276 enum JobType {
277 kMockJob,
278 kMockFailingJob,
279 kMockPendingJob,
280 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57281 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13282 kMockRecoverableJob,
283 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18284 kMockAdditionalErrorStateJob,
285 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28286 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05287 };
288
[email protected]994d4932010-07-12 17:55:13289 // The kMockPendingJob uses a slight delay before allowing the connect
290 // to complete.
291 static const int kPendingConnectDelay = 2;
292
[email protected]ab838892009-06-30 18:49:05293 TestConnectJob(JobType job_type,
294 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49295 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34296 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05297 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30298 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17299 NetLog* net_log)
tfarina428341112016-09-22 13:38:20300 : ConnectJob(
301 group_name,
302 timeout_duration,
303 request.priority(),
Paul Jensen8d6f87ec2018-01-13 00:46:54304 request.socket_tag(),
tfarina428341112016-09-22 13:38:20305 request.respect_limits(),
306 delegate,
davidbenb7048f092016-11-30 21:20:26307 NetLogWithSource::Make(net_log,
308 NetLogSourceType::TRANSPORT_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58309 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05310 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18311 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39312 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15313 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05314
[email protected]974ebd62009-08-03 23:14:34315 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13316 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34317 }
318
[email protected]03b7c8c2013-07-20 04:38:55319 void set_load_state(LoadState load_state) { load_state_ = load_state; }
320
321 // From ConnectJob:
322
dchengb03027d2014-10-21 12:00:20323 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21324
dchengb03027d2014-10-21 12:00:20325 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18326 if (store_additional_error_state_) {
327 // Set all of the additional error state fields in some way.
328 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43329 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45330 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43331 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18332 }
333 }
334
[email protected]974ebd62009-08-03 23:14:34335 private:
[email protected]03b7c8c2013-07-20 04:38:55336 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05337
dchengb03027d2014-10-21 12:00:20338 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05339 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21340 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19341 NetLogSource());
danakj655b66c2016-04-16 00:51:38342 SetSocket(std::unique_ptr<StreamSocket>(
343 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05344 switch (job_type_) {
345 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13346 return DoConnect(true /* successful */, false /* sync */,
347 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05348 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13349 return DoConnect(false /* error */, false /* sync */,
350 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05351 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57352 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47353
354 // Depending on execution timings, posting a delayed task can result
355 // in the task getting executed the at the earliest possible
356 // opportunity or only after returning once from the message loop and
357 // then a second call into the message loop. In order to make behavior
358 // more deterministic, we change the default delay to 2ms. This should
359 // always require us to wait for the second call into the message loop.
360 //
361 // N.B. The correct fix for this and similar timing problems is to
362 // abstract time for the purpose of unittests. Unfortunately, we have
363 // a lot of third-party components that directly call the various
364 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45365 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05366 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13367 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45368 weak_factory_.GetWeakPtr(), true /* successful */,
369 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53370 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05371 return ERR_IO_PENDING;
372 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57373 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45374 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05375 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13376 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45377 weak_factory_.GetWeakPtr(), false /* error */,
378 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53379 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05380 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57381 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55382 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57383 client_socket_factory_->WaitForSignal(this);
384 waiting_success_ = true;
385 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13386 case kMockRecoverableJob:
387 return DoConnect(false /* error */, false /* sync */,
388 true /* recoverable */);
389 case kMockPendingRecoverableJob:
390 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45391 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13392 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13393 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45394 weak_factory_.GetWeakPtr(), false /* error */,
395 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53396 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13397 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18398 case kMockAdditionalErrorStateJob:
399 store_additional_error_state_ = true;
400 return DoConnect(false /* error */, false /* sync */,
401 false /* recoverable */);
402 case kMockPendingAdditionalErrorStateJob:
403 set_load_state(LOAD_STATE_CONNECTING);
404 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45405 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18406 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13407 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45408 weak_factory_.GetWeakPtr(), false /* error */,
409 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53410 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18411 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28412 case kMockUnreadDataJob: {
413 int ret = DoConnect(true /* successful */, false /* sync */,
414 false /* recoverable */);
415 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
416 return ret;
417 }
[email protected]ab838892009-06-30 18:49:05418 default:
419 NOTREACHED();
danakj655b66c2016-04-16 00:51:38420 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05421 return ERR_FAILED;
422 }
423 }
424
[email protected]e772db3f2010-07-12 18:11:13425 int DoConnect(bool succeed, bool was_async, bool recoverable) {
426 int result = OK;
[email protected]ab838892009-06-30 18:49:05427 if (succeed) {
Bence Békybdbb0e72018-08-07 21:42:59428 socket()->Connect(CompletionOnceCallback());
[email protected]e772db3f2010-07-12 18:11:13429 } else if (recoverable) {
430 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40431 } else {
[email protected]e772db3f2010-07-12 18:11:13432 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38433 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05434 }
[email protected]2ab05b52009-07-01 23:57:58435
436 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30437 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05438 return result;
439 }
440
[email protected]5fc08e32009-07-15 17:09:57441 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05442 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57443 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21444 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18445 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05446
[email protected]d5492c52013-11-10 20:44:39447 base::WeakPtrFactory<TestConnectJob> weak_factory_;
448
[email protected]ab838892009-06-30 18:49:05449 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
450};
451
[email protected]d80a4322009-08-14 07:07:49452class TestConnectJobFactory
453 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05454 public:
[email protected]034df0f32013-01-07 23:17:48455 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
456 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05457 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48458 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48459 client_socket_factory_(client_socket_factory),
460 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33461 }
[email protected]ab838892009-06-30 18:49:05462
Chris Watkins7a41d3552017-12-01 02:13:27463 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05464
465 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
466
[email protected]51fdc7c2012-04-10 19:19:48467 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
468 job_types_ = job_types;
469 CHECK(!job_types_->empty());
470 }
471
[email protected]974ebd62009-08-03 23:14:34472 void set_timeout_duration(base::TimeDelta timeout_duration) {
473 timeout_duration_ = timeout_duration;
474 }
475
[email protected]3f55aa12011-12-07 02:03:33476 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55477
danakj655b66c2016-04-16 00:51:38478 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05479 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49480 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13481 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48482 EXPECT_TRUE(!job_types_ || !job_types_->empty());
483 TestConnectJob::JobType job_type = job_type_;
484 if (job_types_ && !job_types_->empty()) {
485 job_type = job_types_->front();
486 job_types_->pop_front();
487 }
danakj655b66c2016-04-16 00:51:38488 return std::unique_ptr<ConnectJob>(
489 new TestConnectJob(job_type, group_name, request, timeout_duration_,
490 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05491 }
492
dchengb03027d2014-10-21 12:00:20493 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26494 return timeout_duration_;
495 }
496
[email protected]ab838892009-06-30 18:49:05497 private:
498 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48499 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34500 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57501 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48502 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05503
504 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
505};
506
507class TestClientSocketPool : public ClientSocketPool {
508 public:
[email protected]12322e7e2013-08-15 17:49:26509 typedef TestSocketParams SocketParams;
510
[email protected]ab838892009-06-30 18:49:05511 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53512 int max_sockets,
[email protected]ab838892009-06-30 18:49:05513 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16514 base::TimeDelta unused_idle_socket_timeout,
515 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49516 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41517 : base_(NULL,
518 max_sockets,
519 max_sockets_per_group,
520 unused_idle_socket_timeout,
521 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38522 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05523
Chris Watkins7a41d3552017-12-01 02:13:27524 ~TestClientSocketPool() override = default;
[email protected]2431756e2010-09-29 20:26:13525
dchengb03027d2014-10-21 12:00:20526 int RequestSocket(const std::string& group_name,
527 const void* params,
ttuttle859dc7a2015-04-23 19:42:29528 RequestPriority priority,
Paul Jensen8d6f87ec2018-01-13 00:46:54529 const SocketTag& socket_tag,
mmenked3641e12016-01-28 16:06:15530 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20531 ClientSocketHandle* handle,
Bence Béky5a8662b2018-07-03 13:04:03532 CompletionOnceCallback callback,
tfarina428341112016-09-22 13:38:20533 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21534 const scoped_refptr<TestSocketParams>* casted_socket_params =
535 static_cast<const scoped_refptr<TestSocketParams>*>(params);
536 return base_.RequestSocket(group_name, *casted_socket_params, priority,
Bence Béky5a8662b2018-07-03 13:04:03537 socket_tag, respect_limits, handle,
538 std::move(callback), net_log);
[email protected]ab838892009-06-30 18:49:05539 }
540
dchengb03027d2014-10-21 12:00:20541 void RequestSockets(const std::string& group_name,
542 const void* params,
543 int num_sockets,
Charlie Harrison55ce6082018-05-14 02:25:57544 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03545 const scoped_refptr<TestSocketParams>* casted_params =
546 static_cast<const scoped_refptr<TestSocketParams>*>(params);
547
Charlie Harrison55ce6082018-05-14 02:25:57548 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
[email protected]2c2bef152010-10-13 00:55:03549 }
550
rdsmith29dbad12017-02-17 02:22:18551 void SetPriority(const std::string& group_name,
552 ClientSocketHandle* handle,
553 RequestPriority priority) override {
554 base_.SetPriority(group_name, handle, priority);
555 }
556
dchengb03027d2014-10-21 12:00:20557 void CancelRequest(const std::string& group_name,
558 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49559 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05560 }
561
dchengb03027d2014-10-21 12:00:20562 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38563 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20564 int id) override {
dchengc7eeda422015-12-26 03:56:48565 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24566 }
567
dchengb03027d2014-10-21 12:00:20568 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05569
dchengb03027d2014-10-21 12:00:20570 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48571
dchengb03027d2014-10-21 12:00:20572 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05573
xunjieli92feb332017-03-03 17:19:23574 void CloseIdleSocketsInGroup(const std::string& group_name) override {
575 base_.CloseIdleSocketsInGroup(group_name);
576 }
577
dchengb03027d2014-10-21 12:00:20578 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05579
dchengb03027d2014-10-21 12:00:20580 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49581 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05582 }
583
dchengb03027d2014-10-21 12:00:20584 LoadState GetLoadState(const std::string& group_name,
585 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49586 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05587 }
588
dchengb03027d2014-10-21 12:00:20589 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52590 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48591 }
592
dchengb03027d2014-10-21 12:00:20593 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52594 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48595 }
596
danakj655b66c2016-04-16 00:51:38597 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59598 const std::string& name,
599 const std::string& type,
mostynbba063d6032014-10-09 11:01:13600 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27601 return base_.GetInfoAsValue(name, type);
602 }
603
dchengb03027d2014-10-21 12:00:20604 base::TimeDelta ConnectionTimeout() const override {
[email protected]a796bcec2010-03-22 17:17:26605 return base_.ConnectionTimeout();
606 }
607
[email protected]d80a4322009-08-14 07:07:49608 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20609
[email protected]8159a1c2012-06-07 00:00:10610 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
611 return base_.NumUnassignedConnectJobsInGroup(group_name);
612 }
613
[email protected]974ebd62009-08-03 23:14:34614 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49615 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34616 }
617
[email protected]2c2bef152010-10-13 00:55:03618 int NumActiveSocketsInGroup(const std::string& group_name) const {
619 return base_.NumActiveSocketsInGroup(group_name);
620 }
621
[email protected]2abfe90a2010-08-25 17:49:51622 bool HasGroup(const std::string& group_name) const {
623 return base_.HasGroup(group_name);
624 }
625
[email protected]9bf28db2009-08-29 01:35:16626 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
627
[email protected]06d94042010-08-25 01:45:22628 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54629
[email protected]043b68c82013-08-22 23:41:52630 bool CloseOneIdleConnectionInHigherLayeredPool() {
631 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48632 }
633
[email protected]ab838892009-06-30 18:49:05634 private:
[email protected]d80a4322009-08-14 07:07:49635 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05636
637 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
638};
639
[email protected]a937a06d2009-08-19 21:19:24640} // namespace
641
[email protected]a937a06d2009-08-19 21:19:24642namespace {
643
[email protected]5fc08e32009-07-15 17:09:57644void MockClientSocketFactory::SignalJobs() {
645 for (std::vector<TestConnectJob*>::iterator it = waiting_jobs_.begin();
646 it != waiting_jobs_.end(); ++it) {
647 (*it)->Signal();
648 }
649 waiting_jobs_.clear();
650}
651
[email protected]03b7c8c2013-07-20 04:38:55652void MockClientSocketFactory::SignalJob(size_t job) {
653 ASSERT_LT(job, waiting_jobs_.size());
654 waiting_jobs_[job]->Signal();
655 waiting_jobs_.erase(waiting_jobs_.begin() + job);
656}
657
658void MockClientSocketFactory::SetJobLoadState(size_t job,
659 LoadState load_state) {
660 ASSERT_LT(job, waiting_jobs_.size());
661 waiting_jobs_[job]->set_load_state(load_state);
662}
663
[email protected]974ebd62009-08-03 23:14:34664class TestConnectJobDelegate : public ConnectJob::Delegate {
665 public:
Weza03bae02018-07-13 17:17:33666 TestConnectJobDelegate() : have_result_(false), result_(OK) {}
Chris Watkins7a41d3552017-12-01 02:13:27667 ~TestConnectJobDelegate() override = default;
[email protected]974ebd62009-08-03 23:14:34668
dchengb03027d2014-10-21 12:00:20669 void OnConnectJobComplete(int result, ConnectJob* job) override {
[email protected]974ebd62009-08-03 23:14:34670 result_ = result;
danakj655b66c2016-04-16 00:51:38671 std::unique_ptr<ConnectJob> owned_job(job);
672 std::unique_ptr<StreamSocket> socket = owned_job->PassSocket();
[email protected]9b6fee12009-09-29 18:13:07673 // socket.get() should be NULL iff result != OK
[email protected]18ccfdb2013-08-15 00:13:44674 EXPECT_EQ(socket == NULL, result != OK);
[email protected]974ebd62009-08-03 23:14:34675 have_result_ = true;
Weza03bae02018-07-13 17:17:33676 if (quit_wait_on_result_)
677 std::move(quit_wait_on_result_).Run();
[email protected]974ebd62009-08-03 23:14:34678 }
679
680 int WaitForResult() {
Weza03bae02018-07-13 17:17:33681 DCHECK(!quit_wait_on_result_);
[email protected]974ebd62009-08-03 23:14:34682 while (!have_result_) {
Weza03bae02018-07-13 17:17:33683 base::RunLoop run_loop;
684 quit_wait_on_result_ = run_loop.QuitClosure();
685 run_loop.Run();
[email protected]974ebd62009-08-03 23:14:34686 }
687 have_result_ = false; // auto-reset for next callback
688 return result_;
689 }
690
691 private:
692 bool have_result_;
Weza03bae02018-07-13 17:17:33693 base::OnceClosure quit_wait_on_result_;
[email protected]974ebd62009-08-03 23:14:34694 int result_;
695};
696
Bence Béky98447b12018-05-08 03:14:01697class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09698 protected:
mmenked3641e12016-01-28 16:06:15699 ClientSocketPoolBaseTest() : params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54700 connect_backup_jobs_enabled_ =
701 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
702 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
703 }
[email protected]2431756e2010-09-29 20:26:13704
dcheng67be2b1f2014-10-27 21:47:29705 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54706 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
707 connect_backup_jobs_enabled_);
708 }
[email protected]c9d6a1d2009-07-14 16:15:20709
[email protected]211d21722009-07-22 15:48:53710 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16711 CreatePoolWithIdleTimeouts(
712 max_sockets,
713 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30714 ClientSocketPool::unused_idle_socket_timeout(),
715 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16716 }
717
718 void CreatePoolWithIdleTimeouts(
719 int max_sockets, int max_sockets_per_group,
720 base::TimeDelta unused_idle_socket_timeout,
721 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20722 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48723 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
724 &net_log_);
[email protected]2431756e2010-09-29 20:26:13725 pool_.reset(new TestClientSocketPool(max_sockets,
726 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13727 unused_idle_socket_timeout,
728 used_idle_socket_timeout,
729 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20730 }
[email protected]f6d1d6eb2009-06-24 20:16:09731
mmenked3641e12016-01-28 16:06:15732 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33733 const std::string& group_name,
734 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15735 ClientSocketPool::RespectLimits respect_limits) {
736 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
737 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33738 }
739
740 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15741 return StartRequestWithIgnoreLimits(
742 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09743 }
744
[email protected]2431756e2010-09-29 20:26:13745 int GetOrderOfRequest(size_t index) const {
746 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09747 }
748
[email protected]2431756e2010-09-29 20:26:13749 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
750 return test_base_.ReleaseOneConnection(keep_alive);
751 }
752
753 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
754 test_base_.ReleaseAllConnections(keep_alive);
755 }
756
757 TestSocketRequest* request(int i) { return test_base_.request(i); }
758 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38759 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42760 return test_base_.requests();
761 }
rdsmith29dbad12017-02-17 02:22:18762 // Only counts the requests that get sockets asynchronously;
763 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13764 size_t completion_count() const { return test_base_.completion_count(); }
765
vishal.b62985ca92015-04-17 08:45:51766 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54767 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09768 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04769 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21770 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38771 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13772 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09773};
774
[email protected]974ebd62009-08-03 23:14:34775// Even though a timeout is specified, it doesn't time out on a synchronous
776// completion.
777TEST_F(ClientSocketPoolBaseTest, ConnectJob_NoTimeoutOnSynchronousCompletion) {
778 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06779 ClientSocketHandle ignored;
[email protected]d80a4322009-08-14 07:07:49780 TestClientSocketPoolBase::Request request(
Bence Békybdbb0e72018-08-07 21:42:59781 &ignored, CompletionOnceCallback(), DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15782 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20783 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
784 NetLogWithSource());
danakj655b66c2016-04-16 00:51:38785 std::unique_ptr<TestConnectJob> job(
786 new TestConnectJob(TestConnectJob::kMockJob, "a", request,
787 base::TimeDelta::FromMicroseconds(1), &delegate,
788 &client_socket_factory_, NULL));
robpercival214763f2016-07-01 23:27:01789 EXPECT_THAT(job->Connect(), IsOk());
[email protected]974ebd62009-08-03 23:14:34790}
791
792TEST_F(ClientSocketPoolBaseTest, ConnectJob_TimedOut) {
793 TestConnectJobDelegate delegate;
[email protected]a512f5982009-08-18 16:01:06794 ClientSocketHandle ignored;
vishal.b62985ca92015-04-17 08:45:51795 TestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53796
[email protected]d80a4322009-08-14 07:07:49797 TestClientSocketPoolBase::Request request(
Bence Békybdbb0e72018-08-07 21:42:59798 &ignored, CompletionOnceCallback(), DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15799 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20800 internal::ClientSocketPoolBaseHelper::NORMAL, params_,
801 NetLogWithSource());
[email protected]974ebd62009-08-03 23:14:34802 // Deleted by TestConnectJobDelegate.
803 TestConnectJob* job =
804 new TestConnectJob(TestConnectJob::kMockPendingJob,
[email protected]ec08bb22009-08-12 00:25:12805 "a",
[email protected]974ebd62009-08-03 23:14:34806 request,
807 base::TimeDelta::FromMicroseconds(1),
808 &delegate,
[email protected]fd7b7c92009-08-20 19:38:30809 &client_socket_factory_,
[email protected]06650c52010-06-03 00:49:17810 &log);
robpercival214763f2016-07-01 23:27:01811 ASSERT_THAT(job->Connect(), IsError(ERR_IO_PENDING));
[email protected]26b9973962012-01-28 00:57:00812 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
robpercival214763f2016-07-01 23:27:01813 EXPECT_THAT(delegate.WaitForResult(), IsError(ERR_TIMED_OUT));
[email protected]fd7b7c92009-08-20 19:38:30814
mmenke43758e62015-05-04 21:09:46815 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40816 log.GetEntries(&entries);
817
818 EXPECT_EQ(6u, entries.size());
mikecirone8b85c432016-09-08 19:11:00819 EXPECT_TRUE(LogContainsBeginEvent(entries, 0,
820 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]e9002a92010-01-29 07:10:46821 EXPECT_TRUE(LogContainsBeginEvent(
mikecirone8b85c432016-09-08 19:11:00822 entries, 1, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
823 EXPECT_TRUE(LogContainsEvent(entries, 2,
824 NetLogEventType::CONNECT_JOB_SET_SOCKET,
825 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46826 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00827 entries, 3, NetLogEventType::SOCKET_POOL_CONNECT_JOB_TIMED_OUT,
828 NetLogEventPhase::NONE));
[email protected]e9002a92010-01-29 07:10:46829 EXPECT_TRUE(LogContainsEndEvent(
mikecirone8b85c432016-09-08 19:11:00830 entries, 4, NetLogEventType::SOCKET_POOL_CONNECT_JOB_CONNECT));
831 EXPECT_TRUE(LogContainsEndEvent(entries, 5,
832 NetLogEventType::SOCKET_POOL_CONNECT_JOB));
[email protected]974ebd62009-08-03 23:14:34833}
834
[email protected]5fc08e32009-07-15 17:09:57835TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53836 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20837
[email protected]6ecf2b92011-12-15 01:14:52838 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06839 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51840 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48841 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53842
Paul Jensen8d6f87ec2018-01-13 00:46:54843 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15844 ClientSocketPool::RespectLimits::ENABLED,
845 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09846 EXPECT_TRUE(handle.is_initialized());
847 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48848 TestLoadTimingInfoConnectedNotReused(handle);
849
[email protected]f6d1d6eb2009-06-24 20:16:09850 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48851 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30852
mmenke43758e62015-05-04 21:09:46853 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40854 log.GetEntries(&entries);
855
856 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00857 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53858 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00859 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
860 NetLogEventPhase::NONE));
861 EXPECT_TRUE(LogContainsEvent(entries, 2,
862 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
863 NetLogEventPhase::NONE));
864 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09865}
866
[email protected]ab838892009-06-30 18:49:05867TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53868 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20869
[email protected]ab838892009-06-30 18:49:05870 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51871 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53872
[email protected]2431756e2010-09-29 20:26:13873 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52874 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18875 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13876 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43877 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45878 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13879 handle.set_ssl_error_response_info(info);
880 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:54881 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15882 ClientSocketPool::RespectLimits::ENABLED,
883 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13884 EXPECT_FALSE(handle.socket());
885 EXPECT_FALSE(handle.is_ssl_error());
886 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48887 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30888
mmenke43758e62015-05-04 21:09:46889 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40890 log.GetEntries(&entries);
891
892 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00893 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17894 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00895 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
896 NetLogEventPhase::NONE));
897 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09898}
899
[email protected]211d21722009-07-22 15:48:53900TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
901 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
902
[email protected]9e743cd2010-03-16 07:03:53903 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30904
robpercival214763f2016-07-01 23:27:01905 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
906 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
907 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
908 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53909
[email protected]2431756e2010-09-29 20:26:13910 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53911 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13912 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53913
robpercival214763f2016-07-01 23:27:01914 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
915 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
916 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53917
[email protected]2431756e2010-09-29 20:26:13918 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53919
[email protected]2431756e2010-09-29 20:26:13920 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53921 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13922 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53923
924 EXPECT_EQ(1, GetOrderOfRequest(1));
925 EXPECT_EQ(2, GetOrderOfRequest(2));
926 EXPECT_EQ(3, GetOrderOfRequest(3));
927 EXPECT_EQ(4, GetOrderOfRequest(4));
928 EXPECT_EQ(5, GetOrderOfRequest(5));
929 EXPECT_EQ(6, GetOrderOfRequest(6));
930 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17931
932 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13933 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53934}
935
936TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
937 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
938
[email protected]9e743cd2010-03-16 07:03:53939 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30940
[email protected]211d21722009-07-22 15:48:53941 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01942 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
943 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
944 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
945 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53946
[email protected]2431756e2010-09-29 20:26:13947 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53948 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13949 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53950
951 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01952 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53953
[email protected]2431756e2010-09-29 20:26:13954 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53955
[email protected]2431756e2010-09-29 20:26:13956 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53957 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13958 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53959
960 EXPECT_EQ(1, GetOrderOfRequest(1));
961 EXPECT_EQ(2, GetOrderOfRequest(2));
962 EXPECT_EQ(3, GetOrderOfRequest(3));
963 EXPECT_EQ(4, GetOrderOfRequest(4));
964 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17965
966 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13967 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53968}
969
970TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
971 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
972
robpercival214763f2016-07-01 23:27:01973 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
974 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
975 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
976 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53977
[email protected]2431756e2010-09-29 20:26:13978 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53979 client_socket_factory_.allocation_count());
980
robpercival214763f2016-07-01 23:27:01981 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
982 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
983 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53984
[email protected]2431756e2010-09-29 20:26:13985 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53986
[email protected]2431756e2010-09-29 20:26:13987 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53988
989 // First 4 requests don't have to wait, and finish in order.
990 EXPECT_EQ(1, GetOrderOfRequest(1));
991 EXPECT_EQ(2, GetOrderOfRequest(2));
992 EXPECT_EQ(3, GetOrderOfRequest(3));
993 EXPECT_EQ(4, GetOrderOfRequest(4));
994
[email protected]ac790b42009-12-02 04:31:31995 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
996 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53997 EXPECT_EQ(7, GetOrderOfRequest(5));
998 EXPECT_EQ(6, GetOrderOfRequest(6));
999 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171000
1001 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131002 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531003}
1004
rdsmith29dbad12017-02-17 02:22:181005// Test reprioritizing a request before completion doesn't interfere with
1006// its completion.
1007TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1008 CreatePool(kDefaultMaxSockets, 1);
1009
1010 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1011 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1012 EXPECT_TRUE(request(0)->handle()->socket());
1013 EXPECT_FALSE(request(1)->handle()->socket());
1014
1015 request(1)->handle()->SetPriority(MEDIUM);
1016
1017 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1018
1019 EXPECT_TRUE(request(1)->handle()->socket());
1020}
1021
1022// Reprioritize a request up past another one and make sure that changes the
1023// completion order.
1024TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1025 CreatePool(kDefaultMaxSockets, 1);
1026
1027 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1028 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1029 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1030 EXPECT_TRUE(request(0)->handle()->socket());
1031 EXPECT_FALSE(request(1)->handle()->socket());
1032 EXPECT_FALSE(request(2)->handle()->socket());
1033
1034 request(2)->handle()->SetPriority(HIGHEST);
1035
1036 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1037
1038 EXPECT_EQ(1, GetOrderOfRequest(1));
1039 EXPECT_EQ(3, GetOrderOfRequest(2));
1040 EXPECT_EQ(2, GetOrderOfRequest(3));
1041}
1042
1043// Reprioritize a request without changing relative priorities and check
1044// that the order doesn't change.
1045TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1046 CreatePool(kDefaultMaxSockets, 1);
1047
1048 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1049 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1050 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1051 EXPECT_TRUE(request(0)->handle()->socket());
1052 EXPECT_FALSE(request(1)->handle()->socket());
1053 EXPECT_FALSE(request(2)->handle()->socket());
1054
1055 request(2)->handle()->SetPriority(MEDIUM);
1056
1057 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1058
1059 EXPECT_EQ(1, GetOrderOfRequest(1));
1060 EXPECT_EQ(2, GetOrderOfRequest(2));
1061 EXPECT_EQ(3, GetOrderOfRequest(3));
1062}
1063
1064// Reprioritize a request past down another one and make sure that changes the
1065// completion order.
1066TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1067 CreatePool(kDefaultMaxSockets, 1);
1068
1069 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1070 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1071 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1072 EXPECT_TRUE(request(0)->handle()->socket());
1073 EXPECT_FALSE(request(1)->handle()->socket());
1074 EXPECT_FALSE(request(2)->handle()->socket());
1075
1076 request(1)->handle()->SetPriority(LOW);
1077
1078 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1079
1080 EXPECT_EQ(1, GetOrderOfRequest(1));
1081 EXPECT_EQ(3, GetOrderOfRequest(2));
1082 EXPECT_EQ(2, GetOrderOfRequest(3));
1083}
1084
1085// Reprioritize a request to the same level as another and confirm it is
1086// put after the old request.
1087TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1088 CreatePool(kDefaultMaxSockets, 1);
1089
1090 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1091 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1092 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1093 EXPECT_TRUE(request(0)->handle()->socket());
1094 EXPECT_FALSE(request(1)->handle()->socket());
1095 EXPECT_FALSE(request(2)->handle()->socket());
1096
1097 request(1)->handle()->SetPriority(MEDIUM);
1098
1099 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1100
1101 EXPECT_EQ(1, GetOrderOfRequest(1));
1102 EXPECT_EQ(3, GetOrderOfRequest(2));
1103 EXPECT_EQ(2, GetOrderOfRequest(3));
1104}
1105
[email protected]211d21722009-07-22 15:48:531106TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1107 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1108
robpercival214763f2016-07-01 23:27:011109 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
1110 EXPECT_THAT(StartRequest("a", LOW), IsOk());
1111 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
1112 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531113
[email protected]2431756e2010-09-29 20:26:131114 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531115 client_socket_factory_.allocation_count());
1116
robpercival214763f2016-07-01 23:27:011117 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1118 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1119 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531120
[email protected]2431756e2010-09-29 20:26:131121 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531122
[email protected]2431756e2010-09-29 20:26:131123 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531124 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131125 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531126
1127 // First 4 requests don't have to wait, and finish in order.
1128 EXPECT_EQ(1, GetOrderOfRequest(1));
1129 EXPECT_EQ(2, GetOrderOfRequest(2));
1130 EXPECT_EQ(3, GetOrderOfRequest(3));
1131 EXPECT_EQ(4, GetOrderOfRequest(4));
1132
1133 // Request ("b", 7) has the highest priority, but we can't make new socket for
1134 // group "b", because it has reached the per-group limit. Then we make
1135 // socket for ("c", 6), because it has higher priority than ("a", 4),
1136 // and we still can't make a socket for group "b".
1137 EXPECT_EQ(5, GetOrderOfRequest(5));
1138 EXPECT_EQ(6, GetOrderOfRequest(6));
1139 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171140
1141 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131142 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531143}
1144
1145// Make sure that we count connecting sockets against the total limit.
1146TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1147 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1148
robpercival214763f2016-07-01 23:27:011149 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1150 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1151 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531152
1153 // Create one asynchronous request.
1154 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011155 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531156
[email protected]6b175382009-10-13 06:47:471157 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1158 // actually become pending until 2ms after they have been created. In order
1159 // to flush all tasks, we need to wait so that we know there are no
1160 // soon-to-be-pending tasks waiting.
[email protected]26b9973962012-01-28 00:57:001161 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281162 base::RunLoop().RunUntilIdle();
[email protected]6b175382009-10-13 06:47:471163
[email protected]211d21722009-07-22 15:48:531164 // The next synchronous request should wait for its turn.
1165 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011166 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531167
[email protected]2431756e2010-09-29 20:26:131168 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531169
[email protected]2431756e2010-09-29 20:26:131170 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531171 client_socket_factory_.allocation_count());
1172
1173 EXPECT_EQ(1, GetOrderOfRequest(1));
1174 EXPECT_EQ(2, GetOrderOfRequest(2));
1175 EXPECT_EQ(3, GetOrderOfRequest(3));
1176 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171177 EXPECT_EQ(5, GetOrderOfRequest(5));
1178
1179 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131180 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531181}
1182
[email protected]6427fe22010-04-16 22:27:411183TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1184 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1185 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1186
robpercival214763f2016-07-01 23:27:011187 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1188 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1189 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1190 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411191
1192 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1193
1194 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1195
robpercival214763f2016-07-01 23:27:011196 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1197 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411198
1199 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1200
[email protected]2431756e2010-09-29 20:26:131201 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411202 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131203 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411204 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131205 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1206 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411207 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1208}
1209
[email protected]d7027bb2010-05-10 18:58:541210TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1211 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1212 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1213
1214 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521215 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131216 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541217 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151218 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201219 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541220
1221 ClientSocketHandle handles[4];
1222 for (size_t i = 0; i < arraysize(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521223 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201224 EXPECT_EQ(
1225 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541226 handles[i].Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201227 ClientSocketPool::RespectLimits::ENABLED,
1228 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541229 }
1230
1231 // One will be stalled, cancel all the handles now.
1232 // This should hit the OnAvailableSocketSlot() code where we previously had
1233 // stalled groups, but no longer have any.
1234 for (size_t i = 0; i < arraysize(handles); ++i)
1235 handles[i].Reset();
1236}
1237
[email protected]eb5a99382010-07-11 03:18:261238TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541239 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1240 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1241
[email protected]eb5a99382010-07-11 03:18:261242 {
1243 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521244 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261245 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:541246 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), params_,
1247 DEFAULT_PRIORITY, SocketTag(),
1248 ClientSocketPool::RespectLimits::ENABLED,
1249 callbacks[i].callback(), pool_.get(),
1250 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261251 }
1252
1253 // Force a stalled group.
1254 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521255 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201256 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541257 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201258 ClientSocketPool::RespectLimits::ENABLED,
1259 callback.callback(), pool_.get(),
1260 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261261
1262 // Cancel the stalled request.
1263 stalled_handle.Reset();
1264
1265 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1266 EXPECT_EQ(0, pool_->IdleSocketCount());
1267
1268 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541269 }
1270
[email protected]43a21b82010-06-10 21:30:541271 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1272 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261273}
[email protected]43a21b82010-06-10 21:30:541274
[email protected]eb5a99382010-07-11 03:18:261275TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1276 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1277 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1278
1279 {
1280 ClientSocketHandle handles[kDefaultMaxSockets];
1281 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521282 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201283 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541284 handles[i].Init(
1285 base::IntToString(i), params_, DEFAULT_PRIORITY,
1286 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1287 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261288 }
1289
1290 // Force a stalled group.
1291 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1292 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521293 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201294 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541295 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201296 ClientSocketPool::RespectLimits::ENABLED,
1297 callback.callback(), pool_.get(),
1298 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261299
1300 // Since it is stalled, it should have no connect jobs.
1301 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101302 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261303
1304 // Cancel the stalled request.
1305 handles[0].Reset();
1306
[email protected]eb5a99382010-07-11 03:18:261307 // Now we should have a connect job.
1308 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101309 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261310
1311 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011312 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261313
1314 EXPECT_EQ(kDefaultMaxSockets + 1,
1315 client_socket_factory_.allocation_count());
1316 EXPECT_EQ(0, pool_->IdleSocketCount());
1317 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101318 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261319
1320 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541321 }
1322
[email protected]eb5a99382010-07-11 03:18:261323 EXPECT_EQ(1, pool_->IdleSocketCount());
1324}
[email protected]43a21b82010-06-10 21:30:541325
[email protected]eb5a99382010-07-11 03:18:261326TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1327 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1328 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541329
[email protected]eb5a99382010-07-11 03:18:261330 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521331 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261332 {
[email protected]51fdc7c2012-04-10 19:19:481333 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261334 ClientSocketHandle handles[kDefaultMaxSockets];
1335 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521336 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201337 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
Paul Jensen8d6f87ec2018-01-13 00:46:541338 params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201339 ClientSocketPool::RespectLimits::ENABLED,
1340 callback.callback(), pool_.get(),
1341 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261342 }
1343
1344 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1345 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481346 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261347
1348 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201349 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541350 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201351 ClientSocketPool::RespectLimits::ENABLED,
1352 callback.callback(), pool_.get(),
1353 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481354 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261355
1356 // Dropping out of scope will close all handles and return them to idle.
1357 }
[email protected]43a21b82010-06-10 21:30:541358
1359 // But if we wait for it, the released idle sockets will be closed in
1360 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011361 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261362
1363 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1364 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541365}
1366
1367// Regression test for http://crbug.com/40952.
1368TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1369 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221370 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541371 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1372
1373 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1374 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521375 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201376 EXPECT_EQ(
1377 OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
Paul Jensen8d6f87ec2018-01-13 00:46:541378 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201379 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541380 }
1381
1382 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281383 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541384
1385 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1386 // reuse a socket.
1387 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1388 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521389 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541390
1391 // "0" is special here, since it should be the first entry in the sorted map,
1392 // which is the one which we would close an idle socket for. We shouldn't
1393 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201394 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:541395 handle.Init("0", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201396 ClientSocketPool::RespectLimits::ENABLED,
1397 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541398
1399 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1400 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1401}
1402
[email protected]ab838892009-06-30 18:49:051403TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531404 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091405
robpercival214763f2016-07-01 23:27:011406 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1407 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1408 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1409 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1410 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1411 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1412 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1413 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091414
[email protected]2431756e2010-09-29 20:26:131415 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201416 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1417 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131418 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1419 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091420
[email protected]c9d6a1d2009-07-14 16:15:201421 EXPECT_EQ(1, GetOrderOfRequest(1));
1422 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031423 EXPECT_EQ(8, GetOrderOfRequest(3));
1424 EXPECT_EQ(6, GetOrderOfRequest(4));
1425 EXPECT_EQ(4, GetOrderOfRequest(5));
1426 EXPECT_EQ(3, GetOrderOfRequest(6));
1427 EXPECT_EQ(5, GetOrderOfRequest(7));
1428 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171429
1430 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131431 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091432}
1433
[email protected]ab838892009-06-30 18:49:051434TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531435 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091436
robpercival214763f2016-07-01 23:27:011437 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1438 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1439 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1440 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1441 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1442 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1443 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091444
[email protected]2431756e2010-09-29 20:26:131445 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091446
[email protected]2431756e2010-09-29 20:26:131447 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011448 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201449
[email protected]2431756e2010-09-29 20:26:131450 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201451 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131452 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1453 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091454}
1455
1456// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051457// The pending connect job will be cancelled and should not call back into
1458// ClientSocketPoolBase.
1459TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531460 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201461
[email protected]ab838892009-06-30 18:49:051462 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131463 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521464 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151465 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541466 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151467 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201468 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131469 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091470}
1471
[email protected]ab838892009-06-30 18:49:051472TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531473 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201474
[email protected]ab838892009-06-30 18:49:051475 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061476 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521477 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091478
mmenked3641e12016-01-28 16:06:151479 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541480 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151481 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201482 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091483
1484 handle.Reset();
1485
[email protected]6ecf2b92011-12-15 01:14:521486 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131487 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541488 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151489 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201490 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091491
robpercival214763f2016-07-01 23:27:011492 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091493 EXPECT_FALSE(callback.have_result());
1494
1495 handle.Reset();
1496}
1497
[email protected]ab838892009-06-30 18:49:051498TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531499 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091500
robpercival214763f2016-07-01 23:27:011501 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1502 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1503 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1504 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1505 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1506 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1507 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091508
1509 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201510 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131511 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1512 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091513
[email protected]2431756e2010-09-29 20:26:131514 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091515
[email protected]c9d6a1d2009-07-14 16:15:201516 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1517 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131518 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1519 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091520
[email protected]c9d6a1d2009-07-14 16:15:201521 EXPECT_EQ(1, GetOrderOfRequest(1));
1522 EXPECT_EQ(2, GetOrderOfRequest(2));
1523 EXPECT_EQ(5, GetOrderOfRequest(3));
1524 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131525 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1526 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201527 EXPECT_EQ(4, GetOrderOfRequest(6));
1528 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171529
1530 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131531 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091532}
1533
mmenke33d24423d2015-05-19 19:41:091534// Function to be used as a callback on socket request completion. It first
1535// disconnects the successfully connected socket from the first request, and
1536// then reuses the ClientSocketHandle to request another socket.
1537//
1538// |nested_callback| is called with the result of the second socket request.
1539void RequestSocketOnComplete(ClientSocketHandle* handle,
1540 TestClientSocketPool* pool,
1541 TestConnectJobFactory* test_connect_job_factory,
1542 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411543 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091544 int first_request_result) {
robpercival214763f2016-07-01 23:27:011545 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091546
1547 test_connect_job_factory->set_job_type(next_job_type);
1548
1549 // Don't allow reuse of the socket. Disconnect it and then release it.
1550 if (handle->socket())
1551 handle->socket()->Disconnect();
1552 handle->Reset();
1553
mmenked3641e12016-01-28 16:06:151554 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091555 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541556 int rv = handle->Init("a", params, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151557 ClientSocketPool::RespectLimits::ENABLED,
Bence Békya4a50932018-08-10 13:39:411558 nested_callback->callback(), pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091559 if (rv != ERR_IO_PENDING) {
1560 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411561 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091562 } else {
1563 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521564 }
mmenke33d24423d2015-05-19 19:41:091565}
[email protected]f6d1d6eb2009-06-24 20:16:091566
mmenke33d24423d2015-05-19 19:41:091567// Tests the case where a second socket is requested in a completion callback,
1568// and the second socket connects asynchronously. Reuses the same
1569// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581570TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531571 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201572
[email protected]0b7648c2009-07-06 20:14:011573 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061574 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091575 TestCompletionCallback second_result_callback;
1576 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541577 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1578 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091579 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1580 connect_job_factory_, TestConnectJob::kMockPendingJob,
Bence Békya4a50932018-08-10 13:39:411581 &second_result_callback),
tfarina428341112016-09-22 13:38:201582 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011583 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091584
robpercival214763f2016-07-01 23:27:011585 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581586}
[email protected]f6d1d6eb2009-06-24 20:16:091587
mmenke33d24423d2015-05-19 19:41:091588// Tests the case where a second socket is requested in a completion callback,
1589// and the second socket connects synchronously. Reuses the same
1590// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581591TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531592 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201593
[email protected]0b7648c2009-07-06 20:14:011594 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061595 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091596 TestCompletionCallback second_result_callback;
1597 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541598 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1599 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091600 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1601 connect_job_factory_, TestConnectJob::kMockPendingJob,
Bence Békya4a50932018-08-10 13:39:411602 &second_result_callback),
tfarina428341112016-09-22 13:38:201603 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011604 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581605
robpercival214763f2016-07-01 23:27:011606 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091607}
1608
1609// Make sure that pending requests get serviced after active requests get
1610// cancelled.
[email protected]ab838892009-06-30 18:49:051611TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531612 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201613
[email protected]0b7648c2009-07-06 20:14:011614 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091615
robpercival214763f2016-07-01 23:27:011616 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1617 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1618 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1619 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1620 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1621 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1622 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091623
[email protected]c9d6a1d2009-07-14 16:15:201624 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1625 // Let's cancel them.
1626 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131627 ASSERT_FALSE(request(i)->handle()->is_initialized());
1628 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091629 }
1630
[email protected]f6d1d6eb2009-06-24 20:16:091631 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131632 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011633 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131634 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091635 }
1636
[email protected]2431756e2010-09-29 20:26:131637 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1638 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091639}
1640
1641// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051642TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531643 const size_t kMaxSockets = 5;
1644 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201645
[email protected]0b7648c2009-07-06 20:14:011646 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091647
[email protected]211d21722009-07-22 15:48:531648 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1649 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091650
1651 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531652 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011653 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091654
[email protected]211d21722009-07-22 15:48:531655 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011656 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091657}
1658
mmenke9d72fe42017-05-18 22:36:071659// Make sure that pending requests that complete synchronously get serviced
1660// after active requests fail. See https://crbug.com/723748
1661TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1662 const size_t kNumberOfRequests = 10;
1663 const size_t kMaxSockets = 1;
1664 CreatePool(kMaxSockets, kMaxSockets);
1665
1666 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1667
1668 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1669
1670 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1671
1672 // Queue up all the other requests
1673 for (size_t i = 1; i < kNumberOfRequests; ++i)
1674 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1675
1676 // Make sure all requests fail, instead of hanging.
1677 for (size_t i = 0; i < kNumberOfRequests; ++i)
1678 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1679}
1680
[email protected]5fc08e32009-07-15 17:09:571681TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531682 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571683
1684 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1685
[email protected]2431756e2010-09-29 20:26:131686 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521687 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541688 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151689 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201690 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011691 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571692
1693 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131694 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571695
Paul Jensen8d6f87ec2018-01-13 00:46:541696 rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151697 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201698 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011699 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1700 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571701
[email protected]2431756e2010-09-29 20:26:131702 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481703 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571704 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1705}
1706
xunjieli26619e72016-11-23 19:39:551707TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551708 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1709 ClientSocketHandle handle;
1710 TestCompletionCallback callback;
1711 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541712 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551713 ClientSocketPool::RespectLimits::ENABLED,
1714 callback.callback(), pool_.get(), log.bound());
1715 EXPECT_THAT(rv, IsOk());
1716 handle.Reset();
1717 EXPECT_EQ(1, pool_->IdleSocketCount());
1718 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551719}
1720
xunjieli92feb332017-03-03 17:19:231721TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231722 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1723 TestCompletionCallback callback;
1724 BoundTestNetLog log;
1725 ClientSocketHandle handle1;
Paul Jensen8d6f87ec2018-01-13 00:46:541726 int rv = handle1.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231727 ClientSocketPool::RespectLimits::ENABLED,
1728 callback.callback(), pool_.get(), log.bound());
1729 EXPECT_THAT(rv, IsOk());
1730 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541731 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231732 ClientSocketPool::RespectLimits::ENABLED,
1733 callback.callback(), pool_.get(), log.bound());
1734 ClientSocketHandle handle3;
Paul Jensen8d6f87ec2018-01-13 00:46:541735 rv = handle3.Init("b", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231736 ClientSocketPool::RespectLimits::ENABLED,
1737 callback.callback(), pool_.get(), log.bound());
1738 EXPECT_THAT(rv, IsOk());
1739 handle1.Reset();
1740 handle2.Reset();
1741 handle3.Reset();
1742 EXPECT_EQ(3, pool_->IdleSocketCount());
1743 pool_->CloseIdleSocketsInGroup("a");
1744 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231745}
1746
xunjieli26619e72016-11-23 19:39:551747TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551748 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1749 ClientSocketHandle handle;
1750 TestCompletionCallback callback;
1751 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541752 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551753 ClientSocketPool::RespectLimits::ENABLED,
1754 callback.callback(), pool_.get(), log.bound());
1755 EXPECT_THAT(rv, IsOk());
1756 StreamSocket* socket = handle.socket();
1757 handle.Reset();
1758 EXPECT_EQ(1, pool_->IdleSocketCount());
1759
1760 // Disconnect socket now to make the socket unusable.
1761 socket->Disconnect();
1762 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541763 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551764 ClientSocketPool::RespectLimits::ENABLED,
1765 callback.callback(), pool_.get(), log.bound());
1766 EXPECT_THAT(rv, IsOk());
1767 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551768}
1769
[email protected]2b7523d2009-07-29 20:29:231770// Regression test for http://crbug.com/17985.
1771TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1772 const int kMaxSockets = 3;
1773 const int kMaxSocketsPerGroup = 2;
1774 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1775
[email protected]ac790b42009-12-02 04:31:311776 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231777
robpercival214763f2016-07-01 23:27:011778 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1779 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231780
1781 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011782 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231783
1784 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011785 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231786
1787 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011788 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1789 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231790
[email protected]eb5a99382010-07-11 03:18:261791 // Release the first two sockets from "a". Because this is a keepalive,
1792 // the first release will unblock the pending request for "a". The
1793 // second release will unblock a request for "c", becaue it is the next
1794 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131795 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1796 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231797
1798 // Closing idle sockets should not get us into trouble, but in the bug
1799 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411800 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541801 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261802
[email protected]2da659e2013-05-23 20:51:341803 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281804 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231805}
1806
[email protected]4d3b05d2010-01-27 21:27:291807TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531808 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571809
1810 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131811 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521812 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511813 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541814 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151815 ClientSocketPool::RespectLimits::ENABLED,
1816 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011817 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131818 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481819 TestLoadTimingInfoNotConnected(handle);
1820
robpercival214763f2016-07-01 23:27:011821 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131822 EXPECT_TRUE(handle.is_initialized());
1823 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481824 TestLoadTimingInfoConnectedNotReused(handle);
1825
[email protected]2431756e2010-09-29 20:26:131826 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481827 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301828
mmenke43758e62015-05-04 21:09:461829 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401830 log.GetEntries(&entries);
1831
1832 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001833 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171834 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001835 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1836 NetLogEventPhase::NONE));
1837 EXPECT_TRUE(LogContainsEvent(entries, 2,
1838 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1839 NetLogEventPhase::NONE));
1840 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571841}
1842
[email protected]4d3b05d2010-01-27 21:27:291843TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571844 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531845 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571846
1847 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131848 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521849 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511850 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181851 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131852 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431853 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451854 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131855 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151856 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541857 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151858 ClientSocketPool::RespectLimits::ENABLED,
1859 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131860 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011861 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131862 EXPECT_FALSE(handle.is_ssl_error());
1863 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301864
mmenke43758e62015-05-04 21:09:461865 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401866 log.GetEntries(&entries);
1867
1868 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001869 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171870 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001871 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1872 NetLogEventPhase::NONE));
1873 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571874}
1875
mmenke6be122f2015-03-09 22:22:471876// Check that an async ConnectJob failure does not result in creation of a new
1877// ConnectJob when there's another pending request also waiting on its own
1878// ConnectJob. See http://crbug.com/463960.
1879TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1880 CreatePool(2, 2);
1881 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1882
robpercival214763f2016-07-01 23:27:011883 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1884 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471885
robpercival214763f2016-07-01 23:27:011886 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1887 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471888
1889 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1890}
1891
[email protected]4d3b05d2010-01-27 21:27:291892TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101893 // TODO(eroman): Add back the log expectations! Removed them because the
1894 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531895 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571896
1897 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131898 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521899 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131900 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521901 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571902
[email protected]2431756e2010-09-29 20:26:131903 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541904 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151905 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201906 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511907 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201908 EXPECT_EQ(
1909 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541910 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201911 ClientSocketPool::RespectLimits::ENABLED,
1912 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571913
[email protected]2431756e2010-09-29 20:26:131914 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571915
[email protected]fd7b7c92009-08-20 19:38:301916
1917 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301918
robpercival214763f2016-07-01 23:27:011919 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131920 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301921
1922 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531923 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571924}
1925
[email protected]4d3b05d2010-01-27 21:27:291926TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341927 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1928
[email protected]17a0c6c2009-08-04 00:07:041929 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1930
robpercival214763f2016-07-01 23:27:011931 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1932 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1933 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1934 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341935
1936 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131937 (*requests())[2]->handle()->Reset();
1938 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341939 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1940
[email protected]2431756e2010-09-29 20:26:131941 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341942 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1943
[email protected]2431756e2010-09-29 20:26:131944 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261945 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341946}
1947
[email protected]5fc08e32009-07-15 17:09:571948// When requests and ConnectJobs are not coupled, the request will get serviced
1949// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291950TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531951 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571952
1953 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321954 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571955
[email protected]2431756e2010-09-29 20:26:131956 std::vector<TestSocketRequest*> request_order;
1957 size_t completion_count; // unused
1958 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541959 int rv =
1960 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1961 ClientSocketPool::RespectLimits::ENABLED,
1962 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011963 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1964 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571965
1966 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1967 // without a job.
1968 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1969
[email protected]2431756e2010-09-29 20:26:131970 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541971 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151972 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201973 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011974 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131975 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541976 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151977 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201978 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011979 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571980
1981 // Both Requests 2 and 3 are pending. We release socket 1 which should
1982 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331983 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341984 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281985 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331986 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011987 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331988 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571989
1990 // Signal job 2, which should service request 3.
1991
1992 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011993 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571994
[email protected]2431756e2010-09-29 20:26:131995 ASSERT_EQ(3U, request_order.size());
1996 EXPECT_EQ(&req1, request_order[0]);
1997 EXPECT_EQ(&req2, request_order[1]);
1998 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571999 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2000}
2001
2002// The requests are not coupled to the jobs. So, the requests should finish in
2003// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292004TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532005 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572006 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322007 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572008
[email protected]2431756e2010-09-29 20:26:132009 std::vector<TestSocketRequest*> request_order;
2010 size_t completion_count; // unused
2011 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542012 int rv =
2013 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2014 ClientSocketPool::RespectLimits::ENABLED,
2015 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012016 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572017
[email protected]2431756e2010-09-29 20:26:132018 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542019 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152020 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202021 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012022 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572023
2024 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322025 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572026
[email protected]2431756e2010-09-29 20:26:132027 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542028 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152029 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202030 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012031 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572032
robpercival214763f2016-07-01 23:27:012033 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2034 EXPECT_THAT(req2.WaitForResult(), IsOk());
2035 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572036
[email protected]2431756e2010-09-29 20:26:132037 ASSERT_EQ(3U, request_order.size());
2038 EXPECT_EQ(&req1, request_order[0]);
2039 EXPECT_EQ(&req2, request_order[1]);
2040 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572041}
2042
[email protected]03b7c8c2013-07-20 04:38:552043// Test GetLoadState in the case there's only one socket request.
2044TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532045 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552046 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572047
[email protected]2431756e2010-09-29 20:26:132048 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522049 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542050 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152051 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202052 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012053 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552054 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572055
[email protected]03b7c8c2013-07-20 04:38:552056 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2057 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2058
2059 // No point in completing the connection, since ClientSocketHandles only
2060 // expect the LoadState to be checked while connecting.
2061}
2062
2063// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:002064// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:552065TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2066 CreatePool(2, 2);
2067 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2068
2069 ClientSocketHandle handle;
2070 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542071 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152072 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202073 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012074 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002075 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2076
2077 ClientSocketHandle handle2;
2078 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542079 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152080 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202081 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012082 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002083 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2084
2085 // Check that both handles report the state of the first job.
2086 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2087 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2088
2089 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2090
2091 // Check that both handles change to LOAD_STATE_CONNECTING.
2092 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2093 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2094}
2095
2096// Test that the second connection request does not affect the pool's load
2097// status.
2098TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
2099 CreatePool(2, 2);
2100 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2101
2102 ClientSocketHandle handle;
2103 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542104 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152105 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202106 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012107 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572108
[email protected]2431756e2010-09-29 20:26:132109 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522110 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542111 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152112 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202113 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012114 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002115 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552116
[email protected]03b7c8c2013-07-20 04:38:552117 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2118 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2119
haavardm835c1d62015-04-22 08:18:002120 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552121 // second handle switches to the state of the remaining ConnectJob.
2122 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012123 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002124 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552125}
2126
2127// Test GetLoadState in the case the per-group limit is reached.
2128TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2129 CreatePool(2, 1);
2130 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2131
2132 ClientSocketHandle handle;
2133 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542134 int rv = handle.Init("a", params_, MEDIUM, SocketTag(),
mmenked3641e12016-01-28 16:06:152135 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202136 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012137 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552138 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2139
2140 // Request another socket from the same pool, buth with a higher priority.
2141 // The first request should now be stalled at the socket group limit.
2142 ClientSocketHandle handle2;
2143 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542144 rv = handle2.Init("a", params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152145 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202146 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012147 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552148 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2149 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2150
2151 // The first handle should remain stalled as the other socket goes through
2152 // the connect process.
2153
2154 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2155 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2156 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2157
2158 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012159 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552160 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2161
2162 // Closing the second socket should cause the stalled handle to finally get a
2163 // ConnectJob.
2164 handle2.socket()->Disconnect();
2165 handle2.Reset();
2166 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2167}
2168
2169// Test GetLoadState in the case the per-pool limit is reached.
2170TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2171 CreatePool(2, 2);
2172 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2173
2174 ClientSocketHandle handle;
2175 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542176 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152177 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202178 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012179 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552180
2181 // Request for socket from another pool.
2182 ClientSocketHandle handle2;
2183 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542184 rv = handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152185 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202186 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012187 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552188
2189 // Request another socket from the first pool. Request should stall at the
2190 // socket pool limit.
2191 ClientSocketHandle handle3;
2192 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542193 rv = handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152194 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202195 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012196 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552197
2198 // The third handle should remain stalled as the other sockets in its group
2199 // goes through the connect process.
2200
2201 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2202 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2203
2204 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2205 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2206 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2207
2208 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012209 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552210 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2211
2212 // Closing a socket should allow the stalled handle to finally get a new
2213 // ConnectJob.
2214 handle.socket()->Disconnect();
2215 handle.Reset();
2216 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572217}
2218
[email protected]e772db3f2010-07-12 18:11:132219TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2220 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2221 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2222
[email protected]2431756e2010-09-29 20:26:132223 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522224 TestCompletionCallback callback;
2225 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
Paul Jensen8d6f87ec2018-01-13 00:46:542226 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152227 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202228 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132229 EXPECT_TRUE(handle.is_initialized());
2230 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132231}
2232
2233TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2234 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2235
2236 connect_job_factory_->set_job_type(
2237 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132238 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522239 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132240 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542241 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152242 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202243 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132244 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012245 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132246 EXPECT_TRUE(handle.is_initialized());
2247 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132248}
2249
[email protected]e60e47a2010-07-14 03:37:182250TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2251 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2252 connect_job_factory_->set_job_type(
2253 TestConnectJob::kMockAdditionalErrorStateJob);
2254
[email protected]2431756e2010-09-29 20:26:132255 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522256 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132257 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:542258 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152259 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202260 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132261 EXPECT_FALSE(handle.is_initialized());
2262 EXPECT_FALSE(handle.socket());
2263 EXPECT_TRUE(handle.is_ssl_error());
2264 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182265}
2266
2267TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2268 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2269
2270 connect_job_factory_->set_job_type(
2271 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132272 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522273 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132274 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542275 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152276 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202277 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132278 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012279 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132280 EXPECT_FALSE(handle.is_initialized());
2281 EXPECT_FALSE(handle.socket());
2282 EXPECT_TRUE(handle.is_ssl_error());
2283 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182284}
2285
martijn003cd612016-05-19 22:24:382286// Make sure we can reuse sockets.
2287TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412288 CreatePoolWithIdleTimeouts(
2289 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032290 base::TimeDelta(), // Time out unused sockets immediately.
2291 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2292
2293 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2294
2295 ClientSocketHandle handle;
2296 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542297 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152298 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202299 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012300 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032301 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012302 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032303
2304 // Use and release the socket.
Bence Békybdbb0e72018-08-07 21:42:592305 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382306 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482307 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032308 handle.Reset();
2309
2310 // Should now have one idle socket.
2311 ASSERT_EQ(1, pool_->IdleSocketCount());
2312
2313 // Request a new socket. This should reuse the old socket and complete
2314 // synchronously.
vishal.b62985ca92015-04-17 08:45:512315 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:542316 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152317 ClientSocketPool::RespectLimits::ENABLED,
Bence Békybdbb0e72018-08-07 21:42:592318 CompletionOnceCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012319 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032320 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482321 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032322
2323 ASSERT_TRUE(pool_->HasGroup("a"));
2324 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2325 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2326
mmenke43758e62015-05-04 21:09:462327 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032328 log.GetEntries(&entries);
2329 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002330 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032331}
2332
martijn003cd612016-05-19 22:24:382333// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172334TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032335 CreatePoolWithIdleTimeouts(
2336 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2337 base::TimeDelta(), // Time out unused sockets immediately
2338 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412339
2340 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2341
2342 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2343
2344 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522345 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542346 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152347 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202348 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012349 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412350 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2351
2352 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522353 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542354 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152355 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202356 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012357 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412358 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2359
2360 // Cancel one of the requests. Wait for the other, which will get the first
2361 // job. Release the socket. Run the loop again to make sure the second
2362 // socket is sitting idle and the first one is released (since ReleaseSocket()
2363 // just posts a DoReleaseSocket() task).
2364
2365 handle.Reset();
robpercival214763f2016-07-01 23:27:012366 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412367 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:592368 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382369 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412370 handle2.Reset();
2371
[email protected]e7b1c6d2c2012-05-05 00:54:032372 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2373 // actually become pending until 2ms after they have been created. In order
2374 // to flush all tasks, we need to wait so that we know there are no
2375 // soon-to-be-pending tasks waiting.
2376 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:282377 base::RunLoop().RunUntilIdle();
[email protected]64770b7d2011-11-16 04:30:412378
[email protected]e7b1c6d2c2012-05-05 00:54:032379 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412380 ASSERT_EQ(2, pool_->IdleSocketCount());
2381
2382 // Request a new socket. This should cleanup the unused and timed out ones.
2383 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512384 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522385 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542386 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152387 ClientSocketPool::RespectLimits::ENABLED,
2388 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012389 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2390 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412391 EXPECT_FALSE(handle.is_reused());
2392
[email protected]e7b1c6d2c2012-05-05 00:54:032393 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412394 ASSERT_TRUE(pool_->HasGroup("a"));
2395 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2396 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2397
mmenke43758e62015-05-04 21:09:462398 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412399 log.GetEntries(&entries);
2400 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002401 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412402}
2403
[email protected]2041cf342010-02-19 03:15:592404// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162405// because of multiple releasing disconnected sockets.
2406TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2407 CreatePoolWithIdleTimeouts(
2408 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2409 base::TimeDelta(), // Time out unused sockets immediately.
2410 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2411
2412 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2413
2414 // Startup 4 connect jobs. Two of them will be pending.
2415
[email protected]2431756e2010-09-29 20:26:132416 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522417 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542418 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152419 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202420 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012421 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162422
[email protected]2431756e2010-09-29 20:26:132423 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522424 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542425 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152426 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202427 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012428 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162429
[email protected]2431756e2010-09-29 20:26:132430 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522431 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542432 rv = handle3.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152433 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202434 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012435 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162436
[email protected]2431756e2010-09-29 20:26:132437 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522438 TestCompletionCallback callback4;
Paul Jensen8d6f87ec2018-01-13 00:46:542439 rv = handle4.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152440 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202441 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012442 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162443
2444 // Release two disconnected sockets.
2445
[email protected]2431756e2010-09-29 20:26:132446 handle.socket()->Disconnect();
2447 handle.Reset();
2448 handle2.socket()->Disconnect();
2449 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162450
robpercival214763f2016-07-01 23:27:012451 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132452 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012453 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132454 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162455}
2456
[email protected]d7027bb2010-05-10 18:58:542457// Regression test for http://crbug.com/42267.
2458// When DoReleaseSocket() is processed for one socket, it is blocked because the
2459// other stalled groups all have releasing sockets, so no progress can be made.
2460TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2461 CreatePoolWithIdleTimeouts(
2462 4 /* socket limit */, 4 /* socket limit per group */,
2463 base::TimeDelta(), // Time out unused sockets immediately.
2464 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2465
2466 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2467
2468 // Max out the socket limit with 2 per group.
2469
[email protected]2431756e2010-09-29 20:26:132470 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522471 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132472 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522473 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542474
2475 for (int i = 0; i < 2; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:542476 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152477 ClientSocketPool::RespectLimits::ENABLED,
2478 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202479 NetLogWithSource()));
Paul Jensen8d6f87ec2018-01-13 00:46:542480 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152481 ClientSocketPool::RespectLimits::ENABLED,
2482 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202483 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542484 }
[email protected]b89f7e42010-05-20 20:37:002485
[email protected]d7027bb2010-05-10 18:58:542486 // Make 4 pending requests, 2 per group.
2487
2488 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202489 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542490 handle_a[i].Init("a", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202491 ClientSocketPool::RespectLimits::ENABLED,
2492 callback_a[i].callback(), pool_.get(),
2493 NetLogWithSource()));
2494 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542495 handle_b[i].Init("b", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202496 ClientSocketPool::RespectLimits::ENABLED,
2497 callback_b[i].callback(), pool_.get(),
2498 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542499 }
2500
2501 // Release b's socket first. The order is important, because in
2502 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2503 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2504 // first, which has a releasing socket, so it refuses to start up another
2505 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132506 handle_b[0].socket()->Disconnect();
2507 handle_b[0].Reset();
2508 handle_a[0].socket()->Disconnect();
2509 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542510
2511 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282512 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542513
[email protected]2431756e2010-09-29 20:26:132514 handle_b[1].socket()->Disconnect();
2515 handle_b[1].Reset();
2516 handle_a[1].socket()->Disconnect();
2517 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542518
2519 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012520 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2521 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542522 }
2523}
2524
[email protected]fd4fe0b2010-02-08 23:02:152525TEST_F(ClientSocketPoolBaseTest,
2526 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2527 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2528
2529 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2530
robpercival214763f2016-07-01 23:27:012531 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2532 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2533 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2534 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152535
robpercival214763f2016-07-01 23:27:012536 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2537 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132538 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152539
2540 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132541 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012542 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152543
[email protected]2431756e2010-09-29 20:26:132544 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012545 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132546 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152547
2548 EXPECT_EQ(1, GetOrderOfRequest(1));
2549 EXPECT_EQ(2, GetOrderOfRequest(2));
2550 EXPECT_EQ(3, GetOrderOfRequest(3));
2551 EXPECT_EQ(4, GetOrderOfRequest(4));
2552
2553 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132554 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152555}
2556
[email protected]6ecf2b92011-12-15 01:14:522557class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042558 public:
[email protected]2431756e2010-09-29 20:26:132559 TestReleasingSocketRequest(TestClientSocketPool* pool,
2560 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182561 bool reset_releasing_handle)
2562 : pool_(pool),
2563 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042564 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522565
Chris Watkins7a41d3552017-12-01 02:13:272566 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042567
2568 ClientSocketHandle* handle() { return &handle_; }
2569
Bence Béky8ddc2492018-06-13 01:02:042570 CompletionOnceCallback callback() {
2571 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2572 base::Unretained(this));
2573 }
[email protected]4f1e4982010-03-02 18:31:042574
2575 private:
[email protected]6ecf2b92011-12-15 01:14:522576 void OnComplete(int result) {
2577 SetResult(result);
2578 if (reset_releasing_handle_)
2579 handle_.Reset();
2580
mmenked3641e12016-01-28 16:06:152581 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
Bence Béky8ddc2492018-06-13 01:02:042582 EXPECT_EQ(
2583 expected_result_,
2584 handle2_.Init("a", con_params, DEFAULT_PRIORITY, SocketTag(),
2585 ClientSocketPool::RespectLimits::ENABLED,
2586 CompletionOnceCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522587 }
2588
[email protected]2431756e2010-09-29 20:26:132589 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182590 int expected_result_;
2591 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042592 ClientSocketHandle handle_;
2593 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042594};
2595
[email protected]e60e47a2010-07-14 03:37:182596
2597TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2598 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2599
robpercival214763f2016-07-01 23:27:012600 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2601 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2602 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182603
[email protected]2431756e2010-09-29 20:26:132604 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182605 client_socket_factory_.allocation_count());
2606
2607 connect_job_factory_->set_job_type(
2608 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2609 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202610 EXPECT_EQ(
2611 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542612 req.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202613 ClientSocketPool::RespectLimits::ENABLED,
2614 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182615 // The next job should complete synchronously
2616 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2617
robpercival214763f2016-07-01 23:27:012618 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182619 EXPECT_FALSE(req.handle()->is_initialized());
2620 EXPECT_FALSE(req.handle()->socket());
2621 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432622 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182623}
2624
[email protected]b6501d3d2010-06-03 23:53:342625// http://crbug.com/44724 regression test.
2626// We start releasing the pool when we flush on network change. When that
2627// happens, the only active references are in the ClientSocketHandles. When a
2628// ConnectJob completes and calls back into the last ClientSocketHandle, that
2629// callback can release the last reference and delete the pool. After the
2630// callback finishes, we go back to the stack frame within the now-deleted pool.
2631// Executing any code that refers to members of the now-deleted pool can cause
2632// crashes.
2633TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2634 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2635 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2636
2637 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522638 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152639 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542640 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152641 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202642 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342643
[email protected]7af985a2012-12-14 22:40:422644 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342645
2646 // We'll call back into this now.
2647 callback.WaitForResult();
2648}
2649
[email protected]a7e38572010-06-07 18:22:242650TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2651 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2652 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2653
2654 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522655 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152656 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542657 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152658 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202659 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012660 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242661 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2662
[email protected]7af985a2012-12-14 22:40:422663 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242664
2665 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282666 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242667
mmenked3641e12016-01-28 16:06:152668 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542669 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152670 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202671 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012672 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242673 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2674}
2675
[email protected]6ecf2b92011-12-15 01:14:522676class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142677 public:
Bence Béky8ddc2492018-06-13 01:02:042678 ConnectWithinCallback(const std::string& group_name,
2679 const scoped_refptr<TestSocketParams>& params,
2680 TestClientSocketPool* pool)
2681 : group_name_(group_name), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142682
Chris Watkins7a41d3552017-12-01 02:13:272683 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142684
2685 int WaitForNestedResult() {
2686 return nested_callback_.WaitForResult();
2687 }
2688
Bence Béky8ddc2492018-06-13 01:02:042689 CompletionOnceCallback callback() {
2690 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2691 base::Unretained(this));
2692 }
[email protected]6ecf2b92011-12-15 01:14:522693
[email protected]06f92462010-08-31 19:24:142694 private:
[email protected]6ecf2b92011-12-15 01:14:522695 void OnComplete(int result) {
2696 SetResult(result);
tfarina428341112016-09-22 13:38:202697 EXPECT_EQ(
2698 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542699 handle_.Init(group_name_, params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202700 ClientSocketPool::RespectLimits::ENABLED,
2701 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522702 }
2703
[email protected]06f92462010-08-31 19:24:142704 const std::string group_name_;
2705 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132706 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142707 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522708 TestCompletionCallback nested_callback_;
2709
2710 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142711};
2712
2713TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2714 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2715
2716 // First job will be waiting until it gets aborted.
2717 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2718
2719 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132720 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152721 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542722 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152723 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202724 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142725
2726 // Second job will be started during the first callback, and will
2727 // asynchronously complete with OK.
2728 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422729 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012730 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2731 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142732}
2733
[email protected]25eea382010-07-10 23:55:262734// Cancel a pending socket request while we're at max sockets,
2735// and verify that the backup socket firing doesn't cause a crash.
2736TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2737 // Max 4 sockets globally, max 4 sockets per group.
2738 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222739 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262740
[email protected]4baaf9d2010-08-31 15:15:442741 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2742 // timer.
[email protected]25eea382010-07-10 23:55:262743 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2744 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522745 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152746 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542747 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152748 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202749 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262750
2751 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2752 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2753 ClientSocketHandle handles[kDefaultMaxSockets];
2754 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522755 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542756 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202757 ClientSocketPool::RespectLimits::ENABLED,
2758 callback.callback(), pool_.get(),
2759 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262760 }
2761
fdoray5eeb7642016-06-22 16:11:282762 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262763
2764 // Cancel the pending request.
2765 handle.Reset();
2766
2767 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002768 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2769 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262770
fdoray5eeb7642016-06-22 16:11:282771 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262772 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2773}
2774
[email protected]3f00be82010-09-27 19:50:022775TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442776 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2777 pool_->EnableConnectBackupJobs();
2778
2779 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2780 // timer.
2781 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2782 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522783 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152784 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542785 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152786 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202787 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442788 ASSERT_TRUE(pool_->HasGroup("bar"));
2789 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102790 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442791
2792 // Cancel the socket request. This should cancel the backup timer. Wait for
2793 // the backup time to see if it indeed got canceled.
2794 handle.Reset();
2795 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002796 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2797 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282798 base::RunLoop().RunUntilIdle();
[email protected]4baaf9d2010-08-31 15:15:442799 ASSERT_TRUE(pool_->HasGroup("bar"));
2800 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2801}
2802
[email protected]3f00be82010-09-27 19:50:022803TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2804 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2805 pool_->EnableConnectBackupJobs();
2806
2807 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2808 // timer.
2809 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2810 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522811 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152812 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542813 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152814 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202815 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022816 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2817 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522818 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202819 EXPECT_EQ(
2820 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542821 handle2.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202822 ClientSocketPool::RespectLimits::ENABLED,
2823 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022824 ASSERT_TRUE(pool_->HasGroup("bar"));
2825 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2826
2827 // Cancel request 1 and then complete request 2. With the requests finished,
2828 // the backup timer should be cancelled.
2829 handle.Reset();
robpercival214763f2016-07-01 23:27:012830 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022831 // Wait for the backup timer to fire (add some slop to ensure it fires)
[email protected]26b9973962012-01-28 00:57:002832 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
2833 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
fdoray5eeb7642016-06-22 16:11:282834 base::RunLoop().RunUntilIdle();
[email protected]3f00be82010-09-27 19:50:022835}
2836
[email protected]eb5a99382010-07-11 03:18:262837// Test delayed socket binding for the case where we have two connects,
2838// and while one is waiting on a connect, the other frees up.
2839// The socket waiting on a connect should switch immediately to the freed
2840// up socket.
2841TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2842 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2843 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2844
2845 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522846 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132847 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542848 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152849 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202850 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012851 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262852
2853 // No idle sockets, no pending jobs.
2854 EXPECT_EQ(0, pool_->IdleSocketCount());
2855 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2856
2857 // Create a second socket to the same host, but this one will wait.
2858 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2859 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132860 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542861 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152862 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202863 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262864 // No idle sockets, and one connecting job.
2865 EXPECT_EQ(0, pool_->IdleSocketCount());
2866 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2867
2868 // Return the first handle to the pool. This will initiate the delayed
2869 // binding.
2870 handle1.Reset();
2871
fdoray5eeb7642016-06-22 16:11:282872 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262873
2874 // Still no idle sockets, still one pending connect job.
2875 EXPECT_EQ(0, pool_->IdleSocketCount());
2876 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2877
2878 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012879 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262880
2881 // And we can see there is still one job waiting.
2882 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2883
2884 // Finally, signal the waiting Connect.
2885 client_socket_factory_.SignalJobs();
2886 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2887
fdoray5eeb7642016-06-22 16:11:282888 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262889}
2890
2891// Test delayed socket binding when a group is at capacity and one
2892// of the group's sockets frees up.
2893TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2894 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2895 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2896
2897 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522898 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132899 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542900 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152901 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202902 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012903 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262904
2905 // No idle sockets, no pending jobs.
2906 EXPECT_EQ(0, pool_->IdleSocketCount());
2907 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2908
2909 // Create a second socket to the same host, but this one will wait.
2910 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2911 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132912 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542913 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152914 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202915 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262916 // No idle sockets, and one connecting job.
2917 EXPECT_EQ(0, pool_->IdleSocketCount());
2918 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2919
2920 // Return the first handle to the pool. This will initiate the delayed
2921 // binding.
2922 handle1.Reset();
2923
fdoray5eeb7642016-06-22 16:11:282924 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262925
2926 // Still no idle sockets, still one pending connect job.
2927 EXPECT_EQ(0, pool_->IdleSocketCount());
2928 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2929
2930 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012931 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262932
2933 // And we can see there is still one job waiting.
2934 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2935
2936 // Finally, signal the waiting Connect.
2937 client_socket_factory_.SignalJobs();
2938 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2939
fdoray5eeb7642016-06-22 16:11:282940 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262941}
2942
2943// Test out the case where we have one socket connected, one
2944// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512945// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262946// should complete, by taking the first socket's idle socket.
2947TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2948 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2949 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2950
2951 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522952 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132953 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542954 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152955 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202956 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012957 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262958
2959 // No idle sockets, no pending jobs.
2960 EXPECT_EQ(0, pool_->IdleSocketCount());
2961 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2962
2963 // Create a second socket to the same host, but this one will wait.
2964 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2965 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132966 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542967 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152968 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202969 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262970 // No idle sockets, and one connecting job.
2971 EXPECT_EQ(0, pool_->IdleSocketCount());
2972 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2973
2974 // Return the first handle to the pool. This will initiate the delayed
2975 // binding.
2976 handle1.Reset();
2977
fdoray5eeb7642016-06-22 16:11:282978 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262979
2980 // Still no idle sockets, still one pending connect job.
2981 EXPECT_EQ(0, pool_->IdleSocketCount());
2982 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2983
2984 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012985 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262986
2987 // And we can see there is still one job waiting.
2988 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2989
2990 // Finally, signal the waiting Connect.
2991 client_socket_factory_.SignalJobs();
2992 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2993
fdoray5eeb7642016-06-22 16:11:282994 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262995}
2996
[email protected]2abfe90a2010-08-25 17:49:512997// Cover the case where on an available socket slot, we have one pending
2998// request that completes synchronously, thereby making the Group empty.
2999TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3000 const int kUnlimitedSockets = 100;
3001 const int kOneSocketPerGroup = 1;
3002 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3003
3004 // Make the first request asynchronous fail.
3005 // This will free up a socket slot later.
3006 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3007
3008 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523009 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203010 EXPECT_EQ(
3011 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543012 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203013 ClientSocketPool::RespectLimits::ENABLED,
3014 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513015 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3016
3017 // Make the second request synchronously fail. This should make the Group
3018 // empty.
3019 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3020 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523021 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513022 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3023 // when created.
tfarina428341112016-09-22 13:38:203024 EXPECT_EQ(
3025 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543026 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203027 ClientSocketPool::RespectLimits::ENABLED,
3028 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513029
3030 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3031
robpercival214763f2016-07-01 23:27:013032 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3033 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:513034 EXPECT_FALSE(pool_->HasGroup("a"));
3035}
3036
[email protected]e1b54dc2010-10-06 21:27:223037TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3038 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3039
3040 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3041
3042 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523043 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203044 EXPECT_EQ(
3045 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543046 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203047 ClientSocketPool::RespectLimits::ENABLED,
3048 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223049
3050 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523051 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203052 EXPECT_EQ(
3053 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543054 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203055 ClientSocketPool::RespectLimits::ENABLED,
3056 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223057 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523058 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203059 EXPECT_EQ(
3060 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543061 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203062 ClientSocketPool::RespectLimits::ENABLED,
3063 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223064
robpercival214763f2016-07-01 23:27:013065 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3066 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3067 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223068
3069 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:593070 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383071 TRAFFIC_ANNOTATION_FOR_TESTS));
Bence Békybdbb0e72018-08-07 21:42:593072 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383073 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223074
3075 handle1.Reset();
3076 handle2.Reset();
3077 handle3.Reset();
3078
tfarina428341112016-09-22 13:38:203079 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543080 OK, handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203081 ClientSocketPool::RespectLimits::ENABLED,
3082 callback1.callback(), pool_.get(), NetLogWithSource()));
3083 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543084 OK, handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203085 ClientSocketPool::RespectLimits::ENABLED,
3086 callback2.callback(), pool_.get(), NetLogWithSource()));
3087 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543088 OK, handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203089 ClientSocketPool::RespectLimits::ENABLED,
3090 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223091
3092 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3093 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3094 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3095}
3096
[email protected]2c2bef152010-10-13 00:55:033097TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3098 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3099 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3100
Charlie Harrison55ce6082018-05-14 02:25:573101 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033102
3103 ASSERT_TRUE(pool_->HasGroup("a"));
3104 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103105 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033106 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3107
3108 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523109 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203110 EXPECT_EQ(
3111 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543112 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203113 ClientSocketPool::RespectLimits::ENABLED,
3114 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033115
3116 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523117 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203118 EXPECT_EQ(
3119 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543120 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203121 ClientSocketPool::RespectLimits::ENABLED,
3122 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033123
3124 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103125 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033126 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3127
robpercival214763f2016-07-01 23:27:013128 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3129 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033130 handle1.Reset();
3131 handle2.Reset();
3132
3133 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103134 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033135 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3136}
3137
3138TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3139 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3140 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3141
3142 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523143 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203144 EXPECT_EQ(
3145 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543146 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203147 ClientSocketPool::RespectLimits::ENABLED,
3148 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033149
3150 ASSERT_TRUE(pool_->HasGroup("a"));
3151 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103152 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033153 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3154
Charlie Harrison55ce6082018-05-14 02:25:573155 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033156
3157 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103158 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033159 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3160
3161 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523162 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203163 EXPECT_EQ(
3164 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543165 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203166 ClientSocketPool::RespectLimits::ENABLED,
3167 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033168
3169 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103170 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033171 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3172
robpercival214763f2016-07-01 23:27:013173 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3174 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033175 handle1.Reset();
3176 handle2.Reset();
3177
3178 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103179 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033180 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3181}
3182
3183TEST_F(ClientSocketPoolBaseTest,
3184 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3185 CreatePool(4, 4);
3186 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3187
3188 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523189 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203190 EXPECT_EQ(
3191 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543192 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203193 ClientSocketPool::RespectLimits::ENABLED,
3194 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033195
3196 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523197 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203198 EXPECT_EQ(
3199 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543200 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203201 ClientSocketPool::RespectLimits::ENABLED,
3202 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033203
3204 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523205 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203206 EXPECT_EQ(
3207 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543208 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203209 ClientSocketPool::RespectLimits::ENABLED,
3210 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033211
3212 ASSERT_TRUE(pool_->HasGroup("a"));
3213 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103214 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033215 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3216
Charlie Harrison55ce6082018-05-14 02:25:573217 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033218
3219 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103220 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033221 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3222
robpercival214763f2016-07-01 23:27:013223 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3224 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3225 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033226 handle1.Reset();
3227 handle2.Reset();
3228 handle3.Reset();
3229
3230 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103231 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033232 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3233}
3234
3235TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3236 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3237 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3238
3239 ASSERT_FALSE(pool_->HasGroup("a"));
3240
Charlie Harrison55ce6082018-05-14 02:25:573241 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033242
3243 ASSERT_TRUE(pool_->HasGroup("a"));
3244 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103245 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033246
3247 ASSERT_FALSE(pool_->HasGroup("b"));
3248
Charlie Harrison55ce6082018-05-14 02:25:573249 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033250
3251 ASSERT_FALSE(pool_->HasGroup("b"));
3252}
3253
3254TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3255 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3256 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3257
3258 ASSERT_FALSE(pool_->HasGroup("a"));
3259
3260 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573261 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033262
3263 ASSERT_TRUE(pool_->HasGroup("a"));
3264 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103265 EXPECT_EQ(kDefaultMaxSockets - 1,
3266 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483267 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033268
3269 ASSERT_FALSE(pool_->HasGroup("b"));
3270
Charlie Harrison55ce6082018-05-14 02:25:573271 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033272
3273 ASSERT_TRUE(pool_->HasGroup("b"));
3274 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483275 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033276}
3277
3278TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3279 CreatePool(4, 4);
3280 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3281
3282 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523283 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203284 EXPECT_EQ(
3285 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543286 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203287 ClientSocketPool::RespectLimits::ENABLED,
3288 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013289 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033290 handle1.Reset();
3291
3292 ASSERT_TRUE(pool_->HasGroup("a"));
3293 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103294 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033295 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3296
Charlie Harrison55ce6082018-05-14 02:25:573297 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033298
3299 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103300 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033301 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3302}
3303
3304TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3305 CreatePool(4, 4);
3306 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3307
3308 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523309 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203310 EXPECT_EQ(
3311 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543312 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203313 ClientSocketPool::RespectLimits::ENABLED,
3314 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013315 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033316
3317 ASSERT_TRUE(pool_->HasGroup("a"));
3318 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103319 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033320 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3321 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3322
Charlie Harrison55ce6082018-05-14 02:25:573323 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033324
3325 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103326 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033327 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3328 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3329}
3330
3331TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3332 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3333 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3334
3335 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573336 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033337
3338 ASSERT_TRUE(pool_->HasGroup("a"));
3339 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103340 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033341 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3342
3343 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573344 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033345
3346 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103347 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033348 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3349}
3350
[email protected]3c819f522010-12-02 02:03:123351TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3352 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3353 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3354
3355 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573356 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123357
3358 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523359
3360 connect_job_factory_->set_job_type(
3361 TestConnectJob::kMockAdditionalErrorStateJob);
3362 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573363 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523364
3365 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123366}
3367
[email protected]8159a1c2012-06-07 00:00:103368TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033369 CreatePool(4, 4);
3370 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3371
Charlie Harrison55ce6082018-05-14 02:25:573372 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033373
3374 ASSERT_TRUE(pool_->HasGroup("a"));
3375 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103376 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033377 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3378
Charlie Harrison55ce6082018-05-14 02:25:573379 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033380 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103381 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033382 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3383
3384 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523385 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203386 EXPECT_EQ(
3387 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543388 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203389 ClientSocketPool::RespectLimits::ENABLED,
3390 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013391 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033392
3393 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523394 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:543395 int rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153396 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203397 callback2.callback(), pool_.get(), NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033398 if (rv != OK) {
robpercival214763f2016-07-01 23:27:013399 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
3400 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033401 }
3402
[email protected]8159a1c2012-06-07 00:00:103403 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3404 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3405 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3406 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3407
[email protected]2c2bef152010-10-13 00:55:033408 handle1.Reset();
3409 handle2.Reset();
3410
[email protected]8159a1c2012-06-07 00:00:103411 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3412 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033413 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3414
Charlie Harrison55ce6082018-05-14 02:25:573415 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033416 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103417 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033418 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3419}
3420
3421TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3422 CreatePool(4, 4);
3423 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3424
Charlie Harrison55ce6082018-05-14 02:25:573425 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033426
3427 ASSERT_TRUE(pool_->HasGroup("a"));
3428 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103429 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033430 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3431
Charlie Harrison55ce6082018-05-14 02:25:573432 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033433 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103434 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033435 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3436
Charlie Harrison55ce6082018-05-14 02:25:573437 pool_->RequestSockets("a", &params_, 3, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033438 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103439 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033440 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3441
Charlie Harrison55ce6082018-05-14 02:25:573442 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033443 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103444 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033445 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3446}
3447
3448TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3449 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3450 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3451
Charlie Harrison55ce6082018-05-14 02:25:573452 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033453
3454 ASSERT_TRUE(pool_->HasGroup("a"));
3455 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103456 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033457 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3458
3459 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523460 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203461 EXPECT_EQ(
3462 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543463 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203464 ClientSocketPool::RespectLimits::ENABLED,
3465 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033466
3467 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103468 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033469 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3470
robpercival214763f2016-07-01 23:27:013471 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033472
[email protected]0dc88b32014-03-26 20:12:283473 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483474 // starts, it has a connect start time.
3475 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033476 handle1.Reset();
3477
3478 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3479}
3480
[email protected]034df0f32013-01-07 23:17:483481// Checks that fully connected preconnect jobs have no connect times, and are
3482// marked as reused.
3483TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3484 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3485 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Charlie Harrison55ce6082018-05-14 02:25:573486 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483487
3488 ASSERT_TRUE(pool_->HasGroup("a"));
3489 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3490 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3491 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3492
3493 ClientSocketHandle handle;
3494 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203495 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543496 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203497 ClientSocketPool::RespectLimits::ENABLED,
3498 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483499
3500 // Make sure the idle socket was used.
3501 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3502
3503 TestLoadTimingInfoConnectedReused(handle);
3504 handle.Reset();
3505 TestLoadTimingInfoNotConnected(handle);
3506}
3507
[email protected]dcbe168a2010-12-02 03:14:463508// http://crbug.com/64940 regression test.
3509TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3510 const int kMaxTotalSockets = 3;
3511 const int kMaxSocketsPerGroup = 2;
3512 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
3513 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3514
3515 // Note that group name ordering matters here. "a" comes before "b", so
3516 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3517
3518 // Set up one idle socket in "a".
3519 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523520 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203521 EXPECT_EQ(
3522 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543523 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203524 ClientSocketPool::RespectLimits::ENABLED,
3525 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463526
robpercival214763f2016-07-01 23:27:013527 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463528 handle1.Reset();
3529 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3530
3531 // Set up two active sockets in "b".
3532 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523533 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203534 EXPECT_EQ(
3535 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543536 handle1.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203537 ClientSocketPool::RespectLimits::ENABLED,
3538 callback1.callback(), pool_.get(), NetLogWithSource()));
3539 EXPECT_EQ(
3540 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543541 handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203542 ClientSocketPool::RespectLimits::ENABLED,
3543 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463544
robpercival214763f2016-07-01 23:27:013545 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3546 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463547 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103548 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463549 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3550
3551 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3552 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3553 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3554 // sockets for "a", and "b" should still have 2 active sockets.
3555
Charlie Harrison55ce6082018-05-14 02:25:573556 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463557 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103558 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463559 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3560 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3561 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103562 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463563 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3564 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3565
3566 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3567 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3568 // "a" should result in closing 1 for "b".
3569 handle1.Reset();
3570 handle2.Reset();
3571 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3572 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3573
Charlie Harrison55ce6082018-05-14 02:25:573574 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463575 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103576 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463577 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3578 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3579 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103580 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463581 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3582 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3583}
3584
[email protected]b7b8be42011-07-12 12:46:413585TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073586 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3587 pool_->EnableConnectBackupJobs();
3588
3589 // Make the ConnectJob hang until it times out, shorten the timeout.
3590 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3591 connect_job_factory_->set_timeout_duration(
3592 base::TimeDelta::FromMilliseconds(500));
Charlie Harrison55ce6082018-05-14 02:25:573593 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073594 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103595 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073596 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073597
[email protected]b7b8be42011-07-12 12:46:413598 // Verify the backup timer doesn't create a backup job, by making
3599 // the backup job a pending job instead of a waiting job, so it
3600 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073601 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453602 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443603 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343604 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283605 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073606 EXPECT_FALSE(pool_->HasGroup("a"));
3607}
3608
[email protected]b7b8be42011-07-12 12:46:413609TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073610 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3611 pool_->EnableConnectBackupJobs();
3612
3613 // Make the ConnectJob hang forever.
3614 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Charlie Harrison55ce6082018-05-14 02:25:573615 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073616 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103617 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073618 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283619 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073620
3621 // Make the backup job be a pending job, so it completes normally.
3622 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3623 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523624 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153625 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543626 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153627 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203628 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413629 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073630 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103631 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073632 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3633 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013634 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073635
3636 // The hung connect job should still be there, but everything else should be
3637 // complete.
3638 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103639 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073640 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3641 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3642}
3643
[email protected]0dc88b32014-03-26 20:12:283644// Tests that a preconnect that starts out with unread data can still be used.
3645// http://crbug.com/334467
3646TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3647 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3648 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3649
Charlie Harrison55ce6082018-05-14 02:25:573650 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283651
3652 ASSERT_TRUE(pool_->HasGroup("a"));
3653 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3654 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3655 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3656
3657 // Fail future jobs to be sure that handle receives the preconnected socket
3658 // rather than closing it and making a new one.
3659 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3660 ClientSocketHandle handle;
3661 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203662 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543663 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203664 ClientSocketPool::RespectLimits::ENABLED,
3665 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283666
3667 ASSERT_TRUE(pool_->HasGroup("a"));
3668 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3669 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3670 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3671
3672 // Drain the pending read.
Bence Békybdbb0e72018-08-07 21:42:593673 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:283674
3675 TestLoadTimingInfoConnectedReused(handle);
3676 handle.Reset();
3677
3678 // The socket should be usable now that it's idle again.
3679 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3680}
3681
[email protected]043b68c82013-08-22 23:41:523682class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:203683 public:
3684 MockLayeredPool(TestClientSocketPool* pool,
3685 const std::string& group_name)
3686 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:203687 group_name_(group_name),
3688 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:523689 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:203690 }
3691
Daniel Cheng4496d0822018-04-26 21:52:153692 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:203693
3694 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153695 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:543696 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153697 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203698 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203699 }
3700
3701 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:153702 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:543703 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153704 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:203705 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:203706 }
3707
3708 bool ReleaseOneConnection() {
3709 if (!handle_.is_initialized() || !can_release_connection_) {
3710 return false;
3711 }
3712 handle_.socket()->Disconnect();
3713 handle_.Reset();
3714 return true;
3715 }
3716
3717 void set_can_release_connection(bool can_release_connection) {
3718 can_release_connection_ = can_release_connection;
3719 }
3720
3721 MOCK_METHOD0(CloseOneIdleConnection, bool());
3722
3723 private:
3724 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:203725 ClientSocketHandle handle_;
3726 TestCompletionCallback callback_;
3727 const std::string group_name_;
3728 bool can_release_connection_;
3729};
3730
3731TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
3732 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3733 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3734
3735 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013736 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203737 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3738 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:523739 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203740}
3741
3742TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
3743 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3744 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3745
3746 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013747 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203748 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3749 .WillOnce(Invoke(&mock_layered_pool,
3750 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:523751 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:203752}
3753
3754// Tests the basic case of closing an idle socket in a higher layered pool when
3755// a new request is issued and the lower layer pool is stalled.
3756TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
3757 CreatePool(1, 1);
3758 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3759
3760 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013761 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203762 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3763 .WillOnce(Invoke(&mock_layered_pool,
3764 &MockLayeredPool::ReleaseOneConnection));
3765 ClientSocketHandle handle;
3766 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153767 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543768 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153769 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203770 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013771 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203772}
3773
3774// Same as above, but the idle socket is in the same group as the stalled
3775// socket, and closes the only other request in its group when closing requests
3776// in higher layered pools. This generally shouldn't happen, but it may be
3777// possible if a higher level pool issues a request and the request is
3778// subsequently cancelled. Even if it's not possible, best not to crash.
3779TEST_F(ClientSocketPoolBaseTest,
3780 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
3781 CreatePool(2, 2);
3782 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3783
3784 // Need a socket in another group for the pool to be stalled (If a group
3785 // has the maximum number of connections already, it's not stalled).
3786 ClientSocketHandle handle1;
3787 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203788 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543789 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203790 ClientSocketPool::RespectLimits::ENABLED,
3791 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203792
3793 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013794 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203795 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3796 .WillOnce(Invoke(&mock_layered_pool,
3797 &MockLayeredPool::ReleaseOneConnection));
3798 ClientSocketHandle handle;
3799 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:153800 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543801 handle.Init("group2", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153802 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203803 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013804 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203805}
3806
3807// Tests the case when an idle socket can be closed when a new request is
3808// issued, and the new request belongs to a group that was previously stalled.
3809TEST_F(ClientSocketPoolBaseTest,
3810 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
3811 CreatePool(2, 2);
3812 std::list<TestConnectJob::JobType> job_types;
3813 job_types.push_back(TestConnectJob::kMockJob);
3814 job_types.push_back(TestConnectJob::kMockJob);
3815 job_types.push_back(TestConnectJob::kMockJob);
3816 job_types.push_back(TestConnectJob::kMockJob);
3817 connect_job_factory_->set_job_types(&job_types);
3818
3819 ClientSocketHandle handle1;
3820 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203821 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543822 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203823 ClientSocketPool::RespectLimits::ENABLED,
3824 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203825
3826 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013827 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203828 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3829 .WillRepeatedly(Invoke(&mock_layered_pool,
3830 &MockLayeredPool::ReleaseOneConnection));
3831 mock_layered_pool.set_can_release_connection(false);
3832
3833 // The third request is made when the socket pool is in a stalled state.
3834 ClientSocketHandle handle3;
3835 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203836 EXPECT_EQ(
3837 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543838 handle3.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203839 ClientSocketPool::RespectLimits::ENABLED,
3840 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203841
3842 base::RunLoop().RunUntilIdle();
3843 EXPECT_FALSE(callback3.have_result());
3844
3845 // The fourth request is made when the pool is no longer stalled. The third
3846 // request should be serviced first, since it was issued first and has the
3847 // same priority.
3848 mock_layered_pool.set_can_release_connection(true);
3849 ClientSocketHandle handle4;
3850 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203851 EXPECT_EQ(
3852 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543853 handle4.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203854 ClientSocketPool::RespectLimits::ENABLED,
3855 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013856 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203857 EXPECT_FALSE(callback4.have_result());
3858
3859 // Closing a handle should free up another socket slot.
3860 handle1.Reset();
robpercival214763f2016-07-01 23:27:013861 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203862}
3863
3864// Tests the case when an idle socket can be closed when a new request is
3865// issued, and the new request belongs to a group that was previously stalled.
3866//
3867// The two differences from the above test are that the stalled requests are not
3868// in the same group as the layered pool's request, and the the fourth request
3869// has a higher priority than the third one, so gets a socket first.
3870TEST_F(ClientSocketPoolBaseTest,
3871 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
3872 CreatePool(2, 2);
3873 std::list<TestConnectJob::JobType> job_types;
3874 job_types.push_back(TestConnectJob::kMockJob);
3875 job_types.push_back(TestConnectJob::kMockJob);
3876 job_types.push_back(TestConnectJob::kMockJob);
3877 job_types.push_back(TestConnectJob::kMockJob);
3878 connect_job_factory_->set_job_types(&job_types);
3879
3880 ClientSocketHandle handle1;
3881 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203882 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543883 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203884 ClientSocketPool::RespectLimits::ENABLED,
3885 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203886
3887 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:013888 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203889 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
3890 .WillRepeatedly(Invoke(&mock_layered_pool,
3891 &MockLayeredPool::ReleaseOneConnection));
3892 mock_layered_pool.set_can_release_connection(false);
3893
3894 // The third request is made when the socket pool is in a stalled state.
3895 ClientSocketHandle handle3;
3896 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203897 EXPECT_EQ(
3898 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543899 handle3.Init("group3", params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:203900 ClientSocketPool::RespectLimits::ENABLED,
3901 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:203902
3903 base::RunLoop().RunUntilIdle();
3904 EXPECT_FALSE(callback3.have_result());
3905
3906 // The fourth request is made when the pool is no longer stalled. This
3907 // request has a higher priority than the third request, so is serviced first.
3908 mock_layered_pool.set_can_release_connection(true);
3909 ClientSocketHandle handle4;
3910 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:203911 EXPECT_EQ(
3912 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543913 handle4.Init("group3", params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:203914 ClientSocketPool::RespectLimits::ENABLED,
3915 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013916 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203917 EXPECT_FALSE(callback3.have_result());
3918
3919 // Closing a handle should free up another socket slot.
3920 handle1.Reset();
robpercival214763f2016-07-01 23:27:013921 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203922}
3923
3924TEST_F(ClientSocketPoolBaseTest,
3925 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
3926 CreatePool(1, 1);
3927 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3928
3929 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:013930 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:203931 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
3932 .WillRepeatedly(Invoke(&mock_layered_pool1,
3933 &MockLayeredPool::ReleaseOneConnection));
3934 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:013935 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
3936 IsOk());
[email protected]58e562f2013-04-22 17:32:203937 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
3938 .WillRepeatedly(Invoke(&mock_layered_pool2,
3939 &MockLayeredPool::ReleaseOneConnection));
3940 ClientSocketHandle handle;
3941 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153942 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543943 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153944 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203945 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013946 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:203947}
3948
[email protected]b021ece62013-06-11 11:06:333949// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:153950// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
3951// socket instead of a request with the same priority that was issued earlier,
3952// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:333953TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:333954 CreatePool(1, 1);
3955
3956 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153957 EXPECT_EQ(
3958 OK, StartRequestWithIgnoreLimits(
3959 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333960 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3961
3962 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3963
mmenked3641e12016-01-28 16:06:153964 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3965 "a", MAXIMUM_PRIORITY,
3966 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:333967 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3968
mmenked3641e12016-01-28 16:06:153969 // Issue a request that ignores the limits, so a new ConnectJob is
3970 // created.
3971 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3972 "a", MAXIMUM_PRIORITY,
3973 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:333974 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3975
robpercival214763f2016-07-01 23:27:013976 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:333977 EXPECT_FALSE(request(1)->have_result());
3978}
3979
[email protected]c55fabd2013-11-04 23:26:563980// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:153981// issued for a request with RespectLimits::DISABLED is not cancelled when a
3982// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:563983TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:563984 CreatePool(1, 1);
3985
3986 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:153987 EXPECT_EQ(
3988 OK, StartRequestWithIgnoreLimits(
3989 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563990 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3991
3992 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3993
mmenked3641e12016-01-28 16:06:153994 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
3995 "a", MAXIMUM_PRIORITY,
3996 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:563997 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3998
mmenked3641e12016-01-28 16:06:153999 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4000 // created.
4001 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4002 "a", MAXIMUM_PRIORITY,
4003 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334004 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4005
mmenked3641e12016-01-28 16:06:154006 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334007 // should not be cancelled.
4008 request(1)->handle()->Reset();
4009 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4010
robpercival214763f2016-07-01 23:27:014011 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334012 EXPECT_FALSE(request(1)->have_result());
4013}
4014
[email protected]f6d1d6eb2009-06-24 20:16:094015} // namespace
4016
4017} // namespace net