blob: ed6d14eb2fd332916aacf38f134a6e205fccf03f [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"
[email protected]3b63f8f42011-03-28 01:54:1516#include "base/memory/ref_counted.h"
[email protected]6ea7b152011-12-21 21:21:1317#include "base/memory/weak_ptr.h"
Alexander Timin4f9c35c2018-11-01 20:15:2018#include "base/message_loop/message_loop.h"
[email protected]034df0f32013-01-07 23:17:4819#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4520#include "base/single_thread_task_runner.h"
Avi Drissman4365a4782018-12-28 19:26:2421#include "base/stl_util.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;
Tarun Bansala7635092019-02-20 10:00:5966constexpr base::TimeDelta kUnusedIdleSocketTimeout =
67 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0168
[email protected]034df0f32013-01-07 23:17:4869// Make sure |handle| sets load times correctly when it has been assigned a
70// reused socket.
71void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
72 LoadTimingInfo load_timing_info;
73 // Only pass true in as |is_reused|, as in general, HttpStream types should
74 // have stricter concepts of reuse than socket pools.
75 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
76
77 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1978 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4879
[email protected]b258e0792013-01-12 07:11:5980 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
81 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4882}
83
84// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3385// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4886// of a connection where |is_reused| is false may consider the connection
87// reused.
88void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
89 EXPECT_FALSE(handle.is_reused());
90
91 LoadTimingInfo load_timing_info;
92 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
93
94 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1995 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4896
[email protected]b258e0792013-01-12 07:11:5997 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
98 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
99 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48100
101 TestLoadTimingInfoConnectedReused(handle);
102}
103
104// Make sure |handle| sets load times correctly, in the case that it does not
105// currently have a socket.
106void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
107 // Should only be set to true once a socket is assigned, if at all.
108 EXPECT_FALSE(handle.is_reused());
109
110 LoadTimingInfo load_timing_info;
111 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
112
113 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19114 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48115
[email protected]b258e0792013-01-12 07:11:59116 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
117 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48118}
119
[email protected]df4b4ef2010-07-12 18:25:21120class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20121 public:
Chris Watkins7a41d3552017-12-01 02:13:27122 explicit TestSocketParams() = default;
[email protected]51fdc7c2012-04-10 19:19:48123
[email protected]df4b4ef2010-07-12 18:25:21124 private:
125 friend class base::RefCounted<TestSocketParams>;
Chris Watkins7a41d3552017-12-01 02:13:27126 ~TestSocketParams() = default;
[email protected]df4b4ef2010-07-12 18:25:21127};
[email protected]7fc5b09a2010-02-27 00:07:38128typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49129
[email protected]3268023f2011-05-05 00:08:10130class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09131 public:
[email protected]034df0f32013-01-07 23:17:48132 explicit MockClientSocket(net::NetLog* net_log)
133 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28134 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20135 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30136 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09137
[email protected]0dc88b32014-03-26 20:12:28138 // Sets whether the socket has unread data. If true, the next call to Read()
139 // will return 1 byte and IsConnectedAndIdle() will return false.
140 void set_has_unread_data(bool has_unread_data) {
141 has_unread_data_ = has_unread_data;
142 }
143
[email protected]3f55aa12011-12-07 02:03:33144 // Socket implementation.
dchengb03027d2014-10-21 12:00:20145 int Read(IOBuffer* /* buf */,
146 int len,
Brad Lassey3a814172018-04-26 03:30:21147 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28148 if (has_unread_data_ && len > 0) {
149 has_unread_data_ = false;
150 was_used_to_convey_data_ = true;
151 return 1;
152 }
[email protected]e86df8dc2013-03-30 13:18:28153 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33154 }
[email protected]ab838892009-06-30 18:49:05155
[email protected]a2b2cfc2017-12-06 09:06:08156 int Write(
157 IOBuffer* /* buf */,
158 int len,
Brad Lassey3a814172018-04-26 03:30:21159 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08160 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01161 was_used_to_convey_data_ = true;
162 return len;
[email protected]ab838892009-06-30 18:49:05163 }
Avi Drissman13fc8932015-12-20 04:40:46164 int SetReceiveBufferSize(int32_t size) override { return OK; }
165 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05166
[email protected]dbf036f2011-12-06 23:33:24167 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21168 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24169 connected_ = true;
170 return OK;
171 }
[email protected]f6d1d6eb2009-06-24 20:16:09172
dchengb03027d2014-10-21 12:00:20173 void Disconnect() override { connected_ = false; }
174 bool IsConnected() const override { return connected_; }
175 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28176 return connected_ && !has_unread_data_;
177 }
[email protected]0b7648c2009-07-06 20:14:01178
dchengb03027d2014-10-21 12:00:20179 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16180 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09181 }
[email protected]f6d1d6eb2009-06-24 20:16:09182
dchengb03027d2014-10-21 12:00:20183 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35184 return ERR_UNEXPECTED;
185 }
186
tfarina428341112016-09-22 13:38:20187 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02188
dchengb03027d2014-10-21 12:00:20189 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37190 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20191 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
192 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03193 void GetConnectionAttempts(ConnectionAttempts* out) const override {
194 out->clear();
195 }
196 void ClearConnectionAttempts() override {}
197 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49198 int64_t GetTotalReceivedBytes() const override {
199 NOTIMPLEMENTED();
200 return 0;
201 }
Paul Jensen0f49dec2017-12-12 23:39:58202 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45203
[email protected]f6d1d6eb2009-06-24 20:16:09204 private:
205 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28206 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20207 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01208 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09209
[email protected]ab838892009-06-30 18:49:05210 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09211};
212
[email protected]5fc08e32009-07-15 17:09:57213class TestConnectJob;
214
[email protected]f6d1d6eb2009-06-24 20:16:09215class MockClientSocketFactory : public ClientSocketFactory {
216 public:
[email protected]ab838892009-06-30 18:49:05217 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09218
danakj655b66c2016-04-16 00:51:38219 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04220 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41221 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19222 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41223 NOTREACHED();
danakj655b66c2016-04-16 00:51:38224 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41225 }
226
Helen Lid5bb9222018-04-12 15:33:09227 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07228 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38229 std::unique_ptr<
230 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07231 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19232 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09233 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09234 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09235 }
236
danakj655b66c2016-04-16 00:51:38237 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
238 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27239 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21240 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13241 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09242 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38243 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09244 }
Matt Menkefd956922019-02-04 23:44:03245
246 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
247 std::unique_ptr<StreamSocket> nested_socket,
248 const HostPortPair& host_and_port,
249 const SSLConfig& ssl_config,
250 const SSLClientSocketContext& context) override {
251 NOTIMPLEMENTED();
252 return std::unique_ptr<SSLClientSocket>();
253 }
254
Helen Liac3c51e2018-04-24 00:02:13255 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
256 std::unique_ptr<ClientSocketHandle> transport_socket,
257 const std::string& user_agent,
258 const HostPortPair& endpoint,
Wojciech Dzierżanowski1f823562019-01-18 11:26:00259 const ProxyServer& proxy_server,
Helen Liac3c51e2018-04-24 00:02:13260 HttpAuthController* http_auth_controller,
261 bool tunnel,
262 bool using_spdy,
263 NextProto negotiated_protocol,
Wojciech Dzierżanowski1f823562019-01-18 11:26:00264 ProxyDelegate* proxy_delegate,
Helen Liac3c51e2018-04-24 00:02:13265 bool is_https_proxy,
266 const NetworkTrafficAnnotationTag& traffic_annotation) override {
267 NOTIMPLEMENTED();
268 return nullptr;
269 }
[email protected]f6d1d6eb2009-06-24 20:16:09270
Matt Menke52cd95a2019-02-08 06:16:27271 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
272 std::unique_ptr<StreamSocket> stream_socket,
273 const std::string& user_agent,
274 const HostPortPair& endpoint,
275 const ProxyServer& proxy_server,
276 HttpAuthController* http_auth_controller,
277 bool tunnel,
278 bool using_spdy,
279 NextProto negotiated_protocol,
280 ProxyDelegate* proxy_delegate,
281 bool is_https_proxy,
282 const NetworkTrafficAnnotationTag& traffic_annotation) override {
283 NOTIMPLEMENTED();
284 return nullptr;
285 }
286
[email protected]5fc08e32009-07-15 17:09:57287 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55288
[email protected]5fc08e32009-07-15 17:09:57289 void SignalJobs();
290
[email protected]03b7c8c2013-07-20 04:38:55291 void SignalJob(size_t job);
292
293 void SetJobLoadState(size_t job, LoadState load_state);
294
Matt Menke141b87f22019-01-30 02:43:03295 // Sets the HasConnectionEstablished value of the specified job to true,
296 // without invoking the callback.
297 void SetJobHasEstablishedConnection(size_t job);
298
[email protected]f6d1d6eb2009-06-24 20:16:09299 int allocation_count() const { return allocation_count_; }
300
[email protected]f6d1d6eb2009-06-24 20:16:09301 private:
302 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57303 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09304};
305
[email protected]ab838892009-06-30 18:49:05306class TestConnectJob : public ConnectJob {
307 public:
308 enum JobType {
309 kMockJob,
310 kMockFailingJob,
311 kMockPendingJob,
312 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57313 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13314 kMockRecoverableJob,
315 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18316 kMockAdditionalErrorStateJob,
317 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28318 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05319 };
320
[email protected]994d4932010-07-12 17:55:13321 // The kMockPendingJob uses a slight delay before allowing the connect
322 // to complete.
323 static const int kPendingConnectDelay = 2;
324
[email protected]ab838892009-06-30 18:49:05325 TestConnectJob(JobType job_type,
326 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49327 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34328 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05329 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30330 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17331 NetLog* net_log)
Matt Menke1a6c92d2019-02-23 00:25:38332 : ConnectJob(request.priority(),
333 timeout_duration,
334 CommonConnectJobParams(
335 group_name,
336 request.socket_tag(),
337 request.respect_limits() ==
338 ClientSocketPool::RespectLimits::ENABLED,
339 nullptr /* client_socket_factory */,
340 nullptr /* host_resolver */,
341 nullptr /* proxy_delegate */,
342 SSLClientSocketContext(),
343 SSLClientSocketContext(),
344 nullptr /* socket_performance_watcher_factory */,
345 nullptr /* network_quality_estimator */,
346 net_log,
347 nullptr /* websocket_endpoint_lock_manager */),
348 delegate,
349 nullptr /* net_log */,
350 NetLogSourceType::TRANSPORT_CONNECT_JOB,
351 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58352 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05353 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18354 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03355 has_established_connection_(false),
[email protected]d5492c52013-11-10 20:44:39356 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15357 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05358
[email protected]974ebd62009-08-03 23:14:34359 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13360 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34361 }
362
[email protected]03b7c8c2013-07-20 04:38:55363 void set_load_state(LoadState load_state) { load_state_ = load_state; }
364
Matt Menke141b87f22019-01-30 02:43:03365 void set_has_established_connection() {
366 DCHECK(!has_established_connection_);
367 has_established_connection_ = true;
368 }
369
[email protected]03b7c8c2013-07-20 04:38:55370 // From ConnectJob:
371
dchengb03027d2014-10-21 12:00:20372 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21373
Matt Menke141b87f22019-01-30 02:43:03374 bool HasEstablishedConnection() const override {
375 return has_established_connection_;
376 }
377
dchengb03027d2014-10-21 12:00:20378 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18379 if (store_additional_error_state_) {
380 // Set all of the additional error state fields in some way.
381 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43382 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45383 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43384 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18385 }
386 }
387
[email protected]974ebd62009-08-03 23:14:34388 private:
[email protected]03b7c8c2013-07-20 04:38:55389 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05390
dchengb03027d2014-10-21 12:00:20391 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05392 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21393 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19394 NetLogSource());
danakj655b66c2016-04-16 00:51:38395 SetSocket(std::unique_ptr<StreamSocket>(
396 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05397 switch (job_type_) {
398 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13399 return DoConnect(true /* successful */, false /* sync */,
400 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05401 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13402 return DoConnect(false /* error */, false /* sync */,
403 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05404 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57405 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47406
407 // Depending on execution timings, posting a delayed task can result
408 // in the task getting executed the at the earliest possible
409 // opportunity or only after returning once from the message loop and
410 // then a second call into the message loop. In order to make behavior
411 // more deterministic, we change the default delay to 2ms. This should
412 // always require us to wait for the second call into the message loop.
413 //
414 // N.B. The correct fix for this and similar timing problems is to
415 // abstract time for the purpose of unittests. Unfortunately, we have
416 // a lot of third-party components that directly call the various
417 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45418 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05419 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49420 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
421 weak_factory_.GetWeakPtr(), true /* successful */,
422 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53423 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05424 return ERR_IO_PENDING;
425 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57426 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45427 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05428 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49429 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
430 weak_factory_.GetWeakPtr(), false /* error */,
431 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53432 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05433 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57434 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55435 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57436 client_socket_factory_->WaitForSignal(this);
437 waiting_success_ = true;
438 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13439 case kMockRecoverableJob:
440 return DoConnect(false /* error */, false /* sync */,
441 true /* recoverable */);
442 case kMockPendingRecoverableJob:
443 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45444 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13445 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49446 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
447 weak_factory_.GetWeakPtr(), false /* error */,
448 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53449 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13450 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18451 case kMockAdditionalErrorStateJob:
452 store_additional_error_state_ = true;
453 return DoConnect(false /* error */, false /* sync */,
454 false /* recoverable */);
455 case kMockPendingAdditionalErrorStateJob:
456 set_load_state(LOAD_STATE_CONNECTING);
457 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45458 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18459 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49460 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
461 weak_factory_.GetWeakPtr(), false /* error */,
462 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53463 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18464 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28465 case kMockUnreadDataJob: {
466 int ret = DoConnect(true /* successful */, false /* sync */,
467 false /* recoverable */);
468 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
469 return ret;
470 }
[email protected]ab838892009-06-30 18:49:05471 default:
472 NOTREACHED();
danakj655b66c2016-04-16 00:51:38473 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05474 return ERR_FAILED;
475 }
476 }
477
Lily Chen02ef29a2018-11-30 16:31:43478 void ChangePriorityInternal(RequestPriority priority) override {}
479
[email protected]e772db3f2010-07-12 18:11:13480 int DoConnect(bool succeed, bool was_async, bool recoverable) {
481 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03482 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05483 if (succeed) {
Bence Békybdbb0e72018-08-07 21:42:59484 socket()->Connect(CompletionOnceCallback());
[email protected]e772db3f2010-07-12 18:11:13485 } else if (recoverable) {
486 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40487 } else {
[email protected]e772db3f2010-07-12 18:11:13488 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38489 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05490 }
[email protected]2ab05b52009-07-01 23:57:58491
492 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30493 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05494 return result;
495 }
496
[email protected]5fc08e32009-07-15 17:09:57497 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05498 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57499 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21500 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03501 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18502 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05503
[email protected]d5492c52013-11-10 20:44:39504 base::WeakPtrFactory<TestConnectJob> weak_factory_;
505
[email protected]ab838892009-06-30 18:49:05506 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
507};
508
[email protected]d80a4322009-08-14 07:07:49509class TestConnectJobFactory
510 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05511 public:
[email protected]034df0f32013-01-07 23:17:48512 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
513 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05514 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48515 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48516 client_socket_factory_(client_socket_factory),
Raul Tambre8335a6d2019-02-21 16:57:43517 net_log_(net_log) {}
[email protected]ab838892009-06-30 18:49:05518
Chris Watkins7a41d3552017-12-01 02:13:27519 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05520
521 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
522
[email protected]51fdc7c2012-04-10 19:19:48523 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
524 job_types_ = job_types;
525 CHECK(!job_types_->empty());
526 }
527
[email protected]974ebd62009-08-03 23:14:34528 void set_timeout_duration(base::TimeDelta timeout_duration) {
529 timeout_duration_ = timeout_duration;
530 }
531
[email protected]3f55aa12011-12-07 02:03:33532 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55533
danakj655b66c2016-04-16 00:51:38534 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05535 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49536 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13537 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48538 EXPECT_TRUE(!job_types_ || !job_types_->empty());
539 TestConnectJob::JobType job_type = job_type_;
540 if (job_types_ && !job_types_->empty()) {
541 job_type = job_types_->front();
542 job_types_->pop_front();
543 }
danakj655b66c2016-04-16 00:51:38544 return std::unique_ptr<ConnectJob>(
545 new TestConnectJob(job_type, group_name, request, timeout_duration_,
546 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05547 }
548
549 private:
550 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48551 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34552 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57553 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48554 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05555
556 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
557};
558
559class TestClientSocketPool : public ClientSocketPool {
560 public:
[email protected]12322e7e2013-08-15 17:49:26561 typedef TestSocketParams SocketParams;
562
[email protected]ab838892009-06-30 18:49:05563 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53564 int max_sockets,
[email protected]ab838892009-06-30 18:49:05565 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16566 base::TimeDelta unused_idle_socket_timeout,
567 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49568 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41569 : base_(NULL,
570 max_sockets,
571 max_sockets_per_group,
572 unused_idle_socket_timeout,
573 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38574 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05575
Chris Watkins7a41d3552017-12-01 02:13:27576 ~TestClientSocketPool() override = default;
[email protected]2431756e2010-09-29 20:26:13577
dchengb03027d2014-10-21 12:00:20578 int RequestSocket(const std::string& group_name,
579 const void* params,
ttuttle859dc7a2015-04-23 19:42:29580 RequestPriority priority,
Paul Jensen8d6f87ec2018-01-13 00:46:54581 const SocketTag& socket_tag,
mmenked3641e12016-01-28 16:06:15582 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20583 ClientSocketHandle* handle,
Bence Béky5a8662b2018-07-03 13:04:03584 CompletionOnceCallback callback,
Matt Menke28ac03e2019-02-25 22:25:50585 const ProxyAuthCallback& proxy_auth_callback,
tfarina428341112016-09-22 13:38:20586 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21587 const scoped_refptr<TestSocketParams>* casted_socket_params =
588 static_cast<const scoped_refptr<TestSocketParams>*>(params);
Matt Menke28ac03e2019-02-25 22:25:50589 return base_.RequestSocket(
590 group_name, *casted_socket_params, priority, socket_tag, respect_limits,
591 handle, std::move(callback), proxy_auth_callback, net_log);
[email protected]ab838892009-06-30 18:49:05592 }
593
dchengb03027d2014-10-21 12:00:20594 void RequestSockets(const std::string& group_name,
595 const void* params,
596 int num_sockets,
Charlie Harrison55ce6082018-05-14 02:25:57597 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03598 const scoped_refptr<TestSocketParams>* casted_params =
599 static_cast<const scoped_refptr<TestSocketParams>*>(params);
600
Charlie Harrison55ce6082018-05-14 02:25:57601 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
[email protected]2c2bef152010-10-13 00:55:03602 }
603
rdsmith29dbad12017-02-17 02:22:18604 void SetPriority(const std::string& group_name,
605 ClientSocketHandle* handle,
606 RequestPriority priority) override {
607 base_.SetPriority(group_name, handle, priority);
608 }
609
dchengb03027d2014-10-21 12:00:20610 void CancelRequest(const std::string& group_name,
611 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49612 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05613 }
614
dchengb03027d2014-10-21 12:00:20615 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38616 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20617 int id) override {
dchengc7eeda422015-12-26 03:56:48618 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24619 }
620
dchengb03027d2014-10-21 12:00:20621 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05622
dchengb03027d2014-10-21 12:00:20623 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48624
dchengb03027d2014-10-21 12:00:20625 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05626
xunjieli92feb332017-03-03 17:19:23627 void CloseIdleSocketsInGroup(const std::string& group_name) override {
628 base_.CloseIdleSocketsInGroup(group_name);
629 }
630
dchengb03027d2014-10-21 12:00:20631 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05632
Raul Tambre8335a6d2019-02-21 16:57:43633 size_t IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49634 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05635 }
636
dchengb03027d2014-10-21 12:00:20637 LoadState GetLoadState(const std::string& group_name,
638 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49639 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05640 }
641
dchengb03027d2014-10-21 12:00:20642 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52643 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48644 }
645
dchengb03027d2014-10-21 12:00:20646 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52647 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48648 }
649
danakj655b66c2016-04-16 00:51:38650 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59651 const std::string& name,
652 const std::string& type,
mostynbba063d6032014-10-09 11:01:13653 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27654 return base_.GetInfoAsValue(name, type);
655 }
656
[email protected]d80a4322009-08-14 07:07:49657 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20658
Raul Tambre8335a6d2019-02-21 16:57:43659 size_t NumNeverAssignedConnectJobsInGroup(
660 const std::string& group_name) const {
Lily Chenecebf932018-11-02 17:15:43661 return base_.NumNeverAssignedConnectJobsInGroup(group_name);
662 }
663
Raul Tambre8335a6d2019-02-21 16:57:43664 size_t NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
[email protected]8159a1c2012-06-07 00:00:10665 return base_.NumUnassignedConnectJobsInGroup(group_name);
666 }
667
Raul Tambre8335a6d2019-02-21 16:57:43668 size_t NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49669 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34670 }
671
[email protected]2c2bef152010-10-13 00:55:03672 int NumActiveSocketsInGroup(const std::string& group_name) const {
673 return base_.NumActiveSocketsInGroup(group_name);
674 }
675
Lily Chenecebf932018-11-02 17:15:43676 bool RequestInGroupWithHandleHasJobForTesting(
677 const std::string& group_name,
678 const ClientSocketHandle* handle) const {
679 return base_.RequestInGroupWithHandleHasJobForTesting(group_name, handle);
680 }
681
[email protected]2abfe90a2010-08-25 17:49:51682 bool HasGroup(const std::string& group_name) const {
683 return base_.HasGroup(group_name);
684 }
685
[email protected]9bf28db2009-08-29 01:35:16686 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
687
[email protected]06d94042010-08-25 01:45:22688 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54689
[email protected]043b68c82013-08-22 23:41:52690 bool CloseOneIdleConnectionInHigherLayeredPool() {
691 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48692 }
693
[email protected]ab838892009-06-30 18:49:05694 private:
[email protected]d80a4322009-08-14 07:07:49695 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05696
697 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
698};
699
[email protected]a937a06d2009-08-19 21:19:24700} // namespace
701
[email protected]a937a06d2009-08-19 21:19:24702namespace {
703
[email protected]5fc08e32009-07-15 17:09:57704void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26705 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57706 (*it)->Signal();
707 }
708 waiting_jobs_.clear();
709}
710
[email protected]03b7c8c2013-07-20 04:38:55711void MockClientSocketFactory::SignalJob(size_t job) {
712 ASSERT_LT(job, waiting_jobs_.size());
713 waiting_jobs_[job]->Signal();
714 waiting_jobs_.erase(waiting_jobs_.begin() + job);
715}
716
717void MockClientSocketFactory::SetJobLoadState(size_t job,
718 LoadState load_state) {
719 ASSERT_LT(job, waiting_jobs_.size());
720 waiting_jobs_[job]->set_load_state(load_state);
721}
722
Matt Menke141b87f22019-01-30 02:43:03723void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
724 ASSERT_LT(job, waiting_jobs_.size());
725 waiting_jobs_[job]->set_has_established_connection();
726}
727
Bence Béky98447b12018-05-08 03:14:01728class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09729 protected:
Alex Clarke0def2092018-12-10 12:01:45730 ClientSocketPoolBaseTest()
731 : TestWithScopedTaskEnvironment(
732 base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
733 params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54734 connect_backup_jobs_enabled_ =
735 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
736 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
737 }
[email protected]2431756e2010-09-29 20:26:13738
dcheng67be2b1f2014-10-27 21:47:29739 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54740 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
741 connect_backup_jobs_enabled_);
742 }
[email protected]c9d6a1d2009-07-14 16:15:20743
[email protected]211d21722009-07-22 15:48:53744 void CreatePool(int max_sockets, int max_sockets_per_group) {
Tarun Bansala7635092019-02-20 10:00:59745 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
746 kUnusedIdleSocketTimeout,
747 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16748 }
749
750 void CreatePoolWithIdleTimeouts(
751 int max_sockets, int max_sockets_per_group,
752 base::TimeDelta unused_idle_socket_timeout,
753 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20754 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48755 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
756 &net_log_);
[email protected]2431756e2010-09-29 20:26:13757 pool_.reset(new TestClientSocketPool(max_sockets,
758 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13759 unused_idle_socket_timeout,
760 used_idle_socket_timeout,
761 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20762 }
[email protected]f6d1d6eb2009-06-24 20:16:09763
mmenked3641e12016-01-28 16:06:15764 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33765 const std::string& group_name,
766 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15767 ClientSocketPool::RespectLimits respect_limits) {
768 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
769 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33770 }
771
772 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15773 return StartRequestWithIgnoreLimits(
774 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09775 }
776
[email protected]2431756e2010-09-29 20:26:13777 int GetOrderOfRequest(size_t index) const {
778 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09779 }
780
[email protected]2431756e2010-09-29 20:26:13781 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
782 return test_base_.ReleaseOneConnection(keep_alive);
783 }
784
785 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
786 test_base_.ReleaseAllConnections(keep_alive);
787 }
788
789 TestSocketRequest* request(int i) { return test_base_.request(i); }
790 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38791 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42792 return test_base_.requests();
793 }
rdsmith29dbad12017-02-17 02:22:18794 // Only counts the requests that get sockets asynchronously;
795 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13796 size_t completion_count() const { return test_base_.completion_count(); }
797
vishal.b62985ca92015-04-17 08:45:51798 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54799 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09800 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04801 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21802 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38803 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13804 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09805};
806
[email protected]5fc08e32009-07-15 17:09:57807TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53808 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20809
[email protected]6ecf2b92011-12-15 01:14:52810 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06811 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51812 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48813 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53814
Paul Jensen8d6f87ec2018-01-13 00:46:54815 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15816 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:50817 callback.callback(),
818 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
819 log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09820 EXPECT_TRUE(handle.is_initialized());
821 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48822 TestLoadTimingInfoConnectedNotReused(handle);
823
[email protected]f6d1d6eb2009-06-24 20:16:09824 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48825 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30826
mmenke43758e62015-05-04 21:09:46827 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40828 log.GetEntries(&entries);
829
830 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00831 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53832 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00833 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
834 NetLogEventPhase::NONE));
835 EXPECT_TRUE(LogContainsEvent(entries, 2,
836 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
837 NetLogEventPhase::NONE));
838 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09839}
840
[email protected]ab838892009-06-30 18:49:05841TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53842 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20843
[email protected]ab838892009-06-30 18:49:05844 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51845 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53846
[email protected]2431756e2010-09-29 20:26:13847 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52848 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18849 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13850 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43851 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45852 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13853 handle.set_ssl_error_response_info(info);
Matt Menke28ac03e2019-02-25 22:25:50854 EXPECT_EQ(
855 ERR_CONNECTION_FAILED,
856 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
857 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
858 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
859 log.bound()));
[email protected]2431756e2010-09-29 20:26:13860 EXPECT_FALSE(handle.socket());
861 EXPECT_FALSE(handle.is_ssl_error());
862 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48863 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30864
mmenke43758e62015-05-04 21:09:46865 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40866 log.GetEntries(&entries);
867
868 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00869 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17870 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00871 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
872 NetLogEventPhase::NONE));
873 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09874}
875
[email protected]211d21722009-07-22 15:48:53876TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
877 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
878
[email protected]9e743cd2010-03-16 07:03:53879 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30880
robpercival214763f2016-07-01 23:27:01881 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
882 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
883 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
884 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53885
[email protected]2431756e2010-09-29 20:26:13886 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53887 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13888 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53889
robpercival214763f2016-07-01 23:27:01890 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
891 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
892 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53893
[email protected]2431756e2010-09-29 20:26:13894 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53895
[email protected]2431756e2010-09-29 20:26:13896 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53897 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13898 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53899
900 EXPECT_EQ(1, GetOrderOfRequest(1));
901 EXPECT_EQ(2, GetOrderOfRequest(2));
902 EXPECT_EQ(3, GetOrderOfRequest(3));
903 EXPECT_EQ(4, GetOrderOfRequest(4));
904 EXPECT_EQ(5, GetOrderOfRequest(5));
905 EXPECT_EQ(6, GetOrderOfRequest(6));
906 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17907
908 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13909 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53910}
911
912TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
913 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
914
[email protected]9e743cd2010-03-16 07:03:53915 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30916
[email protected]211d21722009-07-22 15:48:53917 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01918 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
919 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
920 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
921 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53922
[email protected]2431756e2010-09-29 20:26:13923 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53924 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13925 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53926
927 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01928 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53929
[email protected]2431756e2010-09-29 20:26:13930 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53931
[email protected]2431756e2010-09-29 20:26:13932 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53933 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13934 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53935
936 EXPECT_EQ(1, GetOrderOfRequest(1));
937 EXPECT_EQ(2, GetOrderOfRequest(2));
938 EXPECT_EQ(3, GetOrderOfRequest(3));
939 EXPECT_EQ(4, GetOrderOfRequest(4));
940 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17941
942 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13943 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53944}
945
946TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
947 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
948
robpercival214763f2016-07-01 23:27:01949 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
950 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
951 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
952 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53953
[email protected]2431756e2010-09-29 20:26:13954 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53955 client_socket_factory_.allocation_count());
956
robpercival214763f2016-07-01 23:27:01957 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
958 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
959 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53960
[email protected]2431756e2010-09-29 20:26:13961 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53962
[email protected]2431756e2010-09-29 20:26:13963 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53964
965 // First 4 requests don't have to wait, and finish in order.
966 EXPECT_EQ(1, GetOrderOfRequest(1));
967 EXPECT_EQ(2, GetOrderOfRequest(2));
968 EXPECT_EQ(3, GetOrderOfRequest(3));
969 EXPECT_EQ(4, GetOrderOfRequest(4));
970
[email protected]ac790b42009-12-02 04:31:31971 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
972 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53973 EXPECT_EQ(7, GetOrderOfRequest(5));
974 EXPECT_EQ(6, GetOrderOfRequest(6));
975 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17976
977 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13978 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53979}
980
rdsmith29dbad12017-02-17 02:22:18981// Test reprioritizing a request before completion doesn't interfere with
982// its completion.
983TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
984 CreatePool(kDefaultMaxSockets, 1);
985
986 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
987 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
988 EXPECT_TRUE(request(0)->handle()->socket());
989 EXPECT_FALSE(request(1)->handle()->socket());
990
Lily Chenecebf932018-11-02 17:15:43991 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:18992
993 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
994
995 EXPECT_TRUE(request(1)->handle()->socket());
996}
997
998// Reprioritize a request up past another one and make sure that changes the
999// completion order.
1000TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1001 CreatePool(kDefaultMaxSockets, 1);
1002
1003 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1004 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1005 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1006 EXPECT_TRUE(request(0)->handle()->socket());
1007 EXPECT_FALSE(request(1)->handle()->socket());
1008 EXPECT_FALSE(request(2)->handle()->socket());
1009
1010 request(2)->handle()->SetPriority(HIGHEST);
1011
1012 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1013
1014 EXPECT_EQ(1, GetOrderOfRequest(1));
1015 EXPECT_EQ(3, GetOrderOfRequest(2));
1016 EXPECT_EQ(2, GetOrderOfRequest(3));
1017}
1018
1019// Reprioritize a request without changing relative priorities and check
1020// that the order doesn't change.
1021TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1022 CreatePool(kDefaultMaxSockets, 1);
1023
1024 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1025 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1026 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1027 EXPECT_TRUE(request(0)->handle()->socket());
1028 EXPECT_FALSE(request(1)->handle()->socket());
1029 EXPECT_FALSE(request(2)->handle()->socket());
1030
1031 request(2)->handle()->SetPriority(MEDIUM);
1032
1033 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1034
1035 EXPECT_EQ(1, GetOrderOfRequest(1));
1036 EXPECT_EQ(2, GetOrderOfRequest(2));
1037 EXPECT_EQ(3, GetOrderOfRequest(3));
1038}
1039
1040// Reprioritize a request past down another one and make sure that changes the
1041// completion order.
1042TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1043 CreatePool(kDefaultMaxSockets, 1);
1044
1045 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1046 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1047 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1048 EXPECT_TRUE(request(0)->handle()->socket());
1049 EXPECT_FALSE(request(1)->handle()->socket());
1050 EXPECT_FALSE(request(2)->handle()->socket());
1051
1052 request(1)->handle()->SetPriority(LOW);
1053
1054 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1055
1056 EXPECT_EQ(1, GetOrderOfRequest(1));
1057 EXPECT_EQ(3, GetOrderOfRequest(2));
1058 EXPECT_EQ(2, GetOrderOfRequest(3));
1059}
1060
1061// Reprioritize a request to the same level as another and confirm it is
1062// put after the old request.
1063TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1064 CreatePool(kDefaultMaxSockets, 1);
1065
1066 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1067 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1068 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1069 EXPECT_TRUE(request(0)->handle()->socket());
1070 EXPECT_FALSE(request(1)->handle()->socket());
1071 EXPECT_FALSE(request(2)->handle()->socket());
1072
1073 request(1)->handle()->SetPriority(MEDIUM);
1074
1075 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1076
1077 EXPECT_EQ(1, GetOrderOfRequest(1));
1078 EXPECT_EQ(3, GetOrderOfRequest(2));
1079 EXPECT_EQ(2, GetOrderOfRequest(3));
1080}
1081
[email protected]211d21722009-07-22 15:48:531082TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1083 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1084
robpercival214763f2016-07-01 23:27:011085 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
1086 EXPECT_THAT(StartRequest("a", LOW), IsOk());
1087 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
1088 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531089
[email protected]2431756e2010-09-29 20:26:131090 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531091 client_socket_factory_.allocation_count());
1092
robpercival214763f2016-07-01 23:27:011093 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1094 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1095 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531096
[email protected]2431756e2010-09-29 20:26:131097 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531098
[email protected]2431756e2010-09-29 20:26:131099 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531100 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131101 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531102
1103 // First 4 requests don't have to wait, and finish in order.
1104 EXPECT_EQ(1, GetOrderOfRequest(1));
1105 EXPECT_EQ(2, GetOrderOfRequest(2));
1106 EXPECT_EQ(3, GetOrderOfRequest(3));
1107 EXPECT_EQ(4, GetOrderOfRequest(4));
1108
1109 // Request ("b", 7) has the highest priority, but we can't make new socket for
1110 // group "b", because it has reached the per-group limit. Then we make
1111 // socket for ("c", 6), because it has higher priority than ("a", 4),
1112 // and we still can't make a socket for group "b".
1113 EXPECT_EQ(5, GetOrderOfRequest(5));
1114 EXPECT_EQ(6, GetOrderOfRequest(6));
1115 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171116
1117 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131118 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531119}
1120
1121// Make sure that we count connecting sockets against the total limit.
1122TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1123 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1124
robpercival214763f2016-07-01 23:27:011125 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1126 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1127 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531128
1129 // Create one asynchronous request.
1130 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011131 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531132
[email protected]6b175382009-10-13 06:47:471133 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1134 // actually become pending until 2ms after they have been created. In order
1135 // to flush all tasks, we need to wait so that we know there are no
1136 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451137 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471138
[email protected]211d21722009-07-22 15:48:531139 // The next synchronous request should wait for its turn.
1140 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011141 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531142
[email protected]2431756e2010-09-29 20:26:131143 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531144
[email protected]2431756e2010-09-29 20:26:131145 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531146 client_socket_factory_.allocation_count());
1147
1148 EXPECT_EQ(1, GetOrderOfRequest(1));
1149 EXPECT_EQ(2, GetOrderOfRequest(2));
1150 EXPECT_EQ(3, GetOrderOfRequest(3));
1151 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171152 EXPECT_EQ(5, GetOrderOfRequest(5));
1153
1154 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131155 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531156}
1157
[email protected]6427fe22010-04-16 22:27:411158TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1159 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1160 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1161
robpercival214763f2016-07-01 23:27:011162 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1163 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1164 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1165 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411166
1167 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1168
1169 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1170
robpercival214763f2016-07-01 23:27:011171 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1172 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411173
1174 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1175
[email protected]2431756e2010-09-29 20:26:131176 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411177 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131178 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411179 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131180 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1181 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411182 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1183}
1184
[email protected]d7027bb2010-05-10 18:58:541185TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1186 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1187 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1188
1189 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521190 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501191 EXPECT_EQ(
1192 ERR_IO_PENDING,
1193 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1194 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1195 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1196 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541197
1198 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241199 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521200 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501201 EXPECT_EQ(ERR_IO_PENDING,
1202 handles[i].Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
1203 ClientSocketPool::RespectLimits::ENABLED,
1204 callback.callback(),
1205 ClientSocketPool::ProxyAuthCallback(),
1206 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541207 }
1208
1209 // One will be stalled, cancel all the handles now.
1210 // This should hit the OnAvailableSocketSlot() code where we previously had
1211 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241212 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541213 handles[i].Reset();
1214}
1215
[email protected]eb5a99382010-07-11 03:18:261216TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541217 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1218 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1219
[email protected]eb5a99382010-07-11 03:18:261220 {
1221 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521222 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261223 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Raul Tambre8c1981d2019-02-08 02:22:261224 EXPECT_EQ(OK, handles[i].Init(base::NumberToString(i), params_,
Paul Jensen8d6f87ec2018-01-13 00:46:541225 DEFAULT_PRIORITY, SocketTag(),
1226 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501227 callbacks[i].callback(),
1228 ClientSocketPool::ProxyAuthCallback(),
1229 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261230 }
1231
1232 // Force a stalled group.
1233 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521234 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201235 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541236 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201237 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501238 callback.callback(),
1239 ClientSocketPool::ProxyAuthCallback(),
1240 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261241
1242 // Cancel the stalled request.
1243 stalled_handle.Reset();
1244
1245 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1246 EXPECT_EQ(0, pool_->IdleSocketCount());
1247
1248 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541249 }
1250
[email protected]43a21b82010-06-10 21:30:541251 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1252 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261253}
[email protected]43a21b82010-06-10 21:30:541254
[email protected]eb5a99382010-07-11 03:18:261255TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1256 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1257 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1258
1259 {
1260 ClientSocketHandle handles[kDefaultMaxSockets];
1261 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521262 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201263 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541264 handles[i].Init(
Raul Tambre8c1981d2019-02-08 02:22:261265 base::NumberToString(i), params_, DEFAULT_PRIORITY,
Paul Jensen8d6f87ec2018-01-13 00:46:541266 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501267 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1268 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261269 }
1270
1271 // Force a stalled group.
1272 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1273 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521274 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201275 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541276 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201277 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501278 callback.callback(),
1279 ClientSocketPool::ProxyAuthCallback(),
1280 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261281
1282 // Since it is stalled, it should have no connect jobs.
Raul Tambre8335a6d2019-02-21 16:57:431283 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("foo"));
1284 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
1285 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261286
1287 // Cancel the stalled request.
1288 handles[0].Reset();
1289
[email protected]eb5a99382010-07-11 03:18:261290 // Now we should have a connect job.
Raul Tambre8335a6d2019-02-21 16:57:431291 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("foo"));
1292 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
1293 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261294
1295 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011296 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261297
1298 EXPECT_EQ(kDefaultMaxSockets + 1,
1299 client_socket_factory_.allocation_count());
1300 EXPECT_EQ(0, pool_->IdleSocketCount());
Raul Tambre8335a6d2019-02-21 16:57:431301 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("foo"));
1302 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
1303 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261304
1305 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541306 }
1307
[email protected]eb5a99382010-07-11 03:18:261308 EXPECT_EQ(1, pool_->IdleSocketCount());
1309}
[email protected]43a21b82010-06-10 21:30:541310
[email protected]eb5a99382010-07-11 03:18:261311TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1312 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1313 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541314
[email protected]eb5a99382010-07-11 03:18:261315 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521316 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261317 {
[email protected]51fdc7c2012-04-10 19:19:481318 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261319 ClientSocketHandle handles[kDefaultMaxSockets];
1320 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521321 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201322 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
Paul Jensen8d6f87ec2018-01-13 00:46:541323 params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201324 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501325 callback.callback(),
1326 ClientSocketPool::ProxyAuthCallback(),
1327 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261328 }
1329
1330 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1331 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481332 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261333
1334 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201335 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541336 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201337 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501338 callback.callback(),
1339 ClientSocketPool::ProxyAuthCallback(),
1340 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481341 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261342
1343 // Dropping out of scope will close all handles and return them to idle.
1344 }
[email protected]43a21b82010-06-10 21:30:541345
1346 // But if we wait for it, the released idle sockets will be closed in
1347 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011348 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261349
1350 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1351 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541352}
1353
1354// Regression test for http://crbug.com/40952.
1355TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1356 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221357 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541358 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1359
1360 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1361 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521362 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201363 EXPECT_EQ(
Matt Menke28ac03e2019-02-25 22:25:501364 OK,
1365 handle.Init(base::NumberToString(i), params_, DEFAULT_PRIORITY,
1366 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1367 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1368 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541369 }
1370
1371 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281372 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541373
1374 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1375 // reuse a socket.
1376 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1377 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521378 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541379
1380 // "0" is special here, since it should be the first entry in the sorted map,
1381 // which is the one which we would close an idle socket for. We shouldn't
1382 // close an idle socket though, since we should reuse the idle socket.
Matt Menke28ac03e2019-02-25 22:25:501383 EXPECT_EQ(OK, handle.Init("0", params_, DEFAULT_PRIORITY, SocketTag(),
1384 ClientSocketPool::RespectLimits::ENABLED,
1385 callback.callback(),
1386 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1387 NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541388
1389 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1390 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1391}
1392
[email protected]ab838892009-06-30 18:49:051393TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531394 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091395
robpercival214763f2016-07-01 23:27:011396 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1397 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1398 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1399 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1400 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1401 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1402 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1403 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091404
[email protected]2431756e2010-09-29 20:26:131405 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201406 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1407 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131408 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1409 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091410
[email protected]c9d6a1d2009-07-14 16:15:201411 EXPECT_EQ(1, GetOrderOfRequest(1));
1412 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031413 EXPECT_EQ(8, GetOrderOfRequest(3));
1414 EXPECT_EQ(6, GetOrderOfRequest(4));
1415 EXPECT_EQ(4, GetOrderOfRequest(5));
1416 EXPECT_EQ(3, GetOrderOfRequest(6));
1417 EXPECT_EQ(5, GetOrderOfRequest(7));
1418 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171419
1420 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131421 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091422}
1423
[email protected]ab838892009-06-30 18:49:051424TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531425 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091426
robpercival214763f2016-07-01 23:27:011427 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1428 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1429 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1430 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1431 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1432 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1433 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091434
[email protected]2431756e2010-09-29 20:26:131435 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091436
[email protected]2431756e2010-09-29 20:26:131437 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011438 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201439
[email protected]2431756e2010-09-29 20:26:131440 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201441 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131442 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1443 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091444}
1445
1446// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051447// The pending connect job will be cancelled and should not call back into
1448// ClientSocketPoolBase.
1449TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531450 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201451
[email protected]ab838892009-06-30 18:49:051452 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131453 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521454 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501455 EXPECT_EQ(
1456 ERR_IO_PENDING,
1457 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1458 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1459 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1460 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131461 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091462}
1463
[email protected]ab838892009-06-30 18:49:051464TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531465 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201466
[email protected]ab838892009-06-30 18:49:051467 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061468 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521469 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091470
Matt Menke28ac03e2019-02-25 22:25:501471 EXPECT_EQ(
1472 ERR_IO_PENDING,
1473 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1474 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1475 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1476 NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091477
1478 handle.Reset();
1479
[email protected]6ecf2b92011-12-15 01:14:521480 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501481 EXPECT_EQ(
1482 ERR_IO_PENDING,
1483 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1484 ClientSocketPool::RespectLimits::ENABLED,
1485 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1486 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091487
robpercival214763f2016-07-01 23:27:011488 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091489 EXPECT_FALSE(callback.have_result());
1490
1491 handle.Reset();
1492}
1493
[email protected]ab838892009-06-30 18:49:051494TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531495 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091496
robpercival214763f2016-07-01 23:27:011497 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1498 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1499 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1500 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1501 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1502 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1503 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091504
1505 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201506 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131507 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1508 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091509
[email protected]2431756e2010-09-29 20:26:131510 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091511
[email protected]c9d6a1d2009-07-14 16:15:201512 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1513 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131514 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1515 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091516
[email protected]c9d6a1d2009-07-14 16:15:201517 EXPECT_EQ(1, GetOrderOfRequest(1));
1518 EXPECT_EQ(2, GetOrderOfRequest(2));
1519 EXPECT_EQ(5, GetOrderOfRequest(3));
1520 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131521 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1522 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201523 EXPECT_EQ(4, GetOrderOfRequest(6));
1524 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171525
1526 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131527 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091528}
1529
mmenke33d24423d2015-05-19 19:41:091530// Function to be used as a callback on socket request completion. It first
1531// disconnects the successfully connected socket from the first request, and
1532// then reuses the ClientSocketHandle to request another socket.
1533//
1534// |nested_callback| is called with the result of the second socket request.
1535void RequestSocketOnComplete(ClientSocketHandle* handle,
1536 TestClientSocketPool* pool,
1537 TestConnectJobFactory* test_connect_job_factory,
1538 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411539 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091540 int first_request_result) {
robpercival214763f2016-07-01 23:27:011541 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091542
1543 test_connect_job_factory->set_job_type(next_job_type);
1544
1545 // Don't allow reuse of the socket. Disconnect it and then release it.
1546 if (handle->socket())
1547 handle->socket()->Disconnect();
1548 handle->Reset();
1549
mmenked3641e12016-01-28 16:06:151550 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091551 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501552 int rv = handle->Init(
1553 "a", params, LOWEST, SocketTag(),
1554 ClientSocketPool::RespectLimits::ENABLED, nested_callback->callback(),
1555 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091556 if (rv != ERR_IO_PENDING) {
1557 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411558 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091559 } else {
1560 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521561 }
mmenke33d24423d2015-05-19 19:41:091562}
[email protected]f6d1d6eb2009-06-24 20:16:091563
mmenke33d24423d2015-05-19 19:41:091564// Tests the case where a second socket is requested in a completion callback,
1565// and the second socket connects asynchronously. Reuses the same
1566// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581567TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531568 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201569
[email protected]0b7648c2009-07-06 20:14:011570 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061571 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091572 TestCompletionCallback second_result_callback;
1573 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541574 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1575 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501576 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1577 connect_job_factory_, TestConnectJob::kMockPendingJob,
1578 &second_result_callback),
1579 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011580 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091581
robpercival214763f2016-07-01 23:27:011582 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581583}
[email protected]f6d1d6eb2009-06-24 20:16:091584
mmenke33d24423d2015-05-19 19:41:091585// Tests the case where a second socket is requested in a completion callback,
1586// and the second socket connects synchronously. Reuses the same
1587// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581588TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531589 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201590
[email protected]0b7648c2009-07-06 20:14:011591 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061592 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091593 TestCompletionCallback second_result_callback;
1594 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541595 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1596 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501597 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1598 connect_job_factory_, TestConnectJob::kMockPendingJob,
1599 &second_result_callback),
1600 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011601 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581602
robpercival214763f2016-07-01 23:27:011603 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091604}
1605
1606// Make sure that pending requests get serviced after active requests get
1607// cancelled.
[email protected]ab838892009-06-30 18:49:051608TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531609 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201610
[email protected]0b7648c2009-07-06 20:14:011611 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091612
robpercival214763f2016-07-01 23:27:011613 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1614 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1615 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1616 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));
[email protected]f6d1d6eb2009-06-24 20:16:091620
[email protected]c9d6a1d2009-07-14 16:15:201621 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1622 // Let's cancel them.
1623 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131624 ASSERT_FALSE(request(i)->handle()->is_initialized());
1625 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091626 }
1627
[email protected]f6d1d6eb2009-06-24 20:16:091628 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131629 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011630 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131631 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091632 }
1633
[email protected]2431756e2010-09-29 20:26:131634 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1635 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091636}
1637
1638// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051639TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531640 const size_t kMaxSockets = 5;
1641 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201642
[email protected]0b7648c2009-07-06 20:14:011643 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091644
[email protected]211d21722009-07-22 15:48:531645 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1646 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091647
1648 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531649 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011650 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091651
[email protected]211d21722009-07-22 15:48:531652 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011653 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091654}
1655
mmenke9d72fe42017-05-18 22:36:071656// Make sure that pending requests that complete synchronously get serviced
1657// after active requests fail. See https://crbug.com/723748
1658TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1659 const size_t kNumberOfRequests = 10;
1660 const size_t kMaxSockets = 1;
1661 CreatePool(kMaxSockets, kMaxSockets);
1662
1663 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1664
1665 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1666
1667 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1668
1669 // Queue up all the other requests
1670 for (size_t i = 1; i < kNumberOfRequests; ++i)
1671 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1672
1673 // Make sure all requests fail, instead of hanging.
1674 for (size_t i = 0; i < kNumberOfRequests; ++i)
1675 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1676}
1677
[email protected]5fc08e32009-07-15 17:09:571678TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531679 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571680
1681 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1682
[email protected]2431756e2010-09-29 20:26:131683 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521684 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501685 int rv = handle.Init(
1686 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1687 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1688 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011689 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571690
1691 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131692 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571693
Paul Jensen8d6f87ec2018-01-13 00:46:541694 rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151695 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501696 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1697 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011698 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1699 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571700
[email protected]2431756e2010-09-29 20:26:131701 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481702 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571703 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1704}
1705
xunjieli26619e72016-11-23 19:39:551706TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551707 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1708 ClientSocketHandle handle;
1709 TestCompletionCallback callback;
1710 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501711 int rv = handle.Init(
1712 "a", params_, LOWEST, SocketTag(),
1713 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1714 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551715 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;
Matt Menke28ac03e2019-02-25 22:25:501726 int rv = handle1.Init(
1727 "a", params_, LOWEST, SocketTag(),
1728 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1729 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231730 EXPECT_THAT(rv, IsOk());
1731 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541732 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231733 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501734 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1735 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231736 ClientSocketHandle handle3;
Paul Jensen8d6f87ec2018-01-13 00:46:541737 rv = handle3.Init("b", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231738 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501739 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1740 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231741 EXPECT_THAT(rv, IsOk());
1742 handle1.Reset();
1743 handle2.Reset();
1744 handle3.Reset();
1745 EXPECT_EQ(3, pool_->IdleSocketCount());
1746 pool_->CloseIdleSocketsInGroup("a");
1747 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231748}
1749
xunjieli26619e72016-11-23 19:39:551750TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551751 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1752 ClientSocketHandle handle;
1753 TestCompletionCallback callback;
1754 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501755 int rv = handle.Init(
1756 "a", params_, LOWEST, SocketTag(),
1757 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1758 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551759 EXPECT_THAT(rv, IsOk());
1760 StreamSocket* socket = handle.socket();
1761 handle.Reset();
1762 EXPECT_EQ(1, pool_->IdleSocketCount());
1763
1764 // Disconnect socket now to make the socket unusable.
1765 socket->Disconnect();
1766 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541767 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551768 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501769 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1770 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551771 EXPECT_THAT(rv, IsOk());
1772 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551773}
1774
[email protected]2b7523d2009-07-29 20:29:231775// Regression test for http://crbug.com/17985.
1776TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1777 const int kMaxSockets = 3;
1778 const int kMaxSocketsPerGroup = 2;
1779 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1780
[email protected]ac790b42009-12-02 04:31:311781 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231782
robpercival214763f2016-07-01 23:27:011783 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1784 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231785
1786 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011787 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231788
1789 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011790 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231791
1792 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011793 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1794 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231795
[email protected]eb5a99382010-07-11 03:18:261796 // Release the first two sockets from "a". Because this is a keepalive,
1797 // the first release will unblock the pending request for "a". The
1798 // second release will unblock a request for "c", becaue it is the next
1799 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131800 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1801 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231802
1803 // Closing idle sockets should not get us into trouble, but in the bug
1804 // we were hitting a CHECK here.
Raul Tambre8335a6d2019-02-21 16:57:431805 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541806 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261807
[email protected]2da659e2013-05-23 20:51:341808 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281809 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231810}
1811
[email protected]4d3b05d2010-01-27 21:27:291812TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531813 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571814
1815 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131816 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521817 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511818 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501819 int rv = handle.Init(
1820 "a", params_, LOWEST, SocketTag(),
1821 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1822 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011823 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131824 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481825 TestLoadTimingInfoNotConnected(handle);
1826
robpercival214763f2016-07-01 23:27:011827 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131828 EXPECT_TRUE(handle.is_initialized());
1829 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481830 TestLoadTimingInfoConnectedNotReused(handle);
1831
[email protected]2431756e2010-09-29 20:26:131832 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481833 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301834
mmenke43758e62015-05-04 21:09:461835 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401836 log.GetEntries(&entries);
1837
1838 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001839 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171840 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001841 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1842 NetLogEventPhase::NONE));
1843 EXPECT_TRUE(LogContainsEvent(entries, 2,
1844 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1845 NetLogEventPhase::NONE));
1846 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571847}
1848
[email protected]4d3b05d2010-01-27 21:27:291849TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571850 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531851 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571852
1853 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131854 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521855 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511856 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181857 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131858 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431859 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451860 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131861 handle.set_ssl_error_response_info(info);
Matt Menke28ac03e2019-02-25 22:25:501862 EXPECT_EQ(
1863 ERR_IO_PENDING,
1864 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1865 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1866 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1867 log.bound()));
[email protected]2431756e2010-09-29 20:26:131868 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011869 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131870 EXPECT_FALSE(handle.is_ssl_error());
1871 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301872
mmenke43758e62015-05-04 21:09:461873 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401874 log.GetEntries(&entries);
1875
1876 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001877 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171878 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001879 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1880 NetLogEventPhase::NONE));
1881 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571882}
1883
mmenke6be122f2015-03-09 22:22:471884// Check that an async ConnectJob failure does not result in creation of a new
1885// ConnectJob when there's another pending request also waiting on its own
1886// ConnectJob. See http://crbug.com/463960.
1887TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1888 CreatePool(2, 2);
1889 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1890
robpercival214763f2016-07-01 23:27:011891 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1892 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471893
robpercival214763f2016-07-01 23:27:011894 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1895 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471896
1897 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1898}
1899
[email protected]4d3b05d2010-01-27 21:27:291900TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101901 // TODO(eroman): Add back the log expectations! Removed them because the
1902 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531903 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571904
1905 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131906 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521907 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131908 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521909 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571910
Matt Menke28ac03e2019-02-25 22:25:501911 EXPECT_EQ(
1912 ERR_IO_PENDING,
1913 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1914 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1915 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1916 NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511917 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201918 EXPECT_EQ(
1919 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541920 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201921 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501922 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1923 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571924
[email protected]2431756e2010-09-29 20:26:131925 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571926
[email protected]fd7b7c92009-08-20 19:38:301927
1928 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301929
robpercival214763f2016-07-01 23:27:011930 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131931 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301932
1933 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531934 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571935}
1936
[email protected]4d3b05d2010-01-27 21:27:291937TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341938 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1939
[email protected]17a0c6c2009-08-04 00:07:041940 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1941
robpercival214763f2016-07-01 23:27:011942 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1943 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1944 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1945 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341946
Raul Tambre8335a6d2019-02-21 16:57:431947 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1948 static_cast<int>(pool_->NumConnectJobsInGroup("a")));
[email protected]2431756e2010-09-29 20:26:131949 (*requests())[2]->handle()->Reset();
1950 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431951 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1952 static_cast<int>(pool_->NumConnectJobsInGroup("a")));
[email protected]974ebd62009-08-03 23:14:341953
[email protected]2431756e2010-09-29 20:26:131954 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431955 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1956 static_cast<int>(pool_->NumConnectJobsInGroup("a")));
[email protected]974ebd62009-08-03 23:14:341957
[email protected]2431756e2010-09-29 20:26:131958 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431959 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1960 static_cast<int>(pool_->NumConnectJobsInGroup("a")));
[email protected]974ebd62009-08-03 23:14:341961}
1962
[email protected]5fc08e32009-07-15 17:09:571963// When requests and ConnectJobs are not coupled, the request will get serviced
1964// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291965TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531966 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571967
1968 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321969 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571970
[email protected]2431756e2010-09-29 20:26:131971 std::vector<TestSocketRequest*> request_order;
1972 size_t completion_count; // unused
1973 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:501974 int rv = req1.handle()->Init(
1975 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1976 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
1977 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011978 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1979 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571980
1981 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1982 // without a job.
1983 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1984
[email protected]2431756e2010-09-29 20:26:131985 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:501986 rv = req2.handle()->Init(
1987 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1988 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
1989 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011990 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131991 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:501992 rv = req3.handle()->Init(
1993 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1994 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
1995 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011996 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571997
1998 // Both Requests 2 and 3 are pending. We release socket 1 which should
1999 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332000 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342001 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282002 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332003 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012004 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332005 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572006
2007 // Signal job 2, which should service request 3.
2008
2009 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012010 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572011
Raul Tambre8335a6d2019-02-21 16:57:432012 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132013 EXPECT_EQ(&req1, request_order[0]);
2014 EXPECT_EQ(&req2, request_order[1]);
2015 EXPECT_EQ(&req3, request_order[2]);
Raul Tambre8335a6d2019-02-21 16:57:432016 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]5fc08e32009-07-15 17:09:572017}
2018
2019// The requests are not coupled to the jobs. So, the requests should finish in
2020// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292021TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532022 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572023 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322024 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572025
[email protected]2431756e2010-09-29 20:26:132026 std::vector<TestSocketRequest*> request_order;
2027 size_t completion_count; // unused
2028 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502029 int rv = req1.handle()->Init(
2030 "a", params_, DEFAULT_PRIORITY, SocketTag(),
2031 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2032 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012033 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572034
[email protected]2431756e2010-09-29 20:26:132035 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502036 rv = req2.handle()->Init(
2037 "a", params_, DEFAULT_PRIORITY, SocketTag(),
2038 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2039 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012040 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572041
2042 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322043 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572044
[email protected]2431756e2010-09-29 20:26:132045 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502046 rv = req3.handle()->Init(
2047 "a", params_, DEFAULT_PRIORITY, SocketTag(),
2048 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2049 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012050 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572051
robpercival214763f2016-07-01 23:27:012052 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2053 EXPECT_THAT(req2.WaitForResult(), IsOk());
2054 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572055
Raul Tambre8335a6d2019-02-21 16:57:432056 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132057 EXPECT_EQ(&req1, request_order[0]);
2058 EXPECT_EQ(&req2, request_order[1]);
2059 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572060}
2061
[email protected]03b7c8c2013-07-20 04:38:552062// Test GetLoadState in the case there's only one socket request.
2063TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532064 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552065 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572066
[email protected]2431756e2010-09-29 20:26:132067 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522068 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502069 int rv = handle.Init(
2070 "a", params_, DEFAULT_PRIORITY, SocketTag(),
2071 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2072 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012073 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552074 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572075
[email protected]03b7c8c2013-07-20 04:38:552076 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2077 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2078
2079 // No point in completing the connection, since ClientSocketHandles only
2080 // expect the LoadState to be checked while connecting.
2081}
2082
2083// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:002084// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:552085TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2086 CreatePool(2, 2);
2087 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2088
2089 ClientSocketHandle handle;
2090 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502091 int rv = handle.Init(
2092 "a", params_, DEFAULT_PRIORITY, SocketTag(),
2093 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2094 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012095 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002096 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2097
2098 ClientSocketHandle handle2;
2099 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542100 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152101 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502102 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2103 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012104 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002105 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2106
2107 // Check that both handles report the state of the first job.
2108 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2109 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2110
2111 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2112
2113 // Check that both handles change to LOAD_STATE_CONNECTING.
2114 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2115 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2116}
2117
2118// Test that the second connection request does not affect the pool's load
2119// status.
2120TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
2121 CreatePool(2, 2);
2122 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2123
2124 ClientSocketHandle handle;
2125 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502126 int rv = handle.Init(
2127 "a", params_, DEFAULT_PRIORITY, SocketTag(),
2128 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2129 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012130 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572131
[email protected]2431756e2010-09-29 20:26:132132 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522133 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542134 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152135 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502136 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2137 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012138 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002139 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552140
[email protected]03b7c8c2013-07-20 04:38:552141 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2142 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2143
haavardm835c1d62015-04-22 08:18:002144 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552145 // second handle switches to the state of the remaining ConnectJob.
2146 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012147 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002148 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552149}
2150
2151// Test GetLoadState in the case the per-group limit is reached.
2152TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2153 CreatePool(2, 1);
2154 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2155
2156 ClientSocketHandle handle;
2157 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502158 int rv = handle.Init(
2159 "a", params_, MEDIUM, SocketTag(),
2160 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2161 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012162 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552163 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2164
2165 // Request another socket from the same pool, buth with a higher priority.
2166 // The first request should now be stalled at the socket group limit.
2167 ClientSocketHandle handle2;
2168 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542169 rv = handle2.Init("a", params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152170 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502171 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2172 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012173 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552174 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2175 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2176
2177 // The first handle should remain stalled as the other socket goes through
2178 // the connect process.
2179
2180 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2181 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2182 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2183
2184 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012185 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552186 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2187
2188 // Closing the second socket should cause the stalled handle to finally get a
2189 // ConnectJob.
2190 handle2.socket()->Disconnect();
2191 handle2.Reset();
2192 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2193}
2194
2195// Test GetLoadState in the case the per-pool limit is reached.
2196TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2197 CreatePool(2, 2);
2198 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2199
2200 ClientSocketHandle handle;
2201 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502202 int rv = handle.Init(
2203 "a", params_, DEFAULT_PRIORITY, SocketTag(),
2204 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2205 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012206 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552207
2208 // Request for socket from another pool.
2209 ClientSocketHandle handle2;
2210 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542211 rv = handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152212 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502213 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2214 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012215 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552216
2217 // Request another socket from the first pool. Request should stall at the
2218 // socket pool limit.
2219 ClientSocketHandle handle3;
2220 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542221 rv = handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152222 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502223 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2224 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012225 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552226
2227 // The third handle should remain stalled as the other sockets in its group
2228 // goes through the connect process.
2229
2230 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2231 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2232
2233 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2234 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2235 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2236
2237 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012238 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552239 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2240
2241 // Closing a socket should allow the stalled handle to finally get a new
2242 // ConnectJob.
2243 handle.socket()->Disconnect();
2244 handle.Reset();
2245 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572246}
2247
[email protected]e772db3f2010-07-12 18:11:132248TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2249 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2250 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2251
[email protected]2431756e2010-09-29 20:26:132252 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522253 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502254 EXPECT_EQ(
2255 ERR_PROXY_AUTH_REQUESTED,
2256 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2257 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2258 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2259 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132260 EXPECT_TRUE(handle.is_initialized());
2261 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132262}
2263
2264TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2265 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2266
2267 connect_job_factory_->set_job_type(
2268 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132269 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522270 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502271 EXPECT_EQ(
2272 ERR_IO_PENDING,
2273 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2274 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2275 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2276 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132277 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012278 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132279 EXPECT_TRUE(handle.is_initialized());
2280 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132281}
2282
[email protected]e60e47a2010-07-14 03:37:182283TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2284 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2285 connect_job_factory_->set_job_type(
2286 TestConnectJob::kMockAdditionalErrorStateJob);
2287
[email protected]2431756e2010-09-29 20:26:132288 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522289 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502290 EXPECT_EQ(
2291 ERR_CONNECTION_FAILED,
2292 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2293 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2294 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2295 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132296 EXPECT_FALSE(handle.is_initialized());
2297 EXPECT_FALSE(handle.socket());
2298 EXPECT_TRUE(handle.is_ssl_error());
2299 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182300}
2301
2302TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2303 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2304
2305 connect_job_factory_->set_job_type(
2306 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132307 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522308 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502309 EXPECT_EQ(
2310 ERR_IO_PENDING,
2311 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2312 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2313 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2314 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132315 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012316 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132317 EXPECT_FALSE(handle.is_initialized());
2318 EXPECT_FALSE(handle.socket());
2319 EXPECT_TRUE(handle.is_ssl_error());
2320 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182321}
2322
martijn003cd612016-05-19 22:24:382323// Make sure we can reuse sockets.
2324TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412325 CreatePoolWithIdleTimeouts(
2326 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032327 base::TimeDelta(), // Time out unused sockets immediately.
2328 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2329
2330 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2331
2332 ClientSocketHandle handle;
2333 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502334 int rv = handle.Init(
2335 "a", params_, LOWEST, SocketTag(),
2336 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2337 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012338 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032339 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012340 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032341
2342 // Use and release the socket.
Bence Békybdbb0e72018-08-07 21:42:592343 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382344 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482345 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032346 handle.Reset();
2347
2348 // Should now have one idle socket.
2349 ASSERT_EQ(1, pool_->IdleSocketCount());
2350
2351 // Request a new socket. This should reuse the old socket and complete
2352 // synchronously.
vishal.b62985ca92015-04-17 08:45:512353 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502354 rv = handle.Init(
2355 "a", params_, LOWEST, SocketTag(),
2356 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2357 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012358 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032359 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482360 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032361
2362 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:432363 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]e7b1c6d2c2012-05-05 00:54:032364 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2365
mmenke43758e62015-05-04 21:09:462366 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032367 log.GetEntries(&entries);
2368 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002369 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032370}
2371
martijn003cd612016-05-19 22:24:382372// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172373TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032374 CreatePoolWithIdleTimeouts(
2375 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2376 base::TimeDelta(), // Time out unused sockets immediately
2377 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412378
2379 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2380
2381 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2382
2383 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522384 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502385 int rv = handle.Init(
2386 "a", params_, LOWEST, SocketTag(),
2387 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2388 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012389 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412390 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2391
2392 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522393 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542394 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152395 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502396 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2397 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012398 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412399 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2400
2401 // Cancel one of the requests. Wait for the other, which will get the first
2402 // job. Release the socket. Run the loop again to make sure the second
2403 // socket is sitting idle and the first one is released (since ReleaseSocket()
2404 // just posts a DoReleaseSocket() task).
2405
2406 handle.Reset();
robpercival214763f2016-07-01 23:27:012407 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412408 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:592409 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382410 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412411 handle2.Reset();
2412
[email protected]e7b1c6d2c2012-05-05 00:54:032413 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2414 // actually become pending until 2ms after they have been created. In order
2415 // to flush all tasks, we need to wait so that we know there are no
2416 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452417 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412418
[email protected]e7b1c6d2c2012-05-05 00:54:032419 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412420 ASSERT_EQ(2, pool_->IdleSocketCount());
2421
2422 // Request a new socket. This should cleanup the unused and timed out ones.
2423 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512424 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522425 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542426 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152427 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502428 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2429 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012430 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2431 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412432 EXPECT_FALSE(handle.is_reused());
2433
[email protected]e7b1c6d2c2012-05-05 00:54:032434 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412435 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:432436 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]64770b7d2011-11-16 04:30:412437 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2438
mmenke43758e62015-05-04 21:09:462439 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412440 log.GetEntries(&entries);
2441 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002442 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412443}
2444
[email protected]2041cf342010-02-19 03:15:592445// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162446// because of multiple releasing disconnected sockets.
2447TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2448 CreatePoolWithIdleTimeouts(
2449 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2450 base::TimeDelta(), // Time out unused sockets immediately.
2451 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2452
2453 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2454
2455 // Startup 4 connect jobs. Two of them will be pending.
2456
[email protected]2431756e2010-09-29 20:26:132457 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522458 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502459 int rv = handle.Init(
2460 "a", params_, LOWEST, SocketTag(),
2461 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2462 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012463 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162464
[email protected]2431756e2010-09-29 20:26:132465 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522466 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542467 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152468 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502469 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2470 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012471 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162472
[email protected]2431756e2010-09-29 20:26:132473 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522474 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542475 rv = handle3.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152476 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502477 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2478 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012479 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162480
[email protected]2431756e2010-09-29 20:26:132481 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522482 TestCompletionCallback callback4;
Paul Jensen8d6f87ec2018-01-13 00:46:542483 rv = handle4.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152484 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502485 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2486 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012487 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162488
2489 // Release two disconnected sockets.
2490
[email protected]2431756e2010-09-29 20:26:132491 handle.socket()->Disconnect();
2492 handle.Reset();
2493 handle2.socket()->Disconnect();
2494 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162495
robpercival214763f2016-07-01 23:27:012496 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132497 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012498 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132499 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162500}
2501
[email protected]d7027bb2010-05-10 18:58:542502// Regression test for http://crbug.com/42267.
2503// When DoReleaseSocket() is processed for one socket, it is blocked because the
2504// other stalled groups all have releasing sockets, so no progress can be made.
2505TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2506 CreatePoolWithIdleTimeouts(
2507 4 /* socket limit */, 4 /* socket limit per group */,
2508 base::TimeDelta(), // Time out unused sockets immediately.
2509 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2510
2511 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2512
2513 // Max out the socket limit with 2 per group.
2514
[email protected]2431756e2010-09-29 20:26:132515 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522516 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132517 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522518 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542519
2520 for (int i = 0; i < 2; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:542521 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152522 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502523 callback_a[i].callback(),
2524 ClientSocketPool::ProxyAuthCallback(),
2525 pool_.get(), NetLogWithSource()));
Paul Jensen8d6f87ec2018-01-13 00:46:542526 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152527 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502528 callback_b[i].callback(),
2529 ClientSocketPool::ProxyAuthCallback(),
2530 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542531 }
[email protected]b89f7e42010-05-20 20:37:002532
[email protected]d7027bb2010-05-10 18:58:542533 // Make 4 pending requests, 2 per group.
2534
2535 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202536 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542537 handle_a[i].Init("a", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202538 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502539 callback_a[i].callback(),
2540 ClientSocketPool::ProxyAuthCallback(),
2541 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:202542 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542543 handle_b[i].Init("b", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202544 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502545 callback_b[i].callback(),
2546 ClientSocketPool::ProxyAuthCallback(),
2547 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542548 }
2549
2550 // Release b's socket first. The order is important, because in
2551 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2552 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2553 // first, which has a releasing socket, so it refuses to start up another
2554 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132555 handle_b[0].socket()->Disconnect();
2556 handle_b[0].Reset();
2557 handle_a[0].socket()->Disconnect();
2558 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542559
2560 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282561 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542562
[email protected]2431756e2010-09-29 20:26:132563 handle_b[1].socket()->Disconnect();
2564 handle_b[1].Reset();
2565 handle_a[1].socket()->Disconnect();
2566 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542567
2568 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012569 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2570 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542571 }
2572}
2573
[email protected]fd4fe0b2010-02-08 23:02:152574TEST_F(ClientSocketPoolBaseTest,
2575 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2576 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2577
2578 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2579
robpercival214763f2016-07-01 23:27:012580 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2581 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2582 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2583 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152584
robpercival214763f2016-07-01 23:27:012585 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2586 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132587 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152588
2589 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132590 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012591 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152592
[email protected]2431756e2010-09-29 20:26:132593 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012594 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132595 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152596
2597 EXPECT_EQ(1, GetOrderOfRequest(1));
2598 EXPECT_EQ(2, GetOrderOfRequest(2));
2599 EXPECT_EQ(3, GetOrderOfRequest(3));
2600 EXPECT_EQ(4, GetOrderOfRequest(4));
2601
2602 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132603 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152604}
2605
[email protected]6ecf2b92011-12-15 01:14:522606class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042607 public:
[email protected]2431756e2010-09-29 20:26:132608 TestReleasingSocketRequest(TestClientSocketPool* pool,
2609 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182610 bool reset_releasing_handle)
2611 : pool_(pool),
2612 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042613 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522614
Chris Watkins7a41d3552017-12-01 02:13:272615 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042616
2617 ClientSocketHandle* handle() { return &handle_; }
2618
Bence Béky8ddc2492018-06-13 01:02:042619 CompletionOnceCallback callback() {
2620 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2621 base::Unretained(this));
2622 }
[email protected]4f1e4982010-03-02 18:31:042623
2624 private:
[email protected]6ecf2b92011-12-15 01:14:522625 void OnComplete(int result) {
2626 SetResult(result);
2627 if (reset_releasing_handle_)
2628 handle_.Reset();
2629
mmenked3641e12016-01-28 16:06:152630 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
Matt Menke28ac03e2019-02-25 22:25:502631 EXPECT_EQ(expected_result_,
2632 handle2_.Init("a", con_params, DEFAULT_PRIORITY, SocketTag(),
2633 ClientSocketPool::RespectLimits::ENABLED,
2634 CompletionOnceCallback(),
2635 ClientSocketPool::ProxyAuthCallback(), pool_,
2636 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522637 }
2638
[email protected]2431756e2010-09-29 20:26:132639 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182640 int expected_result_;
2641 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042642 ClientSocketHandle handle_;
2643 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042644};
2645
[email protected]e60e47a2010-07-14 03:37:182646
2647TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2648 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2649
robpercival214763f2016-07-01 23:27:012650 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2651 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2652 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182653
[email protected]2431756e2010-09-29 20:26:132654 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182655 client_socket_factory_.allocation_count());
2656
2657 connect_job_factory_->set_job_type(
2658 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2659 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202660 EXPECT_EQ(
2661 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542662 req.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202663 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502664 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2665 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182666 // The next job should complete synchronously
2667 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2668
robpercival214763f2016-07-01 23:27:012669 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182670 EXPECT_FALSE(req.handle()->is_initialized());
2671 EXPECT_FALSE(req.handle()->socket());
2672 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432673 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182674}
2675
[email protected]b6501d3d2010-06-03 23:53:342676// http://crbug.com/44724 regression test.
2677// We start releasing the pool when we flush on network change. When that
2678// happens, the only active references are in the ClientSocketHandles. When a
2679// ConnectJob completes and calls back into the last ClientSocketHandle, that
2680// callback can release the last reference and delete the pool. After the
2681// callback finishes, we go back to the stack frame within the now-deleted pool.
2682// Executing any code that refers to members of the now-deleted pool can cause
2683// crashes.
2684TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2685 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2686 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2687
2688 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522689 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502690 EXPECT_EQ(
2691 ERR_IO_PENDING,
2692 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2693 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2694 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2695 NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342696
[email protected]7af985a2012-12-14 22:40:422697 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342698
2699 // We'll call back into this now.
2700 callback.WaitForResult();
2701}
2702
[email protected]a7e38572010-06-07 18:22:242703TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2704 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2705 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2706
2707 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522708 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502709 EXPECT_EQ(
2710 ERR_IO_PENDING,
2711 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2712 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2713 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2714 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012715 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242716 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2717
[email protected]7af985a2012-12-14 22:40:422718 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242719
2720 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282721 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242722
Matt Menke28ac03e2019-02-25 22:25:502723 EXPECT_EQ(
2724 ERR_IO_PENDING,
2725 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2726 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2727 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2728 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012729 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242730 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2731}
2732
[email protected]6ecf2b92011-12-15 01:14:522733class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142734 public:
Bence Béky8ddc2492018-06-13 01:02:042735 ConnectWithinCallback(const std::string& group_name,
2736 const scoped_refptr<TestSocketParams>& params,
2737 TestClientSocketPool* pool)
2738 : group_name_(group_name), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142739
Chris Watkins7a41d3552017-12-01 02:13:272740 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142741
2742 int WaitForNestedResult() {
2743 return nested_callback_.WaitForResult();
2744 }
2745
Bence Béky8ddc2492018-06-13 01:02:042746 CompletionOnceCallback callback() {
2747 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2748 base::Unretained(this));
2749 }
[email protected]6ecf2b92011-12-15 01:14:522750
[email protected]06f92462010-08-31 19:24:142751 private:
[email protected]6ecf2b92011-12-15 01:14:522752 void OnComplete(int result) {
2753 SetResult(result);
Matt Menke28ac03e2019-02-25 22:25:502754 EXPECT_EQ(ERR_IO_PENDING,
2755 handle_.Init(group_name_, params_, DEFAULT_PRIORITY, SocketTag(),
2756 ClientSocketPool::RespectLimits::ENABLED,
2757 nested_callback_.callback(),
2758 ClientSocketPool::ProxyAuthCallback(), pool_,
2759 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522760 }
2761
[email protected]06f92462010-08-31 19:24:142762 const std::string group_name_;
2763 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132764 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142765 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522766 TestCompletionCallback nested_callback_;
2767
2768 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142769};
2770
2771TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2772 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2773
2774 // First job will be waiting until it gets aborted.
2775 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2776
2777 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132778 ConnectWithinCallback callback("a", params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:502779 EXPECT_EQ(
2780 ERR_IO_PENDING,
2781 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2782 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2783 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2784 NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142785
2786 // Second job will be started during the first callback, and will
2787 // asynchronously complete with OK.
2788 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422789 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012790 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2791 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142792}
2793
Matt Menke141b87f22019-01-30 02:43:032794TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
2795 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2796 pool_->EnableConnectBackupJobs();
2797
2798 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2799 ClientSocketHandle handle;
2800 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502801 EXPECT_EQ(
2802 ERR_IO_PENDING,
2803 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
2804 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2805 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2806 NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:032807 // The backup timer fires but doesn't start a new ConnectJob while resolving
2808 // the hostname.
2809 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2810 FastForwardBy(base::TimeDelta::FromMilliseconds(
2811 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2812 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2813
2814 // Once the ConnectJob has finished resolving the hostname, the backup timer
2815 // will create a ConnectJob when it fires.
2816 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2817 FastForwardBy(base::TimeDelta::FromMilliseconds(
2818 ClientSocketPool::kMaxConnectRetryIntervalMs));
2819 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2820}
2821
2822// Test that no backup socket is created when a ConnectJob connects before it
2823// completes.
2824TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
2825 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2826 pool_->EnableConnectBackupJobs();
2827
2828 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2829 ClientSocketHandle handle;
2830 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502831 EXPECT_EQ(
2832 ERR_IO_PENDING,
2833 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
2834 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2835 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2836 NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:032837 // The backup timer fires but doesn't start a new ConnectJob while resolving
2838 // the hostname.
2839 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2840 FastForwardBy(base::TimeDelta::FromMilliseconds(
2841 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2842 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2843
2844 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2845 client_socket_factory_.SetJobHasEstablishedConnection(0);
2846 FastForwardBy(base::TimeDelta::FromMilliseconds(
2847 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2848 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2849}
2850
[email protected]25eea382010-07-10 23:55:262851// Cancel a pending socket request while we're at max sockets,
2852// and verify that the backup socket firing doesn't cause a crash.
2853TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2854 // Max 4 sockets globally, max 4 sockets per group.
2855 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222856 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262857
[email protected]4baaf9d2010-08-31 15:15:442858 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2859 // timer.
[email protected]25eea382010-07-10 23:55:262860 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2861 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522862 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502863 EXPECT_EQ(
2864 ERR_IO_PENDING,
2865 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
2866 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2867 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2868 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262869
2870 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2871 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2872 ClientSocketHandle handles[kDefaultMaxSockets];
2873 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522874 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542875 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202876 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502877 callback.callback(),
2878 ClientSocketPool::ProxyAuthCallback(),
2879 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262880 }
2881
fdoray5eeb7642016-06-22 16:11:282882 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262883
2884 // Cancel the pending request.
2885 handle.Reset();
2886
2887 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452888 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002889 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262890
[email protected]25eea382010-07-10 23:55:262891 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2892}
2893
[email protected]3f00be82010-09-27 19:50:022894TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442895 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2896 pool_->EnableConnectBackupJobs();
2897
2898 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2899 // timer.
2900 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2901 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522902 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502903 EXPECT_EQ(
2904 ERR_IO_PENDING,
2905 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
2906 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2907 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2908 NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442909 ASSERT_TRUE(pool_->HasGroup("bar"));
Raul Tambre8335a6d2019-02-21 16:57:432910 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("bar"));
2911 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("bar"));
2912 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442913
2914 // Cancel the socket request. This should cancel the backup timer. Wait for
2915 // the backup time to see if it indeed got canceled.
2916 handle.Reset();
2917 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452918 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002919 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]4baaf9d2010-08-31 15:15:442920 ASSERT_TRUE(pool_->HasGroup("bar"));
Raul Tambre8335a6d2019-02-21 16:57:432921 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442922}
2923
[email protected]3f00be82010-09-27 19:50:022924TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2925 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2926 pool_->EnableConnectBackupJobs();
2927
2928 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2929 // timer.
2930 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2931 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522932 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502933 EXPECT_EQ(
2934 ERR_IO_PENDING,
2935 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
2936 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2937 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2938 NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022939 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2940 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522941 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202942 EXPECT_EQ(
2943 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542944 handle2.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202945 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502946 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2947 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022948 ASSERT_TRUE(pool_->HasGroup("bar"));
Raul Tambre8335a6d2019-02-21 16:57:432949 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("bar"));
[email protected]3f00be82010-09-27 19:50:022950
2951 // Cancel request 1 and then complete request 2. With the requests finished,
2952 // the backup timer should be cancelled.
2953 handle.Reset();
robpercival214763f2016-07-01 23:27:012954 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022955 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452956 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002957 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:022958}
2959
[email protected]eb5a99382010-07-11 03:18:262960// Test delayed socket binding for the case where we have two connects,
2961// and while one is waiting on a connect, the other frees up.
2962// The socket waiting on a connect should switch immediately to the freed
2963// up socket.
2964TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2965 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2966 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2967
2968 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522969 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502970 EXPECT_EQ(
2971 ERR_IO_PENDING,
2972 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2973 ClientSocketPool::RespectLimits::ENABLED,
2974 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2975 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012976 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262977
2978 // No idle sockets, no pending jobs.
2979 EXPECT_EQ(0, pool_->IdleSocketCount());
Raul Tambre8335a6d2019-02-21 16:57:432980 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:262981
2982 // Create a second socket to the same host, but this one will wait.
2983 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2984 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:502985 EXPECT_EQ(
2986 ERR_IO_PENDING,
2987 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
2988 ClientSocketPool::RespectLimits::ENABLED,
2989 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2990 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262991 // No idle sockets, and one connecting job.
2992 EXPECT_EQ(0, pool_->IdleSocketCount());
Raul Tambre8335a6d2019-02-21 16:57:432993 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:262994
2995 // Return the first handle to the pool. This will initiate the delayed
2996 // binding.
2997 handle1.Reset();
2998
fdoray5eeb7642016-06-22 16:11:282999 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263000
3001 // Still no idle sockets, still one pending connect job.
3002 EXPECT_EQ(0, pool_->IdleSocketCount());
Raul Tambre8335a6d2019-02-21 16:57:433003 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263004
3005 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013006 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263007
3008 // And we can see there is still one job waiting.
Raul Tambre8335a6d2019-02-21 16:57:433009 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263010
3011 // Finally, signal the waiting Connect.
3012 client_socket_factory_.SignalJobs();
Raul Tambre8335a6d2019-02-21 16:57:433013 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263014
fdoray5eeb7642016-06-22 16:11:283015 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263016}
3017
3018// Test delayed socket binding when a group is at capacity and one
3019// of the group's sockets frees up.
3020TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3021 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3022 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3023
3024 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523025 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503026 EXPECT_EQ(
3027 ERR_IO_PENDING,
3028 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3029 ClientSocketPool::RespectLimits::ENABLED,
3030 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3031 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013032 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263033
3034 // No idle sockets, no pending jobs.
3035 EXPECT_EQ(0, pool_->IdleSocketCount());
Raul Tambre8335a6d2019-02-21 16:57:433036 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263037
3038 // Create a second socket to the same host, but this one will wait.
3039 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3040 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503041 EXPECT_EQ(
3042 ERR_IO_PENDING,
3043 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3044 ClientSocketPool::RespectLimits::ENABLED,
3045 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3046 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263047 // No idle sockets, and one connecting job.
3048 EXPECT_EQ(0, pool_->IdleSocketCount());
Raul Tambre8335a6d2019-02-21 16:57:433049 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263050
3051 // Return the first handle to the pool. This will initiate the delayed
3052 // binding.
3053 handle1.Reset();
3054
fdoray5eeb7642016-06-22 16:11:283055 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263056
3057 // Still no idle sockets, still one pending connect job.
3058 EXPECT_EQ(0, pool_->IdleSocketCount());
Raul Tambre8335a6d2019-02-21 16:57:433059 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263060
3061 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013062 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263063
3064 // And we can see there is still one job waiting.
Raul Tambre8335a6d2019-02-21 16:57:433065 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263066
3067 // Finally, signal the waiting Connect.
3068 client_socket_factory_.SignalJobs();
Raul Tambre8335a6d2019-02-21 16:57:433069 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263070
fdoray5eeb7642016-06-22 16:11:283071 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263072}
3073
3074// Test out the case where we have one socket connected, one
3075// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513076// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263077// should complete, by taking the first socket's idle socket.
3078TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3079 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3080 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3081
3082 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523083 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503084 EXPECT_EQ(
3085 ERR_IO_PENDING,
3086 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3087 ClientSocketPool::RespectLimits::ENABLED,
3088 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3089 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013090 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263091
3092 // No idle sockets, no pending jobs.
3093 EXPECT_EQ(0, pool_->IdleSocketCount());
Raul Tambre8335a6d2019-02-21 16:57:433094 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263095
3096 // Create a second socket to the same host, but this one will wait.
3097 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3098 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503099 EXPECT_EQ(
3100 ERR_IO_PENDING,
3101 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3102 ClientSocketPool::RespectLimits::ENABLED,
3103 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3104 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263105 // No idle sockets, and one connecting job.
3106 EXPECT_EQ(0, pool_->IdleSocketCount());
Raul Tambre8335a6d2019-02-21 16:57:433107 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263108
3109 // Return the first handle to the pool. This will initiate the delayed
3110 // binding.
3111 handle1.Reset();
3112
fdoray5eeb7642016-06-22 16:11:283113 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263114
3115 // Still no idle sockets, still one pending connect job.
3116 EXPECT_EQ(0, pool_->IdleSocketCount());
Raul Tambre8335a6d2019-02-21 16:57:433117 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263118
3119 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013120 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263121
3122 // And we can see there is still one job waiting.
Raul Tambre8335a6d2019-02-21 16:57:433123 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263124
3125 // Finally, signal the waiting Connect.
3126 client_socket_factory_.SignalJobs();
Raul Tambre8335a6d2019-02-21 16:57:433127 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
[email protected]eb5a99382010-07-11 03:18:263128
fdoray5eeb7642016-06-22 16:11:283129 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263130}
3131
[email protected]2abfe90a2010-08-25 17:49:513132// Cover the case where on an available socket slot, we have one pending
3133// request that completes synchronously, thereby making the Group empty.
3134TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3135 const int kUnlimitedSockets = 100;
3136 const int kOneSocketPerGroup = 1;
3137 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3138
3139 // Make the first request asynchronous fail.
3140 // This will free up a socket slot later.
3141 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3142
3143 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523144 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203145 EXPECT_EQ(
3146 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543147 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203148 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503149 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3150 pool_.get(), NetLogWithSource()));
Raul Tambre8335a6d2019-02-21 16:57:433151 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]2abfe90a2010-08-25 17:49:513152
3153 // Make the second request synchronously fail. This should make the Group
3154 // empty.
3155 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3156 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523157 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513158 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3159 // when created.
tfarina428341112016-09-22 13:38:203160 EXPECT_EQ(
3161 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543162 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203163 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503164 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3165 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513166
Raul Tambre8335a6d2019-02-21 16:57:433167 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]2abfe90a2010-08-25 17:49:513168
robpercival214763f2016-07-01 23:27:013169 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3170 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:513171 EXPECT_FALSE(pool_->HasGroup("a"));
3172}
3173
[email protected]e1b54dc2010-10-06 21:27:223174TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3175 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3176
3177 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3178
3179 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523180 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203181 EXPECT_EQ(
3182 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543183 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203184 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503185 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3186 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223187
3188 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523189 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203190 EXPECT_EQ(
3191 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543192 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203193 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503194 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3195 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223196 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523197 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203198 EXPECT_EQ(
3199 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543200 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203201 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503202 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3203 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223204
robpercival214763f2016-07-01 23:27:013205 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3206 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3207 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223208
3209 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:593210 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383211 TRAFFIC_ANNOTATION_FOR_TESTS));
Bence Békybdbb0e72018-08-07 21:42:593212 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383213 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223214
3215 handle1.Reset();
3216 handle2.Reset();
3217 handle3.Reset();
3218
Matt Menke28ac03e2019-02-25 22:25:503219 EXPECT_EQ(OK, handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3220 ClientSocketPool::RespectLimits::ENABLED,
3221 callback1.callback(),
3222 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
3223 NetLogWithSource()));
3224 EXPECT_EQ(OK, handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3225 ClientSocketPool::RespectLimits::ENABLED,
3226 callback2.callback(),
3227 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
3228 NetLogWithSource()));
3229 EXPECT_EQ(OK, handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3230 ClientSocketPool::RespectLimits::ENABLED,
3231 callback3.callback(),
3232 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
3233 NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223234
3235 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3236 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3237 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3238}
3239
[email protected]2c2bef152010-10-13 00:55:033240TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3241 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3242 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3243
Charlie Harrison55ce6082018-05-14 02:25:573244 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033245
3246 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433247 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("a"));
3248 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3249 EXPECT_EQ(2u, pool_->NumUnassignedConnectJobsInGroup("a"));
3250 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033251
3252 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523253 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203254 EXPECT_EQ(
3255 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543256 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203257 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503258 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3259 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033260
3261 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523262 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203263 EXPECT_EQ(
3264 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543265 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203266 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503267 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3268 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033269
Raul Tambre8335a6d2019-02-21 16:57:433270 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("a"));
3271 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3272 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3273 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033274
robpercival214763f2016-07-01 23:27:013275 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3276 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033277 handle1.Reset();
3278 handle2.Reset();
3279
Raul Tambre8335a6d2019-02-21 16:57:433280 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3281 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3282 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3283 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033284}
3285
3286TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3287 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3288 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3289
3290 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523291 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203292 EXPECT_EQ(
3293 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543294 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203295 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503296 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3297 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033298
3299 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433300 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3301 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3302 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3303 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033304
Charlie Harrison55ce6082018-05-14 02:25:573305 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033306
Raul Tambre8335a6d2019-02-21 16:57:433307 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("a"));
3308 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3309 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
3310 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033311
3312 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523313 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203314 EXPECT_EQ(
3315 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543316 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203317 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503318 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3319 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033320
Raul Tambre8335a6d2019-02-21 16:57:433321 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("a"));
3322 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3323 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3324 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033325
robpercival214763f2016-07-01 23:27:013326 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3327 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033328 handle1.Reset();
3329 handle2.Reset();
3330
Raul Tambre8335a6d2019-02-21 16:57:433331 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3332 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3333 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3334 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033335}
3336
3337TEST_F(ClientSocketPoolBaseTest,
3338 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3339 CreatePool(4, 4);
3340 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3341
3342 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523343 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203344 EXPECT_EQ(
3345 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543346 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203347 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503348 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3349 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033350
3351 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523352 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203353 EXPECT_EQ(
3354 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543355 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203356 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503357 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3358 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033359
3360 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523361 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203362 EXPECT_EQ(
3363 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543364 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203365 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503366 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3367 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033368
3369 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433370 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup("a"));
3371 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3372 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3373 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033374
Charlie Harrison55ce6082018-05-14 02:25:573375 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033376
Raul Tambre8335a6d2019-02-21 16:57:433377 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup("a"));
3378 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3379 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3380 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033381
robpercival214763f2016-07-01 23:27:013382 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3383 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3384 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033385 handle1.Reset();
3386 handle2.Reset();
3387 handle3.Reset();
3388
Raul Tambre8335a6d2019-02-21 16:57:433389 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3390 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3391 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3392 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033393}
3394
3395TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3396 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3397 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3398
3399 ASSERT_FALSE(pool_->HasGroup("a"));
3400
Charlie Harrison55ce6082018-05-14 02:25:573401 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033402
3403 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433404 EXPECT_EQ(kDefaultMaxSockets,
3405 static_cast<int>(pool_->NumConnectJobsInGroup("a")));
3406 EXPECT_EQ(kDefaultMaxSockets,
3407 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroup("a")));
3408 EXPECT_EQ(kDefaultMaxSockets,
3409 static_cast<int>(pool_->NumUnassignedConnectJobsInGroup("a")));
[email protected]2c2bef152010-10-13 00:55:033410
3411 ASSERT_FALSE(pool_->HasGroup("b"));
3412
Charlie Harrison55ce6082018-05-14 02:25:573413 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033414
3415 ASSERT_FALSE(pool_->HasGroup("b"));
3416}
3417
3418TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3419 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3420 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3421
3422 ASSERT_FALSE(pool_->HasGroup("a"));
3423
3424 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573425 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033426
3427 ASSERT_TRUE(pool_->HasGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103428 EXPECT_EQ(kDefaultMaxSockets - 1,
Raul Tambre8335a6d2019-02-21 16:57:433429 static_cast<int>(pool_->NumConnectJobsInGroup("a")));
Lily Chenecebf932018-11-02 17:15:433430 EXPECT_EQ(kDefaultMaxSockets - 1,
Raul Tambre8335a6d2019-02-21 16:57:433431 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroup("a")));
3432 EXPECT_EQ(kDefaultMaxSockets - 1,
3433 static_cast<int>(pool_->NumUnassignedConnectJobsInGroup("a")));
[email protected]51fdc7c2012-04-10 19:19:483434 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033435
3436 ASSERT_FALSE(pool_->HasGroup("b"));
3437
Charlie Harrison55ce6082018-05-14 02:25:573438 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033439
3440 ASSERT_TRUE(pool_->HasGroup("b"));
Raul Tambre8335a6d2019-02-21 16:57:433441 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483442 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033443}
3444
3445TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3446 CreatePool(4, 4);
3447 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3448
3449 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523450 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203451 EXPECT_EQ(
3452 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543453 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203454 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503455 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3456 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013457 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033458 handle1.Reset();
3459
3460 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433461 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3462 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3463 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3464 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033465
Charlie Harrison55ce6082018-05-14 02:25:573466 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033467
Raul Tambre8335a6d2019-02-21 16:57:433468 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3469 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3470 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
3471 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033472}
3473
3474TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3475 CreatePool(4, 4);
3476 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3477
3478 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523479 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203480 EXPECT_EQ(
3481 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543482 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203483 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503484 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3485 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013486 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033487
3488 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433489 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3490 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3491 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3492 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033493 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3494
Charlie Harrison55ce6082018-05-14 02:25:573495 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033496
Raul Tambre8335a6d2019-02-21 16:57:433497 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3498 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3499 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
3500 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033501 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3502}
3503
3504TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3505 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3506 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3507
3508 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573509 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033510
3511 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433512 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3513 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3514 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3515 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
3516 static_cast<int>(pool_->IdleSocketCountInGroup("a")));
[email protected]2c2bef152010-10-13 00:55:033517
3518 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573519 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033520
Raul Tambre8335a6d2019-02-21 16:57:433521 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("b"));
3522 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("b"));
3523 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("b"));
3524 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
3525 static_cast<int>(pool_->IdleSocketCountInGroup("b")));
[email protected]2c2bef152010-10-13 00:55:033526}
3527
[email protected]3c819f522010-12-02 02:03:123528TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3529 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3530 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3531
3532 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573533 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123534
3535 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523536
3537 connect_job_factory_->set_job_type(
3538 TestConnectJob::kMockAdditionalErrorStateJob);
3539 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573540 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523541
3542 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123543}
3544
[email protected]8159a1c2012-06-07 00:00:103545TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033546 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433547 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033548
Charlie Harrison55ce6082018-05-14 02:25:573549 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033550
3551 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433552 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("a"));
3553 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3554 EXPECT_EQ(2u, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433555 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433556 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033557
Charlie Harrison55ce6082018-05-14 02:25:573558 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
Raul Tambre8335a6d2019-02-21 16:57:433559 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("a"));
3560 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3561 EXPECT_EQ(2u, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433562 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433563 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033564
3565 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523566 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203567 EXPECT_EQ(
3568 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543569 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203570 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503571 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3572 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433573
3574 client_socket_factory_.SignalJob(0);
3575 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3576
Raul Tambre8335a6d2019-02-21 16:57:433577 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3578 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3579 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433580 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433581 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033582
3583 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523584 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433585 EXPECT_EQ(
3586 ERR_IO_PENDING,
3587 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3588 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503589 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3590 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433591 client_socket_factory_.SignalJob(0);
3592 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033593
Raul Tambre8335a6d2019-02-21 16:57:433594 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3595 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3596 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103597 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433598 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103599
[email protected]2c2bef152010-10-13 00:55:033600 handle1.Reset();
3601 handle2.Reset();
3602
Raul Tambre8335a6d2019-02-21 16:57:433603 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3604 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3605 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433606 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433607 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033608
Charlie Harrison55ce6082018-05-14 02:25:573609 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
Raul Tambre8335a6d2019-02-21 16:57:433610 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3611 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3612 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433613 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433614 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033615}
3616
3617TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3618 CreatePool(4, 4);
3619 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3620
Charlie Harrison55ce6082018-05-14 02:25:573621 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033622
3623 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433624 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3625 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3626 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
3627 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033628
Charlie Harrison55ce6082018-05-14 02:25:573629 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
Raul Tambre8335a6d2019-02-21 16:57:433630 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("a"));
3631 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3632 EXPECT_EQ(2u, pool_->NumUnassignedConnectJobsInGroup("a"));
3633 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033634
Charlie Harrison55ce6082018-05-14 02:25:573635 pool_->RequestSockets("a", &params_, 3, NetLogWithSource());
Raul Tambre8335a6d2019-02-21 16:57:433636 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup("a"));
3637 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3638 EXPECT_EQ(3u, pool_->NumUnassignedConnectJobsInGroup("a"));
3639 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033640
Charlie Harrison55ce6082018-05-14 02:25:573641 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
Raul Tambre8335a6d2019-02-21 16:57:433642 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup("a"));
3643 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3644 EXPECT_EQ(3u, pool_->NumUnassignedConnectJobsInGroup("a"));
3645 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033646}
3647
3648TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3649 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433650 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033651
Charlie Harrison55ce6082018-05-14 02:25:573652 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033653
3654 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433655 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3656 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3657 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
3658 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033659
3660 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523661 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203662 EXPECT_EQ(
3663 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543664 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203665 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503666 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3667 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033668
Raul Tambre8335a6d2019-02-21 16:57:433669 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3670 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3671 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3672 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033673
Lily Chenecebf932018-11-02 17:15:433674 client_socket_factory_.SignalJobs();
3675 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3676
Raul Tambre8335a6d2019-02-21 16:57:433677 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3678 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3679 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3680 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433681 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033682
[email protected]0dc88b32014-03-26 20:12:283683 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483684 // starts, it has a connect start time.
3685 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033686 handle1.Reset();
3687
Raul Tambre8335a6d2019-02-21 16:57:433688 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033689}
3690
[email protected]034df0f32013-01-07 23:17:483691// Checks that fully connected preconnect jobs have no connect times, and are
3692// marked as reused.
3693TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3694 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3695 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Charlie Harrison55ce6082018-05-14 02:25:573696 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483697
3698 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433699 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3700 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3701 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3702 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup("a"));
[email protected]034df0f32013-01-07 23:17:483703
3704 ClientSocketHandle handle;
3705 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503706 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3707 ClientSocketPool::RespectLimits::ENABLED,
3708 callback.callback(),
3709 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
3710 NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483711
3712 // Make sure the idle socket was used.
Raul Tambre8335a6d2019-02-21 16:57:433713 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]034df0f32013-01-07 23:17:483714
3715 TestLoadTimingInfoConnectedReused(handle);
3716 handle.Reset();
3717 TestLoadTimingInfoNotConnected(handle);
3718}
3719
[email protected]dcbe168a2010-12-02 03:14:463720// http://crbug.com/64940 regression test.
3721TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3722 const int kMaxTotalSockets = 3;
3723 const int kMaxSocketsPerGroup = 2;
3724 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433725 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:463726
3727 // Note that group name ordering matters here. "a" comes before "b", so
3728 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3729
3730 // Set up one idle socket in "a".
3731 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523732 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203733 EXPECT_EQ(
3734 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543735 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203736 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503737 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3738 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433739 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433740 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3741 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3742 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3743 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463744
Lily Chenecebf932018-11-02 17:15:433745 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013746 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Raul Tambre8335a6d2019-02-21 16:57:433747 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3748 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3749 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433750 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3751
[email protected]dcbe168a2010-12-02 03:14:463752 handle1.Reset();
Raul Tambre8335a6d2019-02-21 16:57:433753 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463754
3755 // Set up two active sockets in "b".
3756 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523757 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203758 EXPECT_EQ(
3759 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543760 handle1.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203761 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503762 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3763 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:203764 EXPECT_EQ(
3765 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543766 handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203767 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503768 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3769 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463770
Lily Chenecebf932018-11-02 17:15:433771 ASSERT_TRUE(pool_->HasGroup("b"));
Raul Tambre8335a6d2019-02-21 16:57:433772 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("b"));
3773 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("b"));
3774 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("b"));
3775 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433776
3777 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013778 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3779 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Raul Tambre8335a6d2019-02-21 16:57:433780 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("b"));
3781 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("b"));
3782 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463783 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3784
3785 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3786 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3787 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3788 // sockets for "a", and "b" should still have 2 active sockets.
3789
Charlie Harrison55ce6082018-05-14 02:25:573790 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
Raul Tambre8335a6d2019-02-21 16:57:433791 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3792 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3793 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3794 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463795 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433796 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("b"));
3797 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("b"));
3798 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("b"));
3799 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463800 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3801
3802 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3803 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3804 // "a" should result in closing 1 for "b".
3805 handle1.Reset();
3806 handle2.Reset();
Raul Tambre8335a6d2019-02-21 16:57:433807 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463808 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3809
Charlie Harrison55ce6082018-05-14 02:25:573810 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
Raul Tambre8335a6d2019-02-21 16:57:433811 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3812 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3813 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
3814 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463815 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433816 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("b"));
3817 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("b"));
3818 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("b"));
3819 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463820 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3821}
3822
[email protected]b7b8be42011-07-12 12:46:413823TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073824 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3825 pool_->EnableConnectBackupJobs();
3826
3827 // Make the ConnectJob hang until it times out, shorten the timeout.
3828 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3829 connect_job_factory_->set_timeout_duration(
3830 base::TimeDelta::FromMilliseconds(500));
Charlie Harrison55ce6082018-05-14 02:25:573831 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
Raul Tambre8335a6d2019-02-21 16:57:433832 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3833 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3834 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
3835 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073836
[email protected]b7b8be42011-07-12 12:46:413837 // Verify the backup timer doesn't create a backup job, by making
3838 // the backup job a pending job instead of a waiting job, so it
3839 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073840 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453841 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443842 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343843 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283844 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073845 EXPECT_FALSE(pool_->HasGroup("a"));
3846}
3847
[email protected]b7b8be42011-07-12 12:46:413848TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073849 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3850 pool_->EnableConnectBackupJobs();
3851
3852 // Make the ConnectJob hang forever.
3853 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Charlie Harrison55ce6082018-05-14 02:25:573854 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
Raul Tambre8335a6d2019-02-21 16:57:433855 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3856 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3857 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
3858 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283859 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073860
3861 // Make the backup job be a pending job, so it completes normally.
3862 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3863 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523864 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503865 EXPECT_EQ(
3866 ERR_IO_PENDING,
3867 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3868 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
3869 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
3870 NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413871 // Timer has started, but the backup connect job shouldn't be created yet.
Raul Tambre8335a6d2019-02-21 16:57:433872 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3873 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3874 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3875 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073876 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013877 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073878
3879 // The hung connect job should still be there, but everything else should be
3880 // complete.
Raul Tambre8335a6d2019-02-21 16:57:433881 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3882 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3883 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
3884 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073885 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3886}
3887
[email protected]0dc88b32014-03-26 20:12:283888// Tests that a preconnect that starts out with unread data can still be used.
3889// http://crbug.com/334467
3890TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3891 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3892 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3893
Charlie Harrison55ce6082018-05-14 02:25:573894 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283895
3896 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433897 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3898 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3899 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3900 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283901
3902 // Fail future jobs to be sure that handle receives the preconnected socket
3903 // rather than closing it and making a new one.
3904 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3905 ClientSocketHandle handle;
3906 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503907 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3908 ClientSocketPool::RespectLimits::ENABLED,
3909 callback.callback(),
3910 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
3911 NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283912
3913 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433914 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
3915 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3916 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3917 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433918 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283919
3920 // Drain the pending read.
Bence Békybdbb0e72018-08-07 21:42:593921 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:283922
3923 TestLoadTimingInfoConnectedReused(handle);
3924 handle.Reset();
3925
3926 // The socket should be usable now that it's idle again.
Raul Tambre8335a6d2019-02-21 16:57:433927 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283928}
3929
Lily Chenecebf932018-11-02 17:15:433930TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
3931 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3932 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3933
3934 ClientSocketHandle handle1;
3935 TestCompletionCallback callback1;
3936 EXPECT_EQ(
3937 ERR_IO_PENDING,
3938 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3939 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503940 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3941 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433942
Raul Tambre8335a6d2019-02-21 16:57:433943 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3944 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3945 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3946 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433947
3948 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3949}
3950
3951TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
3952 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3953 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3954
3955 ClientSocketHandle handle1;
3956 TestCompletionCallback callback1;
3957 EXPECT_EQ(
3958 ERR_IO_PENDING,
3959 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3960 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503961 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3962 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433963
Raul Tambre8335a6d2019-02-21 16:57:433964 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3965 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3966 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3967 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433968
3969 ClientSocketHandle handle2;
3970 TestCompletionCallback callback2;
3971 EXPECT_EQ(
3972 ERR_IO_PENDING,
3973 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3974 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503975 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3976 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433977
Raul Tambre8335a6d2019-02-21 16:57:433978 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("a"));
3979 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3980 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
3981 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433982
3983 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3984 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3985
3986 // One job completes. The other request should still have its job.
3987 client_socket_factory_.SignalJob(0);
3988 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3989
Raul Tambre8335a6d2019-02-21 16:57:433990 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
3991 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3992 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433993 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:433994 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433995
3996 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3997}
3998
3999TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4000 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4001 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4002
4003 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
4004
4005 ASSERT_TRUE(pool_->HasGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:434006 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4007 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4008 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup("a"));
4009 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434010
4011 ClientSocketHandle handle1;
4012 TestCompletionCallback callback1;
4013 EXPECT_EQ(
4014 ERR_IO_PENDING,
4015 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4016 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504017 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4018 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434019
Raul Tambre8335a6d2019-02-21 16:57:434020 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4021 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4022 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4023 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434024
4025 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4026}
4027
4028TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4029 CreatePool(kDefaultMaxSockets, 1);
4030 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4031
4032 ClientSocketHandle handle1;
4033 TestCompletionCallback callback1;
4034 EXPECT_EQ(
4035 ERR_IO_PENDING,
4036 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4037 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504038 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4039 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434040
Raul Tambre8335a6d2019-02-21 16:57:434041 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4042 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4043 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4044 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434045
4046 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4047
4048 // Insert a higher priority request
4049 ClientSocketHandle handle2;
4050 TestCompletionCallback callback2;
4051 EXPECT_EQ(
4052 ERR_IO_PENDING,
4053 handle2.Init("a", params_, HIGHEST, SocketTag(),
4054 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504055 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4056 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434057
Raul Tambre8335a6d2019-02-21 16:57:434058 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4059 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4060 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4061 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434062
4063 // The highest priority request should steal the job from the default priority
4064 // request.
4065 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4066 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4067}
4068
4069TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4070 CreatePool(3, 3);
4071 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4072
4073 ClientSocketHandle handle_lowest;
4074 TestCompletionCallback callback_lowest;
4075 EXPECT_EQ(ERR_IO_PENDING,
4076 handle_lowest.Init("a", params_, LOWEST, SocketTag(),
4077 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504078 callback_lowest.callback(),
4079 ClientSocketPool::ProxyAuthCallback(),
4080 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434081
Raul Tambre8335a6d2019-02-21 16:57:434082 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4083 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4084 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4085 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434086
4087 ClientSocketHandle handle_highest;
4088 TestCompletionCallback callback_highest;
4089 EXPECT_EQ(ERR_IO_PENDING,
4090 handle_highest.Init("a", params_, HIGHEST, SocketTag(),
4091 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504092 callback_highest.callback(),
4093 ClientSocketPool::ProxyAuthCallback(),
4094 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434095
Raul Tambre8335a6d2019-02-21 16:57:434096 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("a"));
4097 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4098 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4099 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434100
4101 ClientSocketHandle handle_low;
4102 TestCompletionCallback callback_low;
4103 EXPECT_EQ(ERR_IO_PENDING,
4104 handle_low.Init("a", params_, LOW, SocketTag(),
4105 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504106 callback_low.callback(),
4107 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
Lily Chenecebf932018-11-02 17:15:434108 NetLogWithSource()));
4109
Raul Tambre8335a6d2019-02-21 16:57:434110 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup("a"));
4111 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4112 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4113 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434114
4115 ClientSocketHandle handle_lowest2;
4116 TestCompletionCallback callback_lowest2;
4117 EXPECT_EQ(ERR_IO_PENDING,
4118 handle_lowest2.Init("a", params_, LOWEST, SocketTag(),
4119 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504120 callback_lowest2.callback(),
4121 ClientSocketPool::ProxyAuthCallback(),
4122 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434123
Raul Tambre8335a6d2019-02-21 16:57:434124 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup("a"));
4125 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4126 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4127 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434128
4129 // The top three requests in the queue should have jobs.
4130 EXPECT_TRUE(
4131 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_highest));
4132 EXPECT_TRUE(
4133 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_low));
4134 EXPECT_TRUE(
4135 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest));
4136 EXPECT_FALSE(
4137 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest2));
4138
4139 // Add another request with medium priority. It should steal the job from the
4140 // lowest priority request with a job.
4141 ClientSocketHandle handle_medium;
4142 TestCompletionCallback callback_medium;
4143 EXPECT_EQ(ERR_IO_PENDING,
4144 handle_medium.Init("a", params_, MEDIUM, SocketTag(),
4145 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504146 callback_medium.callback(),
4147 ClientSocketPool::ProxyAuthCallback(),
4148 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434149
Raul Tambre8335a6d2019-02-21 16:57:434150 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup("a"));
4151 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4152 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4153 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434154 EXPECT_TRUE(
4155 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_highest));
4156 EXPECT_TRUE(
4157 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_medium));
4158 EXPECT_TRUE(
4159 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_low));
4160 EXPECT_FALSE(
4161 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest));
4162 EXPECT_FALSE(
4163 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest2));
4164}
4165
4166TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4167 CreatePool(kDefaultMaxSockets, 1);
4168 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4169
4170 ClientSocketHandle handle1;
4171 TestCompletionCallback callback1;
4172 EXPECT_EQ(
4173 ERR_IO_PENDING,
4174 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4175 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504176 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4177 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434178
Raul Tambre8335a6d2019-02-21 16:57:434179 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4180 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4181 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4182 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434183
4184 ClientSocketHandle handle2;
4185 TestCompletionCallback callback2;
4186 EXPECT_EQ(
4187 ERR_IO_PENDING,
4188 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4189 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504190 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4191 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434192
Raul Tambre8335a6d2019-02-21 16:57:434193 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4194 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4195 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4196 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434197
4198 // The second request doesn't get a job because we are at the limit.
4199 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4200 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4201
4202 // Reprioritizing the second request places it above the first, and it steals
4203 // the job from the first request.
4204 pool_->SetPriority("a", &handle2, HIGHEST);
4205 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4206 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4207}
4208
4209TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4210 CreatePool(kDefaultMaxSockets, 1);
4211 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4212
4213 ClientSocketHandle handle1;
4214 TestCompletionCallback callback1;
4215 EXPECT_EQ(
4216 ERR_IO_PENDING,
4217 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4218 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504219 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4220 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434221
Raul Tambre8335a6d2019-02-21 16:57:434222 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4223 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4224 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4225 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434226
4227 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4228
4229 ClientSocketHandle handle2;
4230 TestCompletionCallback callback2;
4231 EXPECT_EQ(
4232 ERR_IO_PENDING,
4233 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4234 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504235 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4236 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434237
Raul Tambre8335a6d2019-02-21 16:57:434238 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4239 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4240 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4241 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434242
4243 // The second request doesn't get a job because we are the limit.
4244 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4245 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4246
4247 // The second request should get a job upon cancelling the first request.
4248 handle1.Reset();
Raul Tambre8335a6d2019-02-21 16:57:434249 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4250 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4251 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4252 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434253
4254 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4255}
4256
4257TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4258 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4259 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4260
4261 ClientSocketHandle handle1;
4262 TestCompletionCallback callback1;
4263 EXPECT_EQ(
4264 ERR_IO_PENDING,
4265 handle1.Init("a", params_, HIGHEST, SocketTag(),
4266 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504267 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4268 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434269
Raul Tambre8335a6d2019-02-21 16:57:434270 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4271 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4272 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4273 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434274
4275 ClientSocketHandle handle2;
4276 TestCompletionCallback callback2;
4277 EXPECT_EQ(
4278 ERR_IO_PENDING,
4279 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4280 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504281 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4282 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434283
Raul Tambre8335a6d2019-02-21 16:57:434284 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup("a"));
4285 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4286 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
4287 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434288
4289 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4290 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4291
4292 // The lower-priority job completes first. The higher-priority request should
4293 // get the socket, and the lower-priority request should get the remaining
4294 // job.
4295 client_socket_factory_.SignalJob(1);
4296 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Raul Tambre8335a6d2019-02-21 16:57:434297 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
4298 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4299 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434300 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
Raul Tambre8335a6d2019-02-21 16:57:434301 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:434302 EXPECT_TRUE(handle1.socket());
4303 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4304}
4305
[email protected]043b68c82013-08-22 23:41:524306class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204307 public:
4308 MockLayeredPool(TestClientSocketPool* pool,
4309 const std::string& group_name)
4310 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:204311 group_name_(group_name),
4312 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524313 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204314 }
4315
Daniel Cheng4496d0822018-04-26 21:52:154316 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204317
4318 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:154319 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Matt Menke28ac03e2019-02-25 22:25:504320 return handle_.Init(
4321 group_name_, params, DEFAULT_PRIORITY, SocketTag(),
4322 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4323 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204324 }
4325
4326 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:154327 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Matt Menke28ac03e2019-02-25 22:25:504328 return handle_.Init(
4329 group_name_, params, MAXIMUM_PRIORITY, SocketTag(),
4330 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4331 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204332 }
4333
4334 bool ReleaseOneConnection() {
4335 if (!handle_.is_initialized() || !can_release_connection_) {
4336 return false;
4337 }
4338 handle_.socket()->Disconnect();
4339 handle_.Reset();
4340 return true;
4341 }
4342
4343 void set_can_release_connection(bool can_release_connection) {
4344 can_release_connection_ = can_release_connection;
4345 }
4346
4347 MOCK_METHOD0(CloseOneIdleConnection, bool());
4348
4349 private:
4350 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204351 ClientSocketHandle handle_;
4352 TestCompletionCallback callback_;
4353 const std::string group_name_;
4354 bool can_release_connection_;
4355};
4356
4357TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
4358 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4359 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4360
4361 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014362 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204363 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4364 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:524365 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:204366}
4367
4368TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
4369 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4370 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4371
4372 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014373 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204374 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4375 .WillOnce(Invoke(&mock_layered_pool,
4376 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:524377 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:204378}
4379
4380// Tests the basic case of closing an idle socket in a higher layered pool when
4381// a new request is issued and the lower layer pool is stalled.
4382TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4383 CreatePool(1, 1);
4384 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4385
4386 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014387 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204388 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4389 .WillOnce(Invoke(&mock_layered_pool,
4390 &MockLayeredPool::ReleaseOneConnection));
4391 ClientSocketHandle handle;
4392 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504393 EXPECT_EQ(
4394 ERR_IO_PENDING,
4395 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4396 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4397 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4398 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014399 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204400}
4401
4402// Same as above, but the idle socket is in the same group as the stalled
4403// socket, and closes the only other request in its group when closing requests
4404// in higher layered pools. This generally shouldn't happen, but it may be
4405// possible if a higher level pool issues a request and the request is
4406// subsequently cancelled. Even if it's not possible, best not to crash.
4407TEST_F(ClientSocketPoolBaseTest,
4408 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4409 CreatePool(2, 2);
4410 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4411
4412 // Need a socket in another group for the pool to be stalled (If a group
4413 // has the maximum number of connections already, it's not stalled).
4414 ClientSocketHandle handle1;
4415 TestCompletionCallback callback1;
Matt Menke28ac03e2019-02-25 22:25:504416 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
4417 ClientSocketPool::RespectLimits::ENABLED,
4418 callback1.callback(),
4419 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4420 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204421
4422 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014423 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204424 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4425 .WillOnce(Invoke(&mock_layered_pool,
4426 &MockLayeredPool::ReleaseOneConnection));
4427 ClientSocketHandle handle;
4428 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:504429 EXPECT_EQ(
4430 ERR_IO_PENDING,
4431 handle.Init("group2", params_, DEFAULT_PRIORITY, SocketTag(),
4432 ClientSocketPool::RespectLimits::ENABLED,
4433 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4434 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014435 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204436}
4437
4438// Tests the case when an idle socket can be closed when a new request is
4439// issued, and the new request belongs to a group that was previously stalled.
4440TEST_F(ClientSocketPoolBaseTest,
4441 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4442 CreatePool(2, 2);
4443 std::list<TestConnectJob::JobType> job_types;
4444 job_types.push_back(TestConnectJob::kMockJob);
4445 job_types.push_back(TestConnectJob::kMockJob);
4446 job_types.push_back(TestConnectJob::kMockJob);
4447 job_types.push_back(TestConnectJob::kMockJob);
4448 connect_job_factory_->set_job_types(&job_types);
4449
4450 ClientSocketHandle handle1;
4451 TestCompletionCallback callback1;
Matt Menke28ac03e2019-02-25 22:25:504452 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
4453 ClientSocketPool::RespectLimits::ENABLED,
4454 callback1.callback(),
4455 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4456 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204457
4458 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014459 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204460 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4461 .WillRepeatedly(Invoke(&mock_layered_pool,
4462 &MockLayeredPool::ReleaseOneConnection));
4463 mock_layered_pool.set_can_release_connection(false);
4464
4465 // The third request is made when the socket pool is in a stalled state.
4466 ClientSocketHandle handle3;
4467 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204468 EXPECT_EQ(
4469 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544470 handle3.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204471 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504472 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4473 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204474
4475 base::RunLoop().RunUntilIdle();
4476 EXPECT_FALSE(callback3.have_result());
4477
4478 // The fourth request is made when the pool is no longer stalled. The third
4479 // request should be serviced first, since it was issued first and has the
4480 // same priority.
4481 mock_layered_pool.set_can_release_connection(true);
4482 ClientSocketHandle handle4;
4483 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204484 EXPECT_EQ(
4485 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544486 handle4.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204487 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504488 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4489 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014490 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204491 EXPECT_FALSE(callback4.have_result());
4492
4493 // Closing a handle should free up another socket slot.
4494 handle1.Reset();
robpercival214763f2016-07-01 23:27:014495 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204496}
4497
4498// Tests the case when an idle socket can be closed when a new request is
4499// issued, and the new request belongs to a group that was previously stalled.
4500//
4501// The two differences from the above test are that the stalled requests are not
4502// in the same group as the layered pool's request, and the the fourth request
4503// has a higher priority than the third one, so gets a socket first.
4504TEST_F(ClientSocketPoolBaseTest,
4505 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4506 CreatePool(2, 2);
4507 std::list<TestConnectJob::JobType> job_types;
4508 job_types.push_back(TestConnectJob::kMockJob);
4509 job_types.push_back(TestConnectJob::kMockJob);
4510 job_types.push_back(TestConnectJob::kMockJob);
4511 job_types.push_back(TestConnectJob::kMockJob);
4512 connect_job_factory_->set_job_types(&job_types);
4513
4514 ClientSocketHandle handle1;
4515 TestCompletionCallback callback1;
Matt Menke28ac03e2019-02-25 22:25:504516 EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
4517 ClientSocketPool::RespectLimits::ENABLED,
4518 callback1.callback(),
4519 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4520 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204521
4522 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014523 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204524 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4525 .WillRepeatedly(Invoke(&mock_layered_pool,
4526 &MockLayeredPool::ReleaseOneConnection));
4527 mock_layered_pool.set_can_release_connection(false);
4528
4529 // The third request is made when the socket pool is in a stalled state.
4530 ClientSocketHandle handle3;
4531 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204532 EXPECT_EQ(
4533 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544534 handle3.Init("group3", params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:204535 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504536 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4537 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204538
4539 base::RunLoop().RunUntilIdle();
4540 EXPECT_FALSE(callback3.have_result());
4541
4542 // The fourth request is made when the pool is no longer stalled. This
4543 // request has a higher priority than the third request, so is serviced first.
4544 mock_layered_pool.set_can_release_connection(true);
4545 ClientSocketHandle handle4;
4546 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204547 EXPECT_EQ(
4548 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544549 handle4.Init("group3", params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:204550 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504551 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4552 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014553 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204554 EXPECT_FALSE(callback3.have_result());
4555
4556 // Closing a handle should free up another socket slot.
4557 handle1.Reset();
robpercival214763f2016-07-01 23:27:014558 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204559}
4560
4561TEST_F(ClientSocketPoolBaseTest,
4562 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4563 CreatePool(1, 1);
4564 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4565
4566 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014567 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204568 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4569 .WillRepeatedly(Invoke(&mock_layered_pool1,
4570 &MockLayeredPool::ReleaseOneConnection));
4571 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:014572 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4573 IsOk());
[email protected]58e562f2013-04-22 17:32:204574 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4575 .WillRepeatedly(Invoke(&mock_layered_pool2,
4576 &MockLayeredPool::ReleaseOneConnection));
4577 ClientSocketHandle handle;
4578 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504579 EXPECT_EQ(
4580 ERR_IO_PENDING,
4581 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4582 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4583 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4584 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014585 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204586}
4587
[email protected]b021ece62013-06-11 11:06:334588// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154589// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4590// socket instead of a request with the same priority that was issued earlier,
4591// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334592TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334593 CreatePool(1, 1);
4594
4595 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154596 EXPECT_EQ(
4597 OK, StartRequestWithIgnoreLimits(
4598 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
Raul Tambre8335a6d2019-02-21 16:57:434599 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
[email protected]b021ece62013-06-11 11:06:334600
4601 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4602
mmenked3641e12016-01-28 16:06:154603 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4604 "a", MAXIMUM_PRIORITY,
4605 ClientSocketPool::RespectLimits::ENABLED));
Raul Tambre8335a6d2019-02-21 16:57:434606 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
[email protected]b021ece62013-06-11 11:06:334607
mmenked3641e12016-01-28 16:06:154608 // Issue a request that ignores the limits, so a new ConnectJob is
4609 // created.
4610 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4611 "a", MAXIMUM_PRIORITY,
4612 ClientSocketPool::RespectLimits::DISABLED));
Raul Tambre8335a6d2019-02-21 16:57:434613 ASSERT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]b021ece62013-06-11 11:06:334614
robpercival214763f2016-07-01 23:27:014615 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334616 EXPECT_FALSE(request(1)->have_result());
4617}
4618
[email protected]c55fabd2013-11-04 23:26:564619// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154620// issued for a request with RespectLimits::DISABLED is not cancelled when a
4621// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564622TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564623 CreatePool(1, 1);
4624
4625 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154626 EXPECT_EQ(
4627 OK, StartRequestWithIgnoreLimits(
4628 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
Raul Tambre8335a6d2019-02-21 16:57:434629 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
[email protected]c55fabd2013-11-04 23:26:564630
4631 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4632
mmenked3641e12016-01-28 16:06:154633 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4634 "a", MAXIMUM_PRIORITY,
4635 ClientSocketPool::RespectLimits::ENABLED));
Raul Tambre8335a6d2019-02-21 16:57:434636 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup("a"));
[email protected]c55fabd2013-11-04 23:26:564637
mmenked3641e12016-01-28 16:06:154638 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4639 // created.
4640 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4641 "a", MAXIMUM_PRIORITY,
4642 ClientSocketPool::RespectLimits::DISABLED));
Raul Tambre8335a6d2019-02-21 16:57:434643 ASSERT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]b021ece62013-06-11 11:06:334644
mmenked3641e12016-01-28 16:06:154645 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334646 // should not be cancelled.
4647 request(1)->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:434648 ASSERT_EQ(1u, pool_->NumConnectJobsInGroup("a"));
[email protected]b021ece62013-06-11 11:06:334649
robpercival214763f2016-07-01 23:27:014650 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334651 EXPECT_FALSE(request(1)->have_result());
4652}
4653
[email protected]f6d1d6eb2009-06-24 20:16:094654} // namespace
4655
4656} // namespace net