blob: 483fc82cd9693f983213ae15e8dcf0d2f5968e54 [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
Matt Menke9fa17d52019-03-25 19:12:265#include "net/socket/transport_client_socket_pool.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"
[email protected]2041cf342010-02-19 03:15:5912#include "base/callback.h"
danakjdb9ae7942020-11-11 16:01:3513#include "base/callback_helpers.h"
Hans Wennborg0924470b2020-04-27 21:08:0514#include "base/check_op.h"
skyostil4891b25b2015-06-11 11:43:4515#include "base/location.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"
Hans Wennborg0924470b2020-04-27 21:08:0518#include "base/notreached.h"
Matt Menkef09e64c2019-04-23 22:16:2819#include "base/optional.h"
[email protected]034df0f32013-01-07 23:17:4820#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4521#include "base/single_thread_task_runner.h"
Avi Drissman4365a4782018-12-28 19:26:2422#include "base/stl_util.h"
[email protected]fc9be5802013-06-11 10:56:5123#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1524#include "base/strings/stringprintf.h"
Matt Menke166443c2019-05-24 18:45:5925#include "base/test/scoped_feature_list.h"
[email protected]f214f8792011-01-01 02:17:0826#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3527#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0328#include "base/values.h"
Matt Menke166443c2019-05-24 18:45:5929#include "net/base/features.h"
[email protected]034df0f32013-01-07 23:17:4830#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5931#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0632#include "net/base/net_errors.h"
Matt Menke166443c2019-05-24 18:45:5933#include "net/base/network_isolation_key.h"
Matt Menkebdf777802019-04-22 19:38:5934#include "net/base/privacy_mode.h"
Matt Menkeaafff542019-04-22 22:09:3635#include "net/base/proxy_server.h"
[email protected]ac790b42009-12-02 04:31:3136#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0937#include "net/base/test_completion_callback.h"
dalykedd30d982019-12-16 15:31:1038#include "net/dns/public/resolve_error_info.h"
[email protected]277d5942010-08-11 21:02:3539#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5140#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0741#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0042#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1943#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0044#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5645#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4646#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0947#include "net/socket/client_socket_factory.h"
48#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2649#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2850#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5451#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1752#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4453#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1054#include "net/socket/stream_socket.h"
Matt Menke9fa17d52019-03-25 19:12:2655#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5156#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0157#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4058#include "net/test/test_with_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2859#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3860#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4861#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0962#include "testing/gtest/include/gtest/gtest.h"
63
robpercival214763f2016-07-01 23:27:0164using net::test::IsError;
65using net::test::IsOk;
66
[email protected]51fdc7c2012-04-10 19:19:4867using ::testing::Invoke;
68using ::testing::Return;
69
[email protected]f6d1d6eb2009-06-24 20:16:0970namespace net {
71
72namespace {
73
[email protected]211d21722009-07-22 15:48:5374const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2075const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5976constexpr base::TimeDelta kUnusedIdleSocketTimeout =
77 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0178
Matt Menkebdf777802019-04-22 19:38:5979ClientSocketPool::GroupId TestGroupId(
80 const std::string& host,
81 int port = 80,
82 ClientSocketPool::SocketType socket_type =
83 ClientSocketPool::SocketType::kHttp,
Matt Menke166443c2019-05-24 18:45:5984 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
85 NetworkIsolationKey network_isolation_key = NetworkIsolationKey()) {
dalyk5f48a132019-10-14 15:20:1986 bool disable_secure_dns = false;
Matt Menkec6b3edf72019-03-19 17:00:3987 return ClientSocketPool::GroupId(HostPortPair(host, port), socket_type,
dalyk5f48a132019-10-14 15:20:1988 privacy_mode, network_isolation_key,
89 disable_secure_dns);
Matt Menkec6b3edf72019-03-19 17:00:3990}
91
[email protected]034df0f32013-01-07 23:17:4892// Make sure |handle| sets load times correctly when it has been assigned a
93// reused socket.
94void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
95 LoadTimingInfo load_timing_info;
96 // Only pass true in as |is_reused|, as in general, HttpStream types should
97 // have stricter concepts of reuse than socket pools.
98 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
99
100 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19101 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48102
[email protected]b258e0792013-01-12 07:11:59103 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
104 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48105}
106
107// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33108// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48109// of a connection where |is_reused| is false may consider the connection
110// reused.
111void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
112 EXPECT_FALSE(handle.is_reused());
113
114 LoadTimingInfo load_timing_info;
115 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
116
117 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19118 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48119
[email protected]b258e0792013-01-12 07:11:59120 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
121 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
122 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48123
124 TestLoadTimingInfoConnectedReused(handle);
125}
126
127// Make sure |handle| sets load times correctly, in the case that it does not
128// currently have a socket.
129void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
130 // Should only be set to true once a socket is assigned, if at all.
131 EXPECT_FALSE(handle.is_reused());
132
133 LoadTimingInfo load_timing_info;
134 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
135
136 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19137 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48138
[email protected]b258e0792013-01-12 07:11:59139 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
140 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48141}
142
[email protected]3268023f2011-05-05 00:08:10143class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09144 public:
[email protected]034df0f32013-01-07 23:17:48145 explicit MockClientSocket(net::NetLog* net_log)
146 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28147 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20148 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30149 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09150
[email protected]0dc88b32014-03-26 20:12:28151 // Sets whether the socket has unread data. If true, the next call to Read()
152 // will return 1 byte and IsConnectedAndIdle() will return false.
153 void set_has_unread_data(bool has_unread_data) {
154 has_unread_data_ = has_unread_data;
155 }
156
[email protected]3f55aa12011-12-07 02:03:33157 // Socket implementation.
dchengb03027d2014-10-21 12:00:20158 int Read(IOBuffer* /* buf */,
159 int len,
Brad Lassey3a814172018-04-26 03:30:21160 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28161 if (has_unread_data_ && len > 0) {
162 has_unread_data_ = false;
163 was_used_to_convey_data_ = true;
164 return 1;
165 }
[email protected]e86df8dc2013-03-30 13:18:28166 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33167 }
[email protected]ab838892009-06-30 18:49:05168
[email protected]a2b2cfc2017-12-06 09:06:08169 int Write(
170 IOBuffer* /* buf */,
171 int len,
Brad Lassey3a814172018-04-26 03:30:21172 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08173 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01174 was_used_to_convey_data_ = true;
175 return len;
[email protected]ab838892009-06-30 18:49:05176 }
Avi Drissman13fc8932015-12-20 04:40:46177 int SetReceiveBufferSize(int32_t size) override { return OK; }
178 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05179
[email protected]dbf036f2011-12-06 23:33:24180 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21181 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24182 connected_ = true;
183 return OK;
184 }
[email protected]f6d1d6eb2009-06-24 20:16:09185
dchengb03027d2014-10-21 12:00:20186 void Disconnect() override { connected_ = false; }
187 bool IsConnected() const override { return connected_; }
188 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28189 return connected_ && !has_unread_data_;
190 }
[email protected]0b7648c2009-07-06 20:14:01191
dchengb03027d2014-10-21 12:00:20192 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16193 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09194 }
[email protected]f6d1d6eb2009-06-24 20:16:09195
dchengb03027d2014-10-21 12:00:20196 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35197 return ERR_UNEXPECTED;
198 }
199
tfarina428341112016-09-22 13:38:20200 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02201
dchengb03027d2014-10-21 12:00:20202 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37203 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20204 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
205 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03206 void GetConnectionAttempts(ConnectionAttempts* out) const override {
207 out->clear();
208 }
209 void ClearConnectionAttempts() override {}
210 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49211 int64_t GetTotalReceivedBytes() const override {
212 NOTIMPLEMENTED();
213 return 0;
214 }
Paul Jensen0f49dec2017-12-12 23:39:58215 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45216
[email protected]f6d1d6eb2009-06-24 20:16:09217 private:
218 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28219 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20220 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01221 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09222
[email protected]ab838892009-06-30 18:49:05223 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09224};
225
[email protected]5fc08e32009-07-15 17:09:57226class TestConnectJob;
227
[email protected]f6d1d6eb2009-06-24 20:16:09228class MockClientSocketFactory : public ClientSocketFactory {
229 public:
[email protected]ab838892009-06-30 18:49:05230 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09231
danakj655b66c2016-04-16 00:51:38232 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04233 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41234 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19235 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41236 NOTREACHED();
David Benjamin24725be2019-07-24 20:57:18237 return nullptr;
[email protected]98b0e582011-06-22 14:31:41238 }
239
Helen Lid5bb9222018-04-12 15:33:09240 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07241 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38242 std::unique_ptr<
243 SocketPerformanceWatcher> /* socket_performance_watcher */,
Eric Roman2bc77162020-09-16 18:30:45244 NetworkQualityEstimator* /* network_quality_estimator */,
[email protected]0a0b7682010-08-25 17:08:07245 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19246 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09247 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09248 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09249 }
250
danakj655b66c2016-04-16 00:51:38251 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
David Benjamin24725be2019-07-24 20:57:18252 SSLClientContext* context,
Matt Menke841fc412019-03-05 23:20:12253 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27254 const HostPortPair& host_and_port,
David Benjamin24725be2019-07-24 20:57:18255 const SSLConfig& ssl_config) override {
[email protected]f6d1d6eb2009-06-24 20:16:09256 NOTIMPLEMENTED();
David Benjamin24725be2019-07-24 20:57:18257 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09258 }
Matt Menkefd956922019-02-04 23:44:03259
Matt Menke52cd95a2019-02-08 06:16:27260 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
261 std::unique_ptr<StreamSocket> stream_socket,
262 const std::string& user_agent,
263 const HostPortPair& endpoint,
264 const ProxyServer& proxy_server,
265 HttpAuthController* http_auth_controller,
266 bool tunnel,
267 bool using_spdy,
268 NextProto negotiated_protocol,
269 ProxyDelegate* proxy_delegate,
Matt Menke52cd95a2019-02-08 06:16:27270 const NetworkTrafficAnnotationTag& traffic_annotation) override {
271 NOTIMPLEMENTED();
272 return nullptr;
273 }
274
[email protected]5fc08e32009-07-15 17:09:57275 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55276
[email protected]5fc08e32009-07-15 17:09:57277 void SignalJobs();
278
[email protected]03b7c8c2013-07-20 04:38:55279 void SignalJob(size_t job);
280
281 void SetJobLoadState(size_t job, LoadState load_state);
282
Matt Menke141b87f22019-01-30 02:43:03283 // Sets the HasConnectionEstablished value of the specified job to true,
284 // without invoking the callback.
285 void SetJobHasEstablishedConnection(size_t job);
286
[email protected]f6d1d6eb2009-06-24 20:16:09287 int allocation_count() const { return allocation_count_; }
288
[email protected]f6d1d6eb2009-06-24 20:16:09289 private:
290 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57291 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09292};
293
[email protected]ab838892009-06-30 18:49:05294class TestConnectJob : public ConnectJob {
295 public:
296 enum JobType {
297 kMockJob,
298 kMockFailingJob,
299 kMockPendingJob,
300 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57301 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10302
303 // Certificate errors return a socket in addition to an error code.
304 kMockCertErrorJob,
305 kMockPendingCertErrorJob,
306
[email protected]e60e47a2010-07-14 03:37:18307 kMockAdditionalErrorStateJob,
308 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28309 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10310
311 kMockAuthChallengeOnceJob,
312 kMockAuthChallengeTwiceJob,
313 kMockAuthChallengeOnceFailingJob,
314 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05315 };
316
[email protected]994d4932010-07-12 17:55:13317 // The kMockPendingJob uses a slight delay before allowing the connect
318 // to complete.
319 static const int kPendingConnectDelay = 2;
320
[email protected]ab838892009-06-30 18:49:05321 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40322 RequestPriority request_priority,
323 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34324 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43325 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05326 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43327 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40328 : ConnectJob(request_priority,
329 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38330 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43331 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38332 delegate,
333 nullptr /* net_log */,
334 NetLogSourceType::TRANSPORT_CONNECT_JOB,
335 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58336 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05337 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18338 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03339 has_established_connection_(false),
Jeremy Romand54000b22019-07-08 18:40:16340 store_additional_error_state_(false) {}
[email protected]ab838892009-06-30 18:49:05341
[email protected]974ebd62009-08-03 23:14:34342 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13343 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34344 }
345
[email protected]03b7c8c2013-07-20 04:38:55346 void set_load_state(LoadState load_state) { load_state_ = load_state; }
347
Matt Menke141b87f22019-01-30 02:43:03348 void set_has_established_connection() {
349 DCHECK(!has_established_connection_);
350 has_established_connection_ = true;
351 }
352
[email protected]03b7c8c2013-07-20 04:38:55353 // From ConnectJob:
354
dchengb03027d2014-10-21 12:00:20355 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21356
Matt Menke141b87f22019-01-30 02:43:03357 bool HasEstablishedConnection() const override {
358 return has_established_connection_;
359 }
360
dalykedd30d982019-12-16 15:31:10361 ResolveErrorInfo GetResolveErrorInfo() const override {
362 return ResolveErrorInfo(OK);
363 }
364
Matt Menke6f84d1f12019-04-11 19:26:47365 bool IsSSLError() const override { return store_additional_error_state_; }
366
367 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
368 if (store_additional_error_state_)
369 return base::MakeRefCounted<SSLCertRequestInfo>();
370 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18371 }
372
[email protected]974ebd62009-08-03 23:14:34373 private:
[email protected]03b7c8c2013-07-20 04:38:55374 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05375
dchengb03027d2014-10-21 12:00:20376 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05377 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35378 client_socket_factory_->CreateTransportClientSocket(
Eric Roman2bc77162020-09-16 18:30:45379 ignored, nullptr, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05380 switch (job_type_) {
381 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13382 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10383 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05384 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13385 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10386 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05387 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57388 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47389
390 // Depending on execution timings, posting a delayed task can result
391 // in the task getting executed the at the earliest possible
392 // opportunity or only after returning once from the message loop and
393 // then a second call into the message loop. In order to make behavior
394 // more deterministic, we change the default delay to 2ms. This should
395 // always require us to wait for the second call into the message loop.
396 //
397 // N.B. The correct fix for this and similar timing problems is to
398 // abstract time for the purpose of unittests. Unfortunately, we have
399 // a lot of third-party components that directly call the various
400 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45401 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05402 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49403 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
404 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10405 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53406 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05407 return ERR_IO_PENDING;
408 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57409 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45410 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05411 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49412 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
413 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10414 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53415 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05416 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57417 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55418 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57419 client_socket_factory_->WaitForSignal(this);
420 waiting_success_ = true;
421 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10422 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13423 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10424 true /* cert_error */);
425 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13426 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45427 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13428 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49429 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
430 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10431 true /* async */, true /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53432 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13433 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18434 case kMockAdditionalErrorStateJob:
435 store_additional_error_state_ = true;
436 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10437 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18438 case kMockPendingAdditionalErrorStateJob:
439 set_load_state(LOAD_STATE_CONNECTING);
440 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45441 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18442 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49443 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
444 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10445 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53446 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18447 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28448 case kMockUnreadDataJob: {
449 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10450 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28451 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
452 return ret;
453 }
Matt Menkeb57663b32019-03-01 17:17:10454 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01455 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10456 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
457 return ERR_IO_PENDING;
458 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01459 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10460 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
461 return ERR_IO_PENDING;
462 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01463 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10464 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
465 return ERR_IO_PENDING;
466 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01467 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10468 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
469 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05470 default:
471 NOTREACHED();
danakj655b66c2016-04-16 00:51:38472 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05473 return ERR_FAILED;
474 }
475 }
476
Lily Chen02ef29a2018-11-30 16:31:43477 void ChangePriorityInternal(RequestPriority priority) override {}
478
Matt Menkeb57663b32019-03-01 17:17:10479 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13480 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03481 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05482 if (succeed) {
Matt Menkeb57663b32019-03-01 17:17:10483 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
Bence Békybdbb0e72018-08-07 21:42:59484 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10485 } else if (cert_error) {
486 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
487 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40488 } else {
[email protected]e772db3f2010-07-12 18:11:13489 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38490 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05491 }
[email protected]2ab05b52009-07-01 23:57:58492
493 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30494 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05495 return result;
496 }
497
Matt Menkeb57663b32019-03-01 17:17:10498 void DoAdvanceAuthChallenge(int remaining_challenges,
499 bool succeed_after_last_challenge) {
500 base::ThreadTaskRunnerHandle::Get()->PostTask(
501 FROM_HERE,
502 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
503 weak_factory_.GetWeakPtr(), remaining_challenges,
504 succeed_after_last_challenge));
505 }
506
507 void InvokeNextProxyAuthCallback(int remaining_challenges,
508 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01509 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10510 if (remaining_challenges == 0) {
511 DoConnect(succeed_after_last_challenge, true /* was_async */,
512 false /* cert_error */);
513 return;
514 }
515
516 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
517 // The auth tests here are just focused on ConnectJob bookkeeping.
518 HttpResponseInfo info;
519 NotifyDelegateOfProxyAuth(
520 info, nullptr /* http_auth_controller */,
521 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
522 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
523 succeed_after_last_challenge));
524 }
525
[email protected]5fc08e32009-07-15 17:09:57526 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05527 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57528 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21529 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03530 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18531 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05532
Jeremy Romand54000b22019-07-08 18:40:16533 base::WeakPtrFactory<TestConnectJob> weak_factory_{this};
[email protected]d5492c52013-11-10 20:44:39534
[email protected]ab838892009-06-30 18:49:05535 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
536};
537
[email protected]d80a4322009-08-14 07:07:49538class TestConnectJobFactory
Matt Menke16f5c2e52019-03-25 21:50:40539 : public TransportClientSocketPool::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05540 public:
[email protected]034df0f32013-01-07 23:17:48541 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
542 NetLog* net_log)
Matt Menkea6f99ad2019-03-08 02:26:43543 : common_connect_job_params_(
544 nullptr /* client_socket_factory */,
545 nullptr /* host_resolver */,
Matt Menkeb88837e2019-03-20 11:50:40546 nullptr /* http_auth_cache */,
547 nullptr /* http_auth_handler_factory */,
548 nullptr /* spdy_session_pool */,
Matt Menkeb5fb42b2019-03-22 17:26:13549 nullptr /* quic_supported_versions */,
Matt Menkeb88837e2019-03-20 11:50:40550 nullptr /* quic_stream_factory */,
Matt Menkea6f99ad2019-03-08 02:26:43551 nullptr /* proxy_delegate */,
Matt Menked732ea42019-03-08 12:05:00552 nullptr /* http_user_agent_settings */,
David Benjamin24725be2019-07-24 20:57:18553 nullptr /* ssl_client_context */,
Matt Menkea6f99ad2019-03-08 02:26:43554 nullptr /* socket_performance_watcher_factory */,
555 nullptr /* network_quality_estimator */,
556 net_log,
557 nullptr /* websocket_endpoint_lock_manager */),
558 job_type_(TestConnectJob::kMockJob),
Raul Tambre94493c652019-03-11 17:18:35559 job_types_(nullptr),
Matt Menkea6f99ad2019-03-08 02:26:43560 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05561
Chris Watkins7a41d3552017-12-01 02:13:27562 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05563
564 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
565
[email protected]51fdc7c2012-04-10 19:19:48566 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
567 job_types_ = job_types;
568 CHECK(!job_types_->empty());
569 }
570
[email protected]974ebd62009-08-03 23:14:34571 void set_timeout_duration(base::TimeDelta timeout_duration) {
572 timeout_duration_ = timeout_duration;
573 }
574
[email protected]3f55aa12011-12-07 02:03:33575 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55576
danakj655b66c2016-04-16 00:51:38577 std::unique_ptr<ConnectJob> NewConnectJob(
Matt Menkeaafff542019-04-22 22:09:36578 ClientSocketPool::GroupId group_id,
579 scoped_refptr<ClientSocketPool::SocketParams> socket_params,
Matt Menkef09e64c2019-04-23 22:16:28580 const base::Optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Matt Menke16f5c2e52019-03-25 21:50:40581 RequestPriority request_priority,
582 SocketTag socket_tag,
mostynbba063d6032014-10-09 11:01:13583 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48584 EXPECT_TRUE(!job_types_ || !job_types_->empty());
585 TestConnectJob::JobType job_type = job_type_;
586 if (job_types_ && !job_types_->empty()) {
587 job_type = job_types_->front();
588 job_types_->pop_front();
589 }
Matt Menkea6f99ad2019-03-08 02:26:43590 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40591 job_type, request_priority, socket_tag, timeout_duration_,
592 &common_connect_job_params_, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05593 }
594
595 private:
Matt Menkea6f99ad2019-03-08 02:26:43596 const CommonConnectJobParams common_connect_job_params_;
[email protected]ab838892009-06-30 18:49:05597 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48598 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34599 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57600 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05601
602 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
603};
604
[email protected]a937a06d2009-08-19 21:19:24605} // namespace
606
[email protected]a937a06d2009-08-19 21:19:24607namespace {
608
[email protected]5fc08e32009-07-15 17:09:57609void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26610 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57611 (*it)->Signal();
612 }
613 waiting_jobs_.clear();
614}
615
[email protected]03b7c8c2013-07-20 04:38:55616void MockClientSocketFactory::SignalJob(size_t job) {
617 ASSERT_LT(job, waiting_jobs_.size());
618 waiting_jobs_[job]->Signal();
619 waiting_jobs_.erase(waiting_jobs_.begin() + job);
620}
621
622void MockClientSocketFactory::SetJobLoadState(size_t job,
623 LoadState load_state) {
624 ASSERT_LT(job, waiting_jobs_.size());
625 waiting_jobs_[job]->set_load_state(load_state);
626}
627
Matt Menke141b87f22019-01-30 02:43:03628void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
629 ASSERT_LT(job, waiting_jobs_.size());
630 waiting_jobs_[job]->set_has_established_connection();
631}
632
Gabriel Charette694c3c332019-08-19 14:53:05633class ClientSocketPoolBaseTest : public TestWithTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09634 protected:
Alex Clarke0def2092018-12-10 12:01:45635 ClientSocketPoolBaseTest()
Gabriel Charette694c3c332019-08-19 14:53:05636 : TestWithTaskEnvironment(
637 base::test::TaskEnvironment::TimeSource::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03638 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54639 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40640 TransportClientSocketPool::connect_backup_jobs_enabled();
641 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54642 }
[email protected]2431756e2010-09-29 20:26:13643
dcheng67be2b1f2014-10-27 21:47:29644 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40645 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54646 connect_backup_jobs_enabled_);
647 }
[email protected]c9d6a1d2009-07-14 16:15:20648
Matt Menke9fa17d52019-03-25 19:12:26649 void CreatePool(int max_sockets,
650 int max_sockets_per_group,
651 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59652 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
653 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26654 ClientSocketPool::used_idle_socket_timeout(),
655 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16656 }
657
David Benjaminbac8dff2019-08-07 01:30:41658 void CreatePoolWithIdleTimeouts(
659 int max_sockets,
660 int max_sockets_per_group,
661 base::TimeDelta unused_idle_socket_timeout,
662 base::TimeDelta used_idle_socket_timeout,
663 bool enable_backup_connect_jobs = false,
664 ProxyServer proxy_server = ProxyServer::Direct()) {
[email protected]c9d6a1d2009-07-14 16:15:20665 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26666 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
667 std::make_unique<TestConnectJobFactory>(&client_socket_factory_,
668 &net_log_);
669 connect_job_factory_ = connect_job_factory.get();
670 pool_ = TransportClientSocketPool::CreateForTesting(
671 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
David Benjaminbac8dff2019-08-07 01:30:41672 used_idle_socket_timeout, proxy_server, std::move(connect_job_factory),
Matt Menke9fa17d52019-03-25 19:12:26673 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20674 }
[email protected]f6d1d6eb2009-06-24 20:16:09675
mmenked3641e12016-01-28 16:06:15676 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39677 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33678 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15679 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39680 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15681 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33682 }
683
Matt Menkec6b3edf72019-03-19 17:00:39684 int StartRequest(const ClientSocketPool::GroupId& group_id,
685 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15686 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39687 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09688 }
689
[email protected]2431756e2010-09-29 20:26:13690 int GetOrderOfRequest(size_t index) const {
691 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09692 }
693
[email protected]2431756e2010-09-29 20:26:13694 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
695 return test_base_.ReleaseOneConnection(keep_alive);
696 }
697
698 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
699 test_base_.ReleaseAllConnections(keep_alive);
700 }
701
Matt Menke433de6d2020-03-04 00:24:11702 // Expects a single NetLogEventType::SOCKET_POOL_CLOSING_SOCKET in |net_log_|.
703 // It should be logged for the provided source and have the indicated reason.
704 void ExpectSocketClosedWithReason(NetLogSource expected_source,
705 const char* expected_reason) {
706 auto entries = net_log_.GetEntriesForSourceWithType(
707 expected_source, NetLogEventType::SOCKET_POOL_CLOSING_SOCKET,
708 NetLogEventPhase::NONE);
709 ASSERT_EQ(1u, entries.size());
710 ASSERT_TRUE(entries[0].HasParams());
711 ASSERT_TRUE(entries[0].params.is_dict());
712 const std::string* reason = entries[0].params.FindStringKey("reason");
713 ASSERT_TRUE(reason);
714 EXPECT_EQ(expected_reason, *reason);
715 }
716
[email protected]2431756e2010-09-29 20:26:13717 TestSocketRequest* request(int i) { return test_base_.request(i); }
718 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38719 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42720 return test_base_.requests();
721 }
rdsmith29dbad12017-02-17 02:22:18722 // Only counts the requests that get sockets asynchronously;
723 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13724 size_t completion_count() const { return test_base_.completion_count(); }
725
Matt Muellerd9342e3a2019-11-26 01:41:14726 RecordingTestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54727 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09728 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04729 TestConnectJobFactory* connect_job_factory_;
Matt Menke9fa17d52019-03-25 19:12:26730 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19731 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26732 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13733 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09734};
735
Shivani Sharma8ae506c2019-07-21 21:08:27736// TODO(950069): Add testing for frame_origin in NetworkIsolationKey
737// using kAppendInitiatingFrameOriginToNetworkIsolationKey.
738
[email protected]5fc08e32009-07-15 17:09:57739TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53740 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20741
[email protected]6ecf2b92011-12-15 01:14:52742 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06743 ClientSocketHandle handle;
Matt Muellerd9342e3a2019-11-26 01:41:14744 RecordingBoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48745 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53746
Matt Menkef09e64c2019-04-23 22:16:28747 EXPECT_EQ(OK, handle.Init(
748 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
749 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
750 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
751 pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09752 EXPECT_TRUE(handle.is_initialized());
753 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48754 TestLoadTimingInfoConnectedNotReused(handle);
755
[email protected]f6d1d6eb2009-06-24 20:16:09756 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48757 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30758
Eric Roman79cc7552019-07-19 02:17:54759 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40760
Matt Menke9fa17d52019-03-25 19:12:26761 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53762 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26763 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00764 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26765 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
766 EXPECT_TRUE(LogContainsEvent(
767 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
768 NetLogEventPhase::NONE));
769 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00770 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
771 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26772 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09773}
774
[email protected]ab838892009-06-30 18:49:05775TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53776 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20777
[email protected]ab838892009-06-30 18:49:05778 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Muellerd9342e3a2019-11-26 01:41:14779 RecordingBoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53780
[email protected]2431756e2010-09-29 20:26:13781 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52782 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18783 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13784 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51785 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50786 EXPECT_EQ(
787 ERR_CONNECTION_FAILED,
Matt Menkef09e64c2019-04-23 22:16:28788 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
789 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
790 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
791 pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13792 EXPECT_FALSE(handle.socket());
793 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51794 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48795 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30796
Eric Roman79cc7552019-07-19 02:17:54797 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40798
Matt Menke9fa17d52019-03-25 19:12:26799 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17800 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26801 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00802 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26803 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
804 EXPECT_TRUE(LogContainsEvent(
805 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
806 NetLogEventPhase::NONE));
807 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09808}
809
Matt Menke433de6d2020-03-04 00:24:11810// Test releasing an open socket into the socket pool, telling the socket pool
811// to close the socket.
812TEST_F(ClientSocketPoolBaseTest, ReleaseAndCloseConnection) {
813 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
814
815 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
816 ASSERT_TRUE(request(0)->handle()->socket());
817 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
818 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
819
820 EXPECT_EQ(0, pool_->IdleSocketCount());
821 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
822
823 ExpectSocketClosedWithReason(
824 source, TransportClientSocketPool::kClosedConnectionReturnedToPool);
825}
826
827TEST_F(ClientSocketPoolBaseTest, SocketWithUnreadDataReturnedToPool) {
828 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
829 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
830
831 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
832 ASSERT_TRUE(request(0)->handle()->socket());
833 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
834 EXPECT_TRUE(request(0)->handle()->socket()->IsConnected());
835 EXPECT_FALSE(request(0)->handle()->socket()->IsConnectedAndIdle());
836 ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE);
837
838 EXPECT_EQ(0, pool_->IdleSocketCount());
839 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
840
841 ExpectSocketClosedWithReason(
842 source, TransportClientSocketPool::kDataReceivedUnexpectedly);
843}
844
Matt Menkef6edce752019-03-19 17:21:56845// Make sure different groups do not share sockets.
846TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59847 base::test::ScopedFeatureList feature_list;
848 feature_list.InitAndEnableFeature(
849 features::kPartitionConnectionsByNetworkIsolationKey);
850
Matt Menkef6edce752019-03-19 17:21:56851 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
852
853 const HostPortPair kHostPortPairs[] = {
854 {"a", 80},
855 {"a", 443},
856 {"b", 80},
857 };
858
859 const ClientSocketPool::SocketType kSocketTypes[] = {
860 ClientSocketPool::SocketType::kHttp,
861 ClientSocketPool::SocketType::kSsl,
Matt Menkef6edce752019-03-19 17:21:56862 };
863
Matt Menkebdf777802019-04-22 19:38:59864 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
865 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56866
Shivani Sharma8ae506c2019-07-21 21:08:27867 const auto kOriginA = url::Origin::Create(GURL("http://a.test/"));
868 const auto kOriginB = url::Origin::Create(GURL("http://b.test/"));
Matt Menke166443c2019-05-24 18:45:59869 const NetworkIsolationKey kNetworkIsolationKeys[] = {
Shivani Sharma8ae506c2019-07-21 21:08:27870 NetworkIsolationKey(kOriginA, kOriginA),
871 NetworkIsolationKey(kOriginB, kOriginB),
Matt Menke166443c2019-05-24 18:45:59872 };
873
dalyk5f48a132019-10-14 15:20:19874 const bool kDisableSecureDnsValues[] = {false, true};
875
Matt Menkef6edce752019-03-19 17:21:56876 int total_idle_sockets = 0;
877
878 // Walk through each GroupId, making sure that requesting a socket for one
879 // group does not return a previously connected socket for another group.
880 for (const auto& host_port_pair : kHostPortPairs) {
881 SCOPED_TRACE(host_port_pair.ToString());
882 for (const auto& socket_type : kSocketTypes) {
883 SCOPED_TRACE(static_cast<int>(socket_type));
884 for (const auto& privacy_mode : kPrivacyModes) {
885 SCOPED_TRACE(privacy_mode);
Matt Menke166443c2019-05-24 18:45:59886 for (const auto& network_isolation_key : kNetworkIsolationKeys) {
887 SCOPED_TRACE(network_isolation_key.ToString());
dalyk5f48a132019-10-14 15:20:19888 for (const auto& disable_secure_dns : kDisableSecureDnsValues) {
889 SCOPED_TRACE(disable_secure_dns);
Matt Menkef6edce752019-03-19 17:21:56890
dalyk5f48a132019-10-14 15:20:19891 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56892
dalyk5f48a132019-10-14 15:20:19893 ClientSocketPool::GroupId group_id(
894 host_port_pair, socket_type, privacy_mode,
895 network_isolation_key, disable_secure_dns);
Matt Menkef6edce752019-03-19 17:21:56896
dalyk5f48a132019-10-14 15:20:19897 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56898
dalyk5f48a132019-10-14 15:20:19899 TestCompletionCallback callback;
900 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56901
dalyk5f48a132019-10-14 15:20:19902 // Since the group is empty, requesting a socket should not complete
903 // synchronously.
904 EXPECT_THAT(handle.Init(group_id, params_, base::nullopt,
905 DEFAULT_PRIORITY, SocketTag(),
906 ClientSocketPool::RespectLimits::ENABLED,
907 callback.callback(),
908 ClientSocketPool::ProxyAuthCallback(),
909 pool_.get(), NetLogWithSource()),
910 IsError(ERR_IO_PENDING));
911 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
912 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56913
dalyk5f48a132019-10-14 15:20:19914 EXPECT_THAT(callback.WaitForResult(), IsOk());
915 EXPECT_TRUE(handle.socket());
916 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
917 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56918
dalyk5f48a132019-10-14 15:20:19919 // Return socket to pool.
920 handle.Reset();
921 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56922
dalyk5f48a132019-10-14 15:20:19923 // Requesting a socket again should return the same socket as
924 // before, so should complete synchronously.
925 EXPECT_THAT(handle.Init(group_id, params_, base::nullopt,
926 DEFAULT_PRIORITY, SocketTag(),
927 ClientSocketPool::RespectLimits::ENABLED,
928 callback.callback(),
929 ClientSocketPool::ProxyAuthCallback(),
930 pool_.get(), NetLogWithSource()),
931 IsOk());
932 EXPECT_TRUE(handle.socket());
933 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56934
dalyk5f48a132019-10-14 15:20:19935 // Return socket to pool again.
936 handle.Reset();
937 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56938
dalyk5f48a132019-10-14 15:20:19939 ++total_idle_sockets;
940 }
Matt Menke166443c2019-05-24 18:45:59941 }
Matt Menkef6edce752019-03-19 17:21:56942 }
943 }
944 }
945}
946
[email protected]211d21722009-07-22 15:48:53947TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
948 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
949
[email protected]9e743cd2010-03-16 07:03:53950 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30951
Matt Menkec6b3edf72019-03-19 17:00:39952 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
953 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
954 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
955 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53956
[email protected]2431756e2010-09-29 20:26:13957 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53958 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13959 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53960
Matt Menkec6b3edf72019-03-19 17:00:39961 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
962 IsError(ERR_IO_PENDING));
963 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
964 IsError(ERR_IO_PENDING));
965 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
966 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53967
[email protected]2431756e2010-09-29 20:26:13968 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53969
[email protected]2431756e2010-09-29 20:26:13970 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53971 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13972 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53973
974 EXPECT_EQ(1, GetOrderOfRequest(1));
975 EXPECT_EQ(2, GetOrderOfRequest(2));
976 EXPECT_EQ(3, GetOrderOfRequest(3));
977 EXPECT_EQ(4, GetOrderOfRequest(4));
978 EXPECT_EQ(5, GetOrderOfRequest(5));
979 EXPECT_EQ(6, GetOrderOfRequest(6));
980 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17981
982 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13983 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53984}
985
986TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
987 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
988
[email protected]9e743cd2010-03-16 07:03:53989 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30990
[email protected]211d21722009-07-22 15:48:53991 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39992 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
993 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
994 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
995 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53996
[email protected]2431756e2010-09-29 20:26:13997 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53998 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13999 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531000
1001 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:391002 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1003 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531004
[email protected]2431756e2010-09-29 20:26:131005 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531006
[email protected]2431756e2010-09-29 20:26:131007 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531008 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131009 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531010
1011 EXPECT_EQ(1, GetOrderOfRequest(1));
1012 EXPECT_EQ(2, GetOrderOfRequest(2));
1013 EXPECT_EQ(3, GetOrderOfRequest(3));
1014 EXPECT_EQ(4, GetOrderOfRequest(4));
1015 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:171016
1017 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131018 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531019}
1020
1021TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
1022 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1023
Matt Menkec6b3edf72019-03-19 17:00:391024 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
1025 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
1026 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1027 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:531028
[email protected]2431756e2010-09-29 20:26:131029 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531030 client_socket_factory_.allocation_count());
1031
Matt Menkec6b3edf72019-03-19 17:00:391032 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
1033 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1034 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531035
[email protected]2431756e2010-09-29 20:26:131036 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531037
[email protected]2431756e2010-09-29 20:26:131038 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531039
1040 // First 4 requests don't have to wait, and finish in order.
1041 EXPECT_EQ(1, GetOrderOfRequest(1));
1042 EXPECT_EQ(2, GetOrderOfRequest(2));
1043 EXPECT_EQ(3, GetOrderOfRequest(3));
1044 EXPECT_EQ(4, GetOrderOfRequest(4));
1045
Matt Menkec6b3edf72019-03-19 17:00:391046 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1047 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531048 EXPECT_EQ(7, GetOrderOfRequest(5));
1049 EXPECT_EQ(6, GetOrderOfRequest(6));
1050 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171051
1052 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131053 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531054}
1055
rdsmith29dbad12017-02-17 02:22:181056// Test reprioritizing a request before completion doesn't interfere with
1057// its completion.
1058TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1059 CreatePool(kDefaultMaxSockets, 1);
1060
Matt Menkec6b3edf72019-03-19 17:00:391061 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1062 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181063 EXPECT_TRUE(request(0)->handle()->socket());
1064 EXPECT_FALSE(request(1)->handle()->socket());
1065
Lily Chenecebf932018-11-02 17:15:431066 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181067
1068 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1069
1070 EXPECT_TRUE(request(1)->handle()->socket());
1071}
1072
1073// Reprioritize a request up past another one and make sure that changes the
1074// completion order.
1075TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1076 CreatePool(kDefaultMaxSockets, 1);
1077
Matt Menkec6b3edf72019-03-19 17:00:391078 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1079 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1080 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181081 EXPECT_TRUE(request(0)->handle()->socket());
1082 EXPECT_FALSE(request(1)->handle()->socket());
1083 EXPECT_FALSE(request(2)->handle()->socket());
1084
1085 request(2)->handle()->SetPriority(HIGHEST);
1086
1087 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1088
1089 EXPECT_EQ(1, GetOrderOfRequest(1));
1090 EXPECT_EQ(3, GetOrderOfRequest(2));
1091 EXPECT_EQ(2, GetOrderOfRequest(3));
1092}
1093
1094// Reprioritize a request without changing relative priorities and check
1095// that the order doesn't change.
1096TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1097 CreatePool(kDefaultMaxSockets, 1);
1098
Matt Menkec6b3edf72019-03-19 17:00:391099 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1100 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1101 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181102 EXPECT_TRUE(request(0)->handle()->socket());
1103 EXPECT_FALSE(request(1)->handle()->socket());
1104 EXPECT_FALSE(request(2)->handle()->socket());
1105
1106 request(2)->handle()->SetPriority(MEDIUM);
1107
1108 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1109
1110 EXPECT_EQ(1, GetOrderOfRequest(1));
1111 EXPECT_EQ(2, GetOrderOfRequest(2));
1112 EXPECT_EQ(3, GetOrderOfRequest(3));
1113}
1114
1115// Reprioritize a request past down another one and make sure that changes the
1116// completion order.
1117TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1118 CreatePool(kDefaultMaxSockets, 1);
1119
Matt Menkec6b3edf72019-03-19 17:00:391120 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1121 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1122 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181123 EXPECT_TRUE(request(0)->handle()->socket());
1124 EXPECT_FALSE(request(1)->handle()->socket());
1125 EXPECT_FALSE(request(2)->handle()->socket());
1126
1127 request(1)->handle()->SetPriority(LOW);
1128
1129 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1130
1131 EXPECT_EQ(1, GetOrderOfRequest(1));
1132 EXPECT_EQ(3, GetOrderOfRequest(2));
1133 EXPECT_EQ(2, GetOrderOfRequest(3));
1134}
1135
1136// Reprioritize a request to the same level as another and confirm it is
1137// put after the old request.
1138TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1139 CreatePool(kDefaultMaxSockets, 1);
1140
Matt Menkec6b3edf72019-03-19 17:00:391141 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1142 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1143 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181144 EXPECT_TRUE(request(0)->handle()->socket());
1145 EXPECT_FALSE(request(1)->handle()->socket());
1146 EXPECT_FALSE(request(2)->handle()->socket());
1147
1148 request(1)->handle()->SetPriority(MEDIUM);
1149
1150 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1151
1152 EXPECT_EQ(1, GetOrderOfRequest(1));
1153 EXPECT_EQ(3, GetOrderOfRequest(2));
1154 EXPECT_EQ(2, GetOrderOfRequest(3));
1155}
1156
[email protected]211d21722009-07-22 15:48:531157TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1158 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1159
Matt Menkec6b3edf72019-03-19 17:00:391160 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1161 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1162 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1163 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531164
[email protected]2431756e2010-09-29 20:26:131165 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531166 client_socket_factory_.allocation_count());
1167
Matt Menkec6b3edf72019-03-19 17:00:391168 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1169 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1170 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531171
[email protected]2431756e2010-09-29 20:26:131172 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531173
[email protected]2431756e2010-09-29 20:26:131174 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531175 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131176 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531177
1178 // First 4 requests don't have to wait, and finish in order.
1179 EXPECT_EQ(1, GetOrderOfRequest(1));
1180 EXPECT_EQ(2, GetOrderOfRequest(2));
1181 EXPECT_EQ(3, GetOrderOfRequest(3));
1182 EXPECT_EQ(4, GetOrderOfRequest(4));
1183
1184 // Request ("b", 7) has the highest priority, but we can't make new socket for
1185 // group "b", because it has reached the per-group limit. Then we make
1186 // socket for ("c", 6), because it has higher priority than ("a", 4),
1187 // and we still can't make a socket for group "b".
1188 EXPECT_EQ(5, GetOrderOfRequest(5));
1189 EXPECT_EQ(6, GetOrderOfRequest(6));
1190 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171191
1192 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131193 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531194}
1195
1196// Make sure that we count connecting sockets against the total limit.
1197TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1198 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1199
Matt Menkec6b3edf72019-03-19 17:00:391200 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1201 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1202 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531203
1204 // Create one asynchronous request.
1205 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391206 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1207 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531208
[email protected]6b175382009-10-13 06:47:471209 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1210 // actually become pending until 2ms after they have been created. In order
1211 // to flush all tasks, we need to wait so that we know there are no
1212 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451213 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471214
[email protected]211d21722009-07-22 15:48:531215 // The next synchronous request should wait for its turn.
1216 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391217 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1218 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531219
[email protected]2431756e2010-09-29 20:26:131220 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531221
[email protected]2431756e2010-09-29 20:26:131222 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531223 client_socket_factory_.allocation_count());
1224
1225 EXPECT_EQ(1, GetOrderOfRequest(1));
1226 EXPECT_EQ(2, GetOrderOfRequest(2));
1227 EXPECT_EQ(3, GetOrderOfRequest(3));
1228 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171229 EXPECT_EQ(5, GetOrderOfRequest(5));
1230
1231 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131232 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531233}
1234
[email protected]6427fe22010-04-16 22:27:411235TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1236 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1237 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1238
Matt Menkec6b3edf72019-03-19 17:00:391239 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1240 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1241 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1242 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411243
1244 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1245
1246 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1247
Matt Menkec6b3edf72019-03-19 17:00:391248 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1249 IsError(ERR_IO_PENDING));
1250 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1251 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411252
1253 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1254
[email protected]2431756e2010-09-29 20:26:131255 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411256 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131257 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411258 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131259 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1260 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411261 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1262}
1263
[email protected]d7027bb2010-05-10 18:58:541264TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1265 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1266 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1267
1268 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521269 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501270 EXPECT_EQ(
1271 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281272 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1273 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1274 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1275 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541276
1277 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241278 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521279 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501280 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391281 handles[i].Init(
Matt Menkef09e64c2019-04-23 22:16:281282 TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
1283 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1284 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1285 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541286 }
1287
1288 // One will be stalled, cancel all the handles now.
1289 // This should hit the OnAvailableSocketSlot() code where we previously had
1290 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241291 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541292 handles[i].Reset();
1293}
1294
[email protected]eb5a99382010-07-11 03:18:261295TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541296 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1297 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1298
[email protected]eb5a99382010-07-11 03:18:261299 {
1300 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521301 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261302 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkef09e64c2019-04-23 22:16:281303 EXPECT_EQ(OK,
1304 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
1305 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
1306 ClientSocketPool::RespectLimits::ENABLED,
1307 callbacks[i].callback(),
1308 ClientSocketPool::ProxyAuthCallback(),
1309 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261310 }
1311
1312 // Force a stalled group.
1313 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521314 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201315 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391316 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281317 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1318 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1319 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1320 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261321
1322 // Cancel the stalled request.
1323 stalled_handle.Reset();
1324
1325 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1326 EXPECT_EQ(0, pool_->IdleSocketCount());
1327
1328 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541329 }
1330
[email protected]43a21b82010-06-10 21:30:541331 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1332 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261333}
[email protected]43a21b82010-06-10 21:30:541334
[email protected]eb5a99382010-07-11 03:18:261335TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1336 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1337 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1338
1339 {
1340 ClientSocketHandle handles[kDefaultMaxSockets];
1341 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521342 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201343 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391344 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
Matt Menkef09e64c2019-04-23 22:16:281345 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkec6b3edf72019-03-19 17:00:391346 ClientSocketPool::RespectLimits::ENABLED,
1347 callback.callback(),
1348 ClientSocketPool::ProxyAuthCallback(),
1349 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261350 }
1351
1352 // Force a stalled group.
1353 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1354 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521355 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201356 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391357 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281358 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1359 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1360 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1361 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261362
1363 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261364 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1365 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1366 TestGroupId("foo")));
1367 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1368 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261369
1370 // Cancel the stalled request.
1371 handles[0].Reset();
1372
[email protected]eb5a99382010-07-11 03:18:261373 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261374 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1375 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1376 TestGroupId("foo")));
1377 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1378 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261379
1380 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011381 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261382
1383 EXPECT_EQ(kDefaultMaxSockets + 1,
1384 client_socket_factory_.allocation_count());
1385 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261386 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1387 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1388 TestGroupId("foo")));
1389 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1390 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261391
1392 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541393 }
1394
[email protected]eb5a99382010-07-11 03:18:261395 EXPECT_EQ(1, pool_->IdleSocketCount());
1396}
[email protected]43a21b82010-06-10 21:30:541397
[email protected]eb5a99382010-07-11 03:18:261398TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1399 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1400 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541401
[email protected]eb5a99382010-07-11 03:18:261402 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521403 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261404 {
[email protected]51fdc7c2012-04-10 19:19:481405 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261406 ClientSocketHandle handles[kDefaultMaxSockets];
1407 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521408 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391409 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281410 OK, handles[i].Init(
1411 TestGroupId(base::StringPrintf("Take 2: %d", i)), params_,
1412 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
1413 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1414 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1415 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261416 }
1417
1418 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1419 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481420 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261421
1422 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201423 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391424 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281425 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1426 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1427 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1428 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481429 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261430
1431 // Dropping out of scope will close all handles and return them to idle.
1432 }
[email protected]43a21b82010-06-10 21:30:541433
1434 // But if we wait for it, the released idle sockets will be closed in
1435 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011436 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261437
1438 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1439 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541440}
1441
1442// Regression test for http://crbug.com/40952.
1443TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261444 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1445 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541446 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1447
1448 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1449 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521450 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391451 EXPECT_EQ(OK, handle.Init(TestGroupId(base::NumberToString(i)), params_,
Matt Menkef09e64c2019-04-23 22:16:281452 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkec6b3edf72019-03-19 17:00:391453 ClientSocketPool::RespectLimits::ENABLED,
1454 callback.callback(),
1455 ClientSocketPool::ProxyAuthCallback(),
1456 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541457 }
1458
1459 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281460 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541461
1462 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1463 // reuse a socket.
1464 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1465 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521466 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541467
1468 // "0" is special here, since it should be the first entry in the sorted map,
1469 // which is the one which we would close an idle socket for. We shouldn't
1470 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391471 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281472 TestGroupId("0"), params_, base::nullopt, DEFAULT_PRIORITY,
1473 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391474 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1475 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541476
1477 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1478 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1479}
1480
[email protected]ab838892009-06-30 18:49:051481TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531482 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091483
Matt Menkec6b3edf72019-03-19 17:00:391484 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1485 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1486 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1487 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1488 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1489 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1490 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1491 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091492
[email protected]2431756e2010-09-29 20:26:131493 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201494 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1495 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131496 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1497 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091498
[email protected]c9d6a1d2009-07-14 16:15:201499 EXPECT_EQ(1, GetOrderOfRequest(1));
1500 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031501 EXPECT_EQ(8, GetOrderOfRequest(3));
1502 EXPECT_EQ(6, GetOrderOfRequest(4));
1503 EXPECT_EQ(4, GetOrderOfRequest(5));
1504 EXPECT_EQ(3, GetOrderOfRequest(6));
1505 EXPECT_EQ(5, GetOrderOfRequest(7));
1506 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171507
1508 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131509 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091510}
1511
[email protected]ab838892009-06-30 18:49:051512TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531513 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091514
Matt Menkec6b3edf72019-03-19 17:00:391515 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1516 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1517 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1518 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1519 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1520 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1521 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091522
[email protected]2431756e2010-09-29 20:26:131523 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091524
[email protected]2431756e2010-09-29 20:26:131525 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011526 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201527
[email protected]2431756e2010-09-29 20:26:131528 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201529 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131530 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1531 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091532}
1533
Matt Menke7eb405e2019-04-25 20:48:211534TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1535 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1536
1537 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1538 ClientSocketHandle handle;
1539 TestCompletionCallback callback;
1540 EXPECT_EQ(
1541 ERR_IO_PENDING,
1542 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1543 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1544 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1545 pool_.get(), NetLogWithSource()));
1546
1547 EXPECT_THAT(callback.WaitForResult(), IsOk());
1548 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1549 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1550 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1551 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1552
1553 handle.ResetAndCloseSocket();
1554 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1555}
1556
Matt Menke99251ea42019-04-25 22:59:021557// This test will start up a socket request and then call Reset() on the handle.
1558// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211559TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531560 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201561
[email protected]ab838892009-06-30 18:49:051562 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131563 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521564 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501565 EXPECT_EQ(
1566 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281567 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1568 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1569 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1570 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131571 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211572 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1573 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1574}
1575
Matt Menke99251ea42019-04-25 22:59:021576// This test will start up a socket request and then call ResetAndCloseSocket()
1577// on the handle. The pending ConnectJob or connected socket should be
1578// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211579TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1580 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1581
Matt Menke99251ea42019-04-25 22:59:021582 // When true, the socket connects before it's canceled.
1583 for (bool cancel_when_callback_pending : {false, true}) {
1584 if (cancel_when_callback_pending) {
1585 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1586 } else {
1587 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1588 }
1589 ClientSocketHandle handle;
1590 TestCompletionCallback callback;
1591 EXPECT_EQ(
1592 ERR_IO_PENDING,
1593 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1594 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1595 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1596 pool_.get(), NetLogWithSource()));
1597 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1598 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1599
1600 if (cancel_when_callback_pending) {
1601 client_socket_factory_.SignalJobs();
1602 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1603 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1604 }
1605
1606 handle.ResetAndCloseSocket();
1607 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1608 }
Matt Menke7eb405e2019-04-25 20:48:211609}
1610
1611TEST_F(ClientSocketPoolBaseTest,
1612 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1613 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1614
Matt Menke99251ea42019-04-25 22:59:021615 // When true, the sockets connect before they're canceled.
1616 for (bool cancel_when_callback_pending : {false, true}) {
1617 if (cancel_when_callback_pending) {
1618 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1619 } else {
1620 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1621 }
Matt Menke7eb405e2019-04-25 20:48:211622
Matt Menke99251ea42019-04-25 22:59:021623 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1624 TestCompletionCallback callback;
1625 // Make |kDefaultMaxSockets + 1| socket requests.
1626 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1627 std::unique_ptr<ClientSocketHandle> handle =
1628 std::make_unique<ClientSocketHandle>();
1629 EXPECT_EQ(ERR_IO_PENDING,
1630 handle->Init(
1631 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1632 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1633 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1634 pool_.get(), NetLogWithSource()));
1635 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211636 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021637 EXPECT_EQ(
1638 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1639 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1640 }
1641
1642 if (cancel_when_callback_pending) {
1643 client_socket_factory_.SignalJobs();
1644 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1645 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1646 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1647 }
1648
1649 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1650 // or close a socket, since there are more requests than ConnectJobs or
1651 // sockets.
1652 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1653 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1654 if (cancel_when_callback_pending) {
1655 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1656 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1657 } else {
1658 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211659 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1660 }
Matt Menke99251ea42019-04-25 22:59:021661
1662 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1663 // or close a socket.
1664 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1665 handles[i]->ResetAndCloseSocket();
1666 if (i > 0) {
1667 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1668 if (cancel_when_callback_pending) {
1669 EXPECT_EQ(i,
1670 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1671 } else {
1672 EXPECT_EQ(static_cast<size_t>(i),
1673 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1674 }
1675 } else {
1676 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1677 }
1678 }
Matt Menke7eb405e2019-04-25 20:48:211679 }
[email protected]f6d1d6eb2009-06-24 20:16:091680}
1681
[email protected]ab838892009-06-30 18:49:051682TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531683 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201684
[email protected]ab838892009-06-30 18:49:051685 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061686 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521687 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091688
Matt Menke28ac03e2019-02-25 22:25:501689 EXPECT_EQ(
1690 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281691 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1692 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1693 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1694 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091695
1696 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211697 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1698 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091699
Matt Menke7eb405e2019-04-25 20:48:211700 // This will create a second ConnectJob, since the other ConnectJob was
1701 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521702 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501703 EXPECT_EQ(
1704 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281705 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1706 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501707 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1708 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091709
Matt Menke7eb405e2019-04-25 20:48:211710 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1711 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1712
robpercival214763f2016-07-01 23:27:011713 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091714 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211715 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1716 // One ConnectJob completed, and its socket is now assigned to |handle|.
1717 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1718 // The other ConnectJob should have either completed, or still be connecting.
1719 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1720 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091721
1722 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211723 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1724 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1725 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1726 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091727}
1728
[email protected]ab838892009-06-30 18:49:051729TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531730 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091731
Matt Menkec6b3edf72019-03-19 17:00:391732 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1733 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1734 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1735 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1736 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1737 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1738 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091739
1740 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201741 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131742 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1743 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091744
[email protected]2431756e2010-09-29 20:26:131745 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091746
[email protected]c9d6a1d2009-07-14 16:15:201747 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1748 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131749 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1750 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091751
[email protected]c9d6a1d2009-07-14 16:15:201752 EXPECT_EQ(1, GetOrderOfRequest(1));
1753 EXPECT_EQ(2, GetOrderOfRequest(2));
1754 EXPECT_EQ(5, GetOrderOfRequest(3));
1755 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131756 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1757 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201758 EXPECT_EQ(4, GetOrderOfRequest(6));
1759 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171760
1761 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131762 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091763}
1764
mmenke33d24423d2015-05-19 19:41:091765// Function to be used as a callback on socket request completion. It first
1766// disconnects the successfully connected socket from the first request, and
1767// then reuses the ClientSocketHandle to request another socket.
1768//
1769// |nested_callback| is called with the result of the second socket request.
1770void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261771 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091772 TestConnectJobFactory* test_connect_job_factory,
1773 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411774 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091775 int first_request_result) {
robpercival214763f2016-07-01 23:27:011776 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091777
1778 test_connect_job_factory->set_job_type(next_job_type);
1779
1780 // Don't allow reuse of the socket. Disconnect it and then release it.
1781 if (handle->socket())
1782 handle->socket()->Disconnect();
1783 handle->Reset();
1784
mmenke33d24423d2015-05-19 19:41:091785 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501786 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031787 TestGroupId("a"),
Matt Menkef09e64c2019-04-23 22:16:281788 ClientSocketPool::SocketParams::CreateForHttpForTesting(), base::nullopt,
1789 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031790 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1791 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091792 if (rv != ERR_IO_PENDING) {
1793 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411794 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091795 } else {
1796 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521797 }
mmenke33d24423d2015-05-19 19:41:091798}
[email protected]f6d1d6eb2009-06-24 20:16:091799
mmenke33d24423d2015-05-19 19:41:091800// Tests the case where a second socket is requested in a completion callback,
1801// and the second socket connects asynchronously. Reuses the same
1802// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581803TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531804 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201805
[email protected]0b7648c2009-07-06 20:14:011806 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061807 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091808 TestCompletionCallback second_result_callback;
1809 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281810 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541811 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501812 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1813 connect_job_factory_, TestConnectJob::kMockPendingJob,
1814 &second_result_callback),
1815 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011816 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091817
robpercival214763f2016-07-01 23:27:011818 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581819}
[email protected]f6d1d6eb2009-06-24 20:16:091820
mmenke33d24423d2015-05-19 19:41:091821// Tests the case where a second socket is requested in a completion callback,
1822// and the second socket connects synchronously. Reuses the same
1823// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581824TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531825 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201826
[email protected]0b7648c2009-07-06 20:14:011827 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061828 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091829 TestCompletionCallback second_result_callback;
1830 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281831 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541832 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501833 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1834 connect_job_factory_, TestConnectJob::kMockPendingJob,
1835 &second_result_callback),
1836 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011837 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581838
robpercival214763f2016-07-01 23:27:011839 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091840}
1841
1842// Make sure that pending requests get serviced after active requests get
1843// cancelled.
[email protected]ab838892009-06-30 18:49:051844TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531845 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201846
[email protected]0b7648c2009-07-06 20:14:011847 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091848
Matt Menkec6b3edf72019-03-19 17:00:391849 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1850 IsError(ERR_IO_PENDING));
1851 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1852 IsError(ERR_IO_PENDING));
1853 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1854 IsError(ERR_IO_PENDING));
1855 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1856 IsError(ERR_IO_PENDING));
1857 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1858 IsError(ERR_IO_PENDING));
1859 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1860 IsError(ERR_IO_PENDING));
1861 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1862 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091863
[email protected]c9d6a1d2009-07-14 16:15:201864 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1865 // Let's cancel them.
1866 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131867 ASSERT_FALSE(request(i)->handle()->is_initialized());
1868 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091869 }
1870
[email protected]f6d1d6eb2009-06-24 20:16:091871 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131872 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011873 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131874 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091875 }
1876
[email protected]2431756e2010-09-29 20:26:131877 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1878 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091879}
1880
1881// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051882TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531883 const size_t kMaxSockets = 5;
1884 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201885
[email protected]0b7648c2009-07-06 20:14:011886 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091887
[email protected]211d21722009-07-22 15:48:531888 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1889 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091890
1891 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531892 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391893 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1894 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091895
[email protected]211d21722009-07-22 15:48:531896 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011897 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091898}
1899
mmenke9d72fe42017-05-18 22:36:071900// Make sure that pending requests that complete synchronously get serviced
1901// after active requests fail. See https://crbug.com/723748
1902TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1903 const size_t kNumberOfRequests = 10;
1904 const size_t kMaxSockets = 1;
1905 CreatePool(kMaxSockets, kMaxSockets);
1906
1907 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1908
Matt Menkec6b3edf72019-03-19 17:00:391909 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1910 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071911
1912 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1913
1914 // Queue up all the other requests
1915 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391916 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1917 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071918
1919 // Make sure all requests fail, instead of hanging.
1920 for (size_t i = 0; i < kNumberOfRequests; ++i)
1921 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1922}
1923
[email protected]5fc08e32009-07-15 17:09:571924TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531925 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571926
1927 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1928
[email protected]2431756e2010-09-29 20:26:131929 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521930 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501931 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281932 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501933 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1934 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011935 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571936
1937 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131938 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571939
Matt Menkef09e64c2019-04-23 22:16:281940 rv = handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1941 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501942 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1943 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011944 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1945 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571946
[email protected]2431756e2010-09-29 20:26:131947 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481948 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571949 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1950}
1951
xunjieli26619e72016-11-23 19:39:551952TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
Matt Menke433de6d2020-03-04 00:24:111953 const char kReason[] = "Really nifty reason";
1954
xunjieli26619e72016-11-23 19:39:551955 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1956 ClientSocketHandle handle;
1957 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141958 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501959 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281960 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501961 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1962 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551963 EXPECT_THAT(rv, IsOk());
Matt Menke433de6d2020-03-04 00:24:111964 ASSERT_TRUE(handle.socket());
1965 NetLogSource source = handle.socket()->NetLog().source();
xunjieli26619e72016-11-23 19:39:551966 handle.Reset();
1967 EXPECT_EQ(1, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111968 pool_->CloseIdleSockets(kReason);
1969 ExpectSocketClosedWithReason(source, kReason);
xunjieli26619e72016-11-23 19:39:551970}
1971
xunjieli92feb332017-03-03 17:19:231972TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231973 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1974 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141975 RecordingBoundTestNetLog log;
xunjieli92feb332017-03-03 17:19:231976 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501977 int rv = handle1.Init(
Matt Menkef09e64c2019-04-23 22:16:281978 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501979 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1980 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231981 EXPECT_THAT(rv, IsOk());
1982 ClientSocketHandle handle2;
Matt Menkef09e64c2019-04-23 22:16:281983 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
1984 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501985 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1986 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231987 ClientSocketHandle handle3;
Matt Menkef09e64c2019-04-23 22:16:281988 rv = handle3.Init(TestGroupId("b"), params_, base::nullopt, LOWEST,
1989 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501990 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1991 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231992 EXPECT_THAT(rv, IsOk());
1993 handle1.Reset();
1994 handle2.Reset();
1995 handle3.Reset();
1996 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111997 pool_->CloseIdleSocketsInGroup(TestGroupId("a"), "Very good reason");
xunjieli92feb332017-03-03 17:19:231998 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231999}
2000
xunjieli26619e72016-11-23 19:39:552001TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:552002 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2003 ClientSocketHandle handle;
2004 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142005 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502006 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282007 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502008 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2009 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:552010 EXPECT_THAT(rv, IsOk());
2011 StreamSocket* socket = handle.socket();
Matt Menke433de6d2020-03-04 00:24:112012 ASSERT_TRUE(socket);
xunjieli26619e72016-11-23 19:39:552013 handle.Reset();
2014 EXPECT_EQ(1, pool_->IdleSocketCount());
2015
2016 // Disconnect socket now to make the socket unusable.
Matt Menke433de6d2020-03-04 00:24:112017 NetLogSource source = socket->NetLog().source();
xunjieli26619e72016-11-23 19:39:552018 socket->Disconnect();
2019 ClientSocketHandle handle2;
Matt Menkef09e64c2019-04-23 22:16:282020 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2021 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502022 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2023 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:552024 EXPECT_THAT(rv, IsOk());
2025 EXPECT_FALSE(handle2.is_reused());
Matt Menke433de6d2020-03-04 00:24:112026
2027 // This is admittedly not an accurate error in this case, but normally code
2028 // doesn't secretly keep a raw pointers to sockets returned to the socket pool
2029 // and close them out of band, so discovering an idle socket was closed when
2030 // trying to reuse it normally means it was closed by the remote side.
2031 ExpectSocketClosedWithReason(
2032 source, TransportClientSocketPool::kRemoteSideClosedConnection);
xunjieli26619e72016-11-23 19:39:552033}
2034
[email protected]2b7523d2009-07-29 20:29:232035// Regression test for http://crbug.com/17985.
2036TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
2037 const int kMaxSockets = 3;
2038 const int kMaxSocketsPerGroup = 2;
2039 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
2040
[email protected]ac790b42009-12-02 04:31:312041 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:232042
Matt Menkec6b3edf72019-03-19 17:00:392043 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2044 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232045
2046 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:392047 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2048 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232049
2050 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:392051 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232052
2053 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:392054 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2055 IsError(ERR_IO_PENDING));
2056 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2057 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232058
Matt Menkec6b3edf72019-03-19 17:00:392059 // Release the first two sockets from TestGroupId("a"). Because this is a
2060 // keepalive, the first release will unblock the pending request for
2061 // TestGroupId("a"). The second release will unblock a request for "c",
2062 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:132063 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
2064 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:232065
2066 // Closing idle sockets should not get us into trouble, but in the bug
2067 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:392068 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke433de6d2020-03-04 00:24:112069 pool_->CloseIdleSockets("Very good reason");
[email protected]eb5a99382010-07-11 03:18:262070
[email protected]2da659e2013-05-23 20:51:342071 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282072 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232073}
2074
[email protected]4d3b05d2010-01-27 21:27:292075TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532076 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572077
2078 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132079 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522080 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142081 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502082 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282083 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502084 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2085 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012086 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392087 EXPECT_EQ(LOAD_STATE_CONNECTING,
2088 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482089 TestLoadTimingInfoNotConnected(handle);
2090
robpercival214763f2016-07-01 23:27:012091 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132092 EXPECT_TRUE(handle.is_initialized());
2093 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482094 TestLoadTimingInfoConnectedNotReused(handle);
2095
[email protected]2431756e2010-09-29 20:26:132096 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482097 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302098
Eric Roman79cc7552019-07-19 02:17:542099 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402100
Matt Menke9fa17d52019-03-25 19:12:262101 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172102 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262103 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002104 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262105 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2106 EXPECT_TRUE(LogContainsEvent(
2107 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2108 NetLogEventPhase::NONE));
2109 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002110 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2111 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262112 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572113}
2114
[email protected]4d3b05d2010-01-27 21:27:292115TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572116 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532117 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572118
2119 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132120 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522121 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142122 RecordingBoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:182123 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132124 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512125 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502126 EXPECT_EQ(
2127 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282128 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2129 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2130 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2131 pool_.get(), log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:392132 EXPECT_EQ(LOAD_STATE_CONNECTING,
2133 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012134 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132135 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512136 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302137
Eric Roman79cc7552019-07-19 02:17:542138 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402139
Matt Menke9fa17d52019-03-25 19:12:262140 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172141 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262142 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002143 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262144 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2145 EXPECT_TRUE(LogContainsEvent(
2146 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2147 NetLogEventPhase::NONE));
2148 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572149}
2150
mmenke6be122f2015-03-09 22:22:472151// Check that an async ConnectJob failure does not result in creation of a new
2152// ConnectJob when there's another pending request also waiting on its own
2153// ConnectJob. See http://crbug.com/463960.
2154TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2155 CreatePool(2, 2);
2156 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2157
Matt Menkec6b3edf72019-03-19 17:00:392158 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2159 IsError(ERR_IO_PENDING));
2160 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2161 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472162
robpercival214763f2016-07-01 23:27:012163 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2164 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472165
2166 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2167}
2168
[email protected]4d3b05d2010-01-27 21:27:292169TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102170 // TODO(eroman): Add back the log expectations! Removed them because the
2171 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532172 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572173
2174 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132175 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522176 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132177 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522178 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572179
Matt Menke28ac03e2019-02-25 22:25:502180 EXPECT_EQ(
2181 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282182 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2183 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2184 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2185 pool_.get(), NetLogWithSource()));
Matt Muellerd9342e3a2019-11-26 01:41:142186 RecordingBoundTestNetLog log2;
tfarina428341112016-09-22 13:38:202187 EXPECT_EQ(
2188 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282189 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2190 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502191 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2192 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572193
[email protected]2431756e2010-09-29 20:26:132194 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572195
[email protected]fd7b7c92009-08-20 19:38:302196
2197 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302198
robpercival214763f2016-07-01 23:27:012199 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132200 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302201
2202 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532203 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572204}
2205
[email protected]4d3b05d2010-01-27 21:27:292206TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342207 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2208
[email protected]17a0c6c2009-08-04 00:07:042209 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2210
Matt Menkec6b3edf72019-03-19 17:00:392211 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2212 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2213 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2214 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342215
Raul Tambre8335a6d2019-02-21 16:57:432216 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262217 static_cast<int>(
2218 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132219 (*requests())[2]->handle()->Reset();
2220 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432221 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262222 static_cast<int>(
2223 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342224
[email protected]2431756e2010-09-29 20:26:132225 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432226 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262227 static_cast<int>(
2228 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342229
[email protected]2431756e2010-09-29 20:26:132230 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432231 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262232 static_cast<int>(
2233 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342234}
2235
[email protected]5fc08e32009-07-15 17:09:572236// When requests and ConnectJobs are not coupled, the request will get serviced
2237// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292238TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532239 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572240
2241 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322242 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572243
[email protected]2431756e2010-09-29 20:26:132244 std::vector<TestSocketRequest*> request_order;
2245 size_t completion_count; // unused
2246 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502247 int rv = req1.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282248 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502249 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2250 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012251 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2252 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572253
2254 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2255 // without a job.
2256 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2257
[email protected]2431756e2010-09-29 20:26:132258 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502259 rv = req2.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282260 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502261 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2262 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012263 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132264 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502265 rv = req3.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282266 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502267 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2268 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012269 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572270
2271 // Both Requests 2 and 3 are pending. We release socket 1 which should
2272 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332273 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342274 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282275 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332276 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012277 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332278 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572279
2280 // Signal job 2, which should service request 3.
2281
2282 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012283 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572284
Raul Tambre8335a6d2019-02-21 16:57:432285 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132286 EXPECT_EQ(&req1, request_order[0]);
2287 EXPECT_EQ(&req2, request_order[1]);
2288 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392289 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572290}
2291
2292// The requests are not coupled to the jobs. So, the requests should finish in
2293// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292294TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532295 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572296 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322297 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572298
[email protected]2431756e2010-09-29 20:26:132299 std::vector<TestSocketRequest*> request_order;
2300 size_t completion_count; // unused
2301 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502302 int rv = req1.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282303 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502304 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2305 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012306 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572307
[email protected]2431756e2010-09-29 20:26:132308 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502309 rv = req2.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282310 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502311 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2312 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012313 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572314
2315 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322316 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572317
[email protected]2431756e2010-09-29 20:26:132318 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502319 rv = req3.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282320 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502321 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2322 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012323 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572324
robpercival214763f2016-07-01 23:27:012325 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2326 EXPECT_THAT(req2.WaitForResult(), IsOk());
2327 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572328
Raul Tambre8335a6d2019-02-21 16:57:432329 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132330 EXPECT_EQ(&req1, request_order[0]);
2331 EXPECT_EQ(&req2, request_order[1]);
2332 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572333}
2334
[email protected]03b7c8c2013-07-20 04:38:552335// Test GetLoadState in the case there's only one socket request.
2336TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532337 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552338 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572339
[email protected]2431756e2010-09-29 20:26:132340 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522341 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502342 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282343 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502344 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2345 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012346 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552347 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572348
[email protected]03b7c8c2013-07-20 04:38:552349 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2350 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2351
2352 // No point in completing the connection, since ClientSocketHandles only
2353 // expect the LoadState to be checked while connecting.
2354}
2355
2356// Test GetLoadState in the case there are two socket requests.
2357TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2358 CreatePool(2, 2);
2359 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2360
2361 ClientSocketHandle handle;
2362 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502363 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282364 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502365 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2366 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012367 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002368 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2369
2370 ClientSocketHandle handle2;
2371 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282372 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2373 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502374 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2375 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012376 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002377 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2378
Matt Menke4b69f932019-03-04 16:20:012379 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002380 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2381 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2382
Matt Menke4b69f932019-03-04 16:20:012383 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002384 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2385
Matt Menke4b69f932019-03-04 16:20:012386 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002387 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002388 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012389
2390 // Update the state of the second job.
2391 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2392
2393 // Only the state of the second request should have changed.
2394 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2395 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2396
2397 // Second job connects and the first request gets the socket. The
2398 // second handle switches to the state of the remaining ConnectJob.
2399 client_socket_factory_.SignalJob(1);
2400 EXPECT_THAT(callback.WaitForResult(), IsOk());
2401 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552402}
2403
2404// Test GetLoadState in the case the per-group limit is reached.
2405TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2406 CreatePool(2, 1);
2407 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2408
2409 ClientSocketHandle handle;
2410 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502411 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282412 TestGroupId("a"), params_, base::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502413 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2414 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012415 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552416 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2417
2418 // Request another socket from the same pool, buth with a higher priority.
2419 // The first request should now be stalled at the socket group limit.
2420 ClientSocketHandle handle2;
2421 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282422 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
2423 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502424 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2425 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012426 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552427 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2428 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2429
2430 // The first handle should remain stalled as the other socket goes through
2431 // the connect process.
2432
2433 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2434 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2435 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2436
2437 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012438 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552439 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2440
2441 // Closing the second socket should cause the stalled handle to finally get a
2442 // ConnectJob.
2443 handle2.socket()->Disconnect();
2444 handle2.Reset();
2445 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2446}
2447
2448// Test GetLoadState in the case the per-pool limit is reached.
2449TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2450 CreatePool(2, 2);
2451 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2452
2453 ClientSocketHandle handle;
2454 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502455 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282456 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502457 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2458 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012459 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552460
2461 // Request for socket from another pool.
2462 ClientSocketHandle handle2;
2463 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282464 rv = handle2.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
2465 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502466 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2467 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012468 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552469
2470 // Request another socket from the first pool. Request should stall at the
2471 // socket pool limit.
2472 ClientSocketHandle handle3;
2473 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282474 rv = handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2475 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502476 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2477 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012478 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552479
2480 // The third handle should remain stalled as the other sockets in its group
2481 // goes through the connect process.
2482
2483 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2484 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2485
2486 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2487 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2488 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2489
2490 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012491 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552492 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2493
2494 // Closing a socket should allow the stalled handle to finally get a new
2495 // ConnectJob.
2496 handle.socket()->Disconnect();
2497 handle.Reset();
2498 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572499}
2500
Matt Menkeb57663b32019-03-01 17:17:102501TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132502 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102503 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132504
[email protected]2431756e2010-09-29 20:26:132505 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522506 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502507 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102508 ERR_CERT_COMMON_NAME_INVALID,
Matt Menkef09e64c2019-04-23 22:16:282509 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2510 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2511 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2512 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132513 EXPECT_TRUE(handle.is_initialized());
2514 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132515}
2516
Matt Menkeb57663b32019-03-01 17:17:102517TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132518 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2519
Matt Menkeb57663b32019-03-01 17:17:102520 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132521 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522522 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502523 EXPECT_EQ(
2524 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282525 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2526 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2527 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2528 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392529 EXPECT_EQ(LOAD_STATE_CONNECTING,
2530 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102531 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132532 EXPECT_TRUE(handle.is_initialized());
2533 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132534}
2535
[email protected]e60e47a2010-07-14 03:37:182536TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2537 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2538 connect_job_factory_->set_job_type(
2539 TestConnectJob::kMockAdditionalErrorStateJob);
2540
[email protected]2431756e2010-09-29 20:26:132541 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522542 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502543 EXPECT_EQ(
2544 ERR_CONNECTION_FAILED,
Matt Menkef09e64c2019-04-23 22:16:282545 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2546 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2547 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2548 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132549 EXPECT_FALSE(handle.is_initialized());
2550 EXPECT_FALSE(handle.socket());
2551 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512552 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182553}
2554
2555TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2556 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2557
2558 connect_job_factory_->set_job_type(
2559 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132560 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522561 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502562 EXPECT_EQ(
2563 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282564 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2565 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2566 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2567 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392568 EXPECT_EQ(LOAD_STATE_CONNECTING,
2569 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012570 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132571 EXPECT_FALSE(handle.is_initialized());
2572 EXPECT_FALSE(handle.socket());
2573 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512574 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182575}
2576
martijn003cd612016-05-19 22:24:382577// Make sure we can reuse sockets.
2578TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412579 CreatePoolWithIdleTimeouts(
2580 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032581 base::TimeDelta(), // Time out unused sockets immediately.
2582 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2583
2584 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2585
2586 ClientSocketHandle handle;
2587 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502588 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282589 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502590 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2591 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012592 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392593 EXPECT_EQ(LOAD_STATE_CONNECTING,
2594 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012595 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032596
2597 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352598 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382599 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482600 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032601 handle.Reset();
2602
2603 // Should now have one idle socket.
2604 ASSERT_EQ(1, pool_->IdleSocketCount());
2605
2606 // Request a new socket. This should reuse the old socket and complete
2607 // synchronously.
Matt Muellerd9342e3a2019-11-26 01:41:142608 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502609 rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282610 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502611 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2612 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012613 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032614 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482615 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032616
Matt Menke9fa17d52019-03-25 19:12:262617 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392618 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262619 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032620
Eric Roman79cc7552019-07-19 02:17:542621 auto entries = log.GetEntries();
Matt Menke9fa17d52019-03-25 19:12:262622 EXPECT_TRUE(LogContainsEvent(
2623 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2624 NetLogEventPhase::NONE));
2625 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032626 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262627 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032628}
2629
martijn003cd612016-05-19 22:24:382630// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172631TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032632 CreatePoolWithIdleTimeouts(
2633 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2634 base::TimeDelta(), // Time out unused sockets immediately
2635 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412636
2637 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2638
2639 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2640
2641 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522642 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502643 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282644 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502645 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2646 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012647 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392648 EXPECT_EQ(LOAD_STATE_CONNECTING,
2649 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412650
2651 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522652 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282653 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2654 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502655 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2656 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012657 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392658 EXPECT_EQ(LOAD_STATE_CONNECTING,
2659 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412660
2661 // Cancel one of the requests. Wait for the other, which will get the first
2662 // job. Release the socket. Run the loop again to make sure the second
2663 // socket is sitting idle and the first one is released (since ReleaseSocket()
2664 // just posts a DoReleaseSocket() task).
2665
2666 handle.Reset();
robpercival214763f2016-07-01 23:27:012667 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menke433de6d2020-03-04 00:24:112668 // Get the NetLogSource for the socket, so the time out reason can be checked
2669 // at the end of the test.
2670 NetLogSource net_log_source2 = handle2.socket()->NetLog().source();
[email protected]64770b7d2011-11-16 04:30:412671 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352672 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382673 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412674 handle2.Reset();
2675
[email protected]e7b1c6d2c2012-05-05 00:54:032676 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2677 // actually become pending until 2ms after they have been created. In order
2678 // to flush all tasks, we need to wait so that we know there are no
2679 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452680 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412681
[email protected]e7b1c6d2c2012-05-05 00:54:032682 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412683 ASSERT_EQ(2, pool_->IdleSocketCount());
2684
2685 // Request a new socket. This should cleanup the unused and timed out ones.
2686 // A new socket will be created rather than reusing the idle one.
Matt Muellerd9342e3a2019-11-26 01:41:142687 RecordingBoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522688 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282689 rv = handle.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2690 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502691 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2692 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012693 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2694 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412695 EXPECT_FALSE(handle.is_reused());
2696
[email protected]e7b1c6d2c2012-05-05 00:54:032697 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262698 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392699 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262700 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412701
Eric Roman79cc7552019-07-19 02:17:542702 auto entries = log.GetEntries();
[email protected]64770b7d2011-11-16 04:30:412703 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002704 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
Matt Menke433de6d2020-03-04 00:24:112705 ExpectSocketClosedWithReason(
2706 net_log_source2, TransportClientSocketPool::kIdleTimeLimitExpired);
[email protected]64770b7d2011-11-16 04:30:412707}
2708
[email protected]2041cf342010-02-19 03:15:592709// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162710// because of multiple releasing disconnected sockets.
2711TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2712 CreatePoolWithIdleTimeouts(
2713 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2714 base::TimeDelta(), // Time out unused sockets immediately.
2715 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2716
2717 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2718
2719 // Startup 4 connect jobs. Two of them will be pending.
2720
[email protected]2431756e2010-09-29 20:26:132721 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522722 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502723 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282724 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502725 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2726 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012727 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162728
[email protected]2431756e2010-09-29 20:26:132729 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522730 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282731 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2732 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502733 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2734 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012735 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162736
[email protected]2431756e2010-09-29 20:26:132737 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522738 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282739 rv = handle3.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2740 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502741 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2742 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012743 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162744
[email protected]2431756e2010-09-29 20:26:132745 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522746 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:282747 rv = handle4.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2748 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502749 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2750 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012751 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162752
2753 // Release two disconnected sockets.
2754
[email protected]2431756e2010-09-29 20:26:132755 handle.socket()->Disconnect();
2756 handle.Reset();
2757 handle2.socket()->Disconnect();
2758 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162759
robpercival214763f2016-07-01 23:27:012760 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132761 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012762 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132763 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162764}
2765
[email protected]d7027bb2010-05-10 18:58:542766// Regression test for http://crbug.com/42267.
2767// When DoReleaseSocket() is processed for one socket, it is blocked because the
2768// other stalled groups all have releasing sockets, so no progress can be made.
2769TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2770 CreatePoolWithIdleTimeouts(
2771 4 /* socket limit */, 4 /* socket limit per group */,
2772 base::TimeDelta(), // Time out unused sockets immediately.
2773 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2774
2775 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2776
2777 // Max out the socket limit with 2 per group.
2778
[email protected]2431756e2010-09-29 20:26:132779 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522780 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132781 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522782 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542783
2784 for (int i = 0; i < 2; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282785 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, base::nullopt,
2786 LOWEST, SocketTag(),
2787 ClientSocketPool::RespectLimits::ENABLED,
2788 callback_a[i].callback(),
2789 ClientSocketPool::ProxyAuthCallback(),
2790 pool_.get(), NetLogWithSource()));
2791 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, base::nullopt,
2792 LOWEST, SocketTag(),
2793 ClientSocketPool::RespectLimits::ENABLED,
2794 callback_b[i].callback(),
2795 ClientSocketPool::ProxyAuthCallback(),
2796 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542797 }
[email protected]b89f7e42010-05-20 20:37:002798
[email protected]d7027bb2010-05-10 18:58:542799 // Make 4 pending requests, 2 per group.
2800
2801 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282802 EXPECT_EQ(
2803 ERR_IO_PENDING,
2804 handle_a[i].Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2805 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2806 callback_a[i].callback(),
2807 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2808 NetLogWithSource()));
2809 EXPECT_EQ(
2810 ERR_IO_PENDING,
2811 handle_b[i].Init(TestGroupId("b"), params_, base::nullopt, LOWEST,
2812 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2813 callback_b[i].callback(),
2814 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2815 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542816 }
2817
2818 // Release b's socket first. The order is important, because in
2819 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2820 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2821 // first, which has a releasing socket, so it refuses to start up another
2822 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132823 handle_b[0].socket()->Disconnect();
2824 handle_b[0].Reset();
2825 handle_a[0].socket()->Disconnect();
2826 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542827
2828 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282829 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542830
[email protected]2431756e2010-09-29 20:26:132831 handle_b[1].socket()->Disconnect();
2832 handle_b[1].Reset();
2833 handle_a[1].socket()->Disconnect();
2834 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542835
2836 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012837 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2838 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542839 }
2840}
2841
[email protected]fd4fe0b2010-02-08 23:02:152842TEST_F(ClientSocketPoolBaseTest,
2843 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2844 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2845
2846 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2847
Matt Menkec6b3edf72019-03-19 17:00:392848 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2849 IsError(ERR_IO_PENDING));
2850 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2851 IsError(ERR_IO_PENDING));
2852 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2853 IsError(ERR_IO_PENDING));
2854 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2855 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152856
robpercival214763f2016-07-01 23:27:012857 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2858 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132859 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152860
2861 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132862 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012863 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152864
[email protected]2431756e2010-09-29 20:26:132865 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012866 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132867 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152868
2869 EXPECT_EQ(1, GetOrderOfRequest(1));
2870 EXPECT_EQ(2, GetOrderOfRequest(2));
2871 EXPECT_EQ(3, GetOrderOfRequest(3));
2872 EXPECT_EQ(4, GetOrderOfRequest(4));
2873
2874 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132875 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152876}
2877
[email protected]6ecf2b92011-12-15 01:14:522878class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042879 public:
Matt Menke9fa17d52019-03-25 19:12:262880 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132881 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182882 bool reset_releasing_handle)
2883 : pool_(pool),
2884 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042885 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522886
Chris Watkins7a41d3552017-12-01 02:13:272887 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042888
2889 ClientSocketHandle* handle() { return &handle_; }
2890
Bence Béky8ddc2492018-06-13 01:02:042891 CompletionOnceCallback callback() {
2892 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2893 base::Unretained(this));
2894 }
[email protected]4f1e4982010-03-02 18:31:042895
2896 private:
[email protected]6ecf2b92011-12-15 01:14:522897 void OnComplete(int result) {
2898 SetResult(result);
2899 if (reset_releasing_handle_)
2900 handle_.Reset();
2901
Matt Menkec6b3edf72019-03-19 17:00:392902 EXPECT_EQ(
2903 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032904 handle2_.Init(
2905 TestGroupId("a"),
2906 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:282907 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032908 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2909 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522910 }
2911
Matt Menke9fa17d52019-03-25 19:12:262912 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182913 int expected_result_;
2914 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042915 ClientSocketHandle handle_;
2916 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042917};
2918
[email protected]e60e47a2010-07-14 03:37:182919
2920TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2921 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2922
Matt Menkec6b3edf72019-03-19 17:00:392923 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2924 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2925 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182926
[email protected]2431756e2010-09-29 20:26:132927 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182928 client_socket_factory_.allocation_count());
2929
2930 connect_job_factory_->set_job_type(
2931 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2932 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282933 EXPECT_EQ(ERR_IO_PENDING,
2934 req.handle()->Init(
2935 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2936 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2937 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2938 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182939 // The next job should complete synchronously
2940 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2941
robpercival214763f2016-07-01 23:27:012942 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182943 EXPECT_FALSE(req.handle()->is_initialized());
2944 EXPECT_FALSE(req.handle()->socket());
2945 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512946 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182947}
2948
[email protected]b6501d3d2010-06-03 23:53:342949// http://crbug.com/44724 regression test.
2950// We start releasing the pool when we flush on network change. When that
2951// happens, the only active references are in the ClientSocketHandles. When a
2952// ConnectJob completes and calls back into the last ClientSocketHandle, that
2953// callback can release the last reference and delete the pool. After the
2954// callback finishes, we go back to the stack frame within the now-deleted pool.
2955// Executing any code that refers to members of the now-deleted pool can cause
2956// crashes.
2957TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2958 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2959 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2960
2961 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522962 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502963 EXPECT_EQ(
2964 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282965 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2966 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2967 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2968 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342969
Matt Menke433de6d2020-03-04 00:24:112970 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]b6501d3d2010-06-03 23:53:342971
2972 // We'll call back into this now.
2973 callback.WaitForResult();
2974}
2975
[email protected]a7e38572010-06-07 18:22:242976TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2977 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2978 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2979
2980 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522981 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502982 EXPECT_EQ(
2983 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282984 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2985 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2986 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2987 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012988 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242989 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:112990 NetLogSource source = handle.socket()->NetLog().source();
[email protected]a7e38572010-06-07 18:22:242991
Matt Menke433de6d2020-03-04 00:24:112992 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]a7e38572010-06-07 18:22:242993
2994 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282995 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242996
Matt Menke28ac03e2019-02-25 22:25:502997 EXPECT_EQ(
2998 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282999 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3000 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3001 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3002 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013003 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243004 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113005
3006 ExpectSocketClosedWithReason(
3007 source, TransportClientSocketPool::kSocketGenerationOutOfDate);
[email protected]a7e38572010-06-07 18:22:243008}
3009
[email protected]6ecf2b92011-12-15 01:14:523010class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:143011 public:
Matt Menke9fa17d52019-03-25 19:12:263012 ConnectWithinCallback(
3013 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:193014 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:263015 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:393016 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:143017
Chris Watkins7a41d3552017-12-01 02:13:273018 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:143019
3020 int WaitForNestedResult() {
3021 return nested_callback_.WaitForResult();
3022 }
3023
Bence Béky8ddc2492018-06-13 01:02:043024 CompletionOnceCallback callback() {
3025 return base::BindOnce(&ConnectWithinCallback::OnComplete,
3026 base::Unretained(this));
3027 }
[email protected]6ecf2b92011-12-15 01:14:523028
[email protected]06f92462010-08-31 19:24:143029 private:
[email protected]6ecf2b92011-12-15 01:14:523030 void OnComplete(int result) {
3031 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:283032 EXPECT_EQ(
3033 ERR_IO_PENDING,
3034 handle_.Init(group_id_, params_, base::nullopt, DEFAULT_PRIORITY,
3035 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3036 nested_callback_.callback(),
3037 ClientSocketPool::ProxyAuthCallback(), pool_,
3038 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:523039 }
3040
Matt Menkec6b3edf72019-03-19 17:00:393041 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:193042 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:263043 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:143044 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:523045 TestCompletionCallback nested_callback_;
3046
3047 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:143048};
3049
3050TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
3051 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3052
3053 // First job will be waiting until it gets aborted.
3054 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3055
3056 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:393057 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:503058 EXPECT_EQ(
3059 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283060 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3061 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3062 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3063 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:143064
3065 // Second job will be started during the first callback, and will
3066 // asynchronously complete with OK.
3067 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menke433de6d2020-03-04 00:24:113068 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
robpercival214763f2016-07-01 23:27:013069 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
3070 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:143071}
3072
Matt Menke141b87f22019-01-30 02:43:033073TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:263074 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3075 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033076
3077 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3078 ClientSocketHandle handle;
3079 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503080 EXPECT_EQ(
3081 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283082 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3083 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3084 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3085 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033086 // The backup timer fires but doesn't start a new ConnectJob while resolving
3087 // the hostname.
3088 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3089 FastForwardBy(base::TimeDelta::FromMilliseconds(
3090 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3091 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3092
3093 // Once the ConnectJob has finished resolving the hostname, the backup timer
3094 // will create a ConnectJob when it fires.
3095 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
3096 FastForwardBy(base::TimeDelta::FromMilliseconds(
3097 ClientSocketPool::kMaxConnectRetryIntervalMs));
3098 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3099}
3100
3101// Test that no backup socket is created when a ConnectJob connects before it
3102// completes.
3103TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263104 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3105 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033106
3107 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3108 ClientSocketHandle handle;
3109 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503110 EXPECT_EQ(
3111 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283112 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3113 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3114 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3115 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033116 // The backup timer fires but doesn't start a new ConnectJob while resolving
3117 // the hostname.
3118 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3119 FastForwardBy(base::TimeDelta::FromMilliseconds(
3120 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3121 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3122
3123 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3124 client_socket_factory_.SetJobHasEstablishedConnection(0);
3125 FastForwardBy(base::TimeDelta::FromMilliseconds(
3126 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3127 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3128}
3129
[email protected]25eea382010-07-10 23:55:263130// Cancel a pending socket request while we're at max sockets,
3131// and verify that the backup socket firing doesn't cause a crash.
3132TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3133 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263134 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3135 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263136
[email protected]4baaf9d2010-08-31 15:15:443137 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3138 // timer.
[email protected]25eea382010-07-10 23:55:263139 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3140 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523141 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503142 EXPECT_EQ(
3143 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283144 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3145 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3146 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3147 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263148
3149 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3150 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3151 ClientSocketHandle handles[kDefaultMaxSockets];
3152 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:523153 TestCompletionCallback callback;
Matt Menkef09e64c2019-04-23 22:16:283154 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, base::nullopt,
3155 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203156 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503157 callback.callback(),
3158 ClientSocketPool::ProxyAuthCallback(),
3159 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263160 }
3161
fdoray5eeb7642016-06-22 16:11:283162 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263163
3164 // Cancel the pending request.
3165 handle.Reset();
3166
3167 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453168 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003169 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263170
[email protected]25eea382010-07-10 23:55:263171 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3172}
3173
[email protected]3f00be82010-09-27 19:50:023174TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263175 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3176 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443177
3178 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3179 // timer.
3180 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3181 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523182 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503183 EXPECT_EQ(
3184 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283185 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3186 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3187 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3188 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263189 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3190 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3191 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3192 TestGroupId("bar")));
3193 EXPECT_EQ(
3194 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443195
3196 // Cancel the socket request. This should cancel the backup timer. Wait for
3197 // the backup time to see if it indeed got canceled.
3198 handle.Reset();
3199 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453200 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003201 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263202 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3203 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443204}
3205
[email protected]3f00be82010-09-27 19:50:023206TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263207 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3208 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023209
3210 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3211 // timer.
3212 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3213 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523214 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503215 EXPECT_EQ(
3216 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283217 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3218 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3219 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3220 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023221 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3222 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523223 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203224 EXPECT_EQ(
3225 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283226 handle2.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3227 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503228 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3229 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263230 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3231 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023232
3233 // Cancel request 1 and then complete request 2. With the requests finished,
3234 // the backup timer should be cancelled.
3235 handle.Reset();
robpercival214763f2016-07-01 23:27:013236 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023237 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453238 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003239 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023240}
3241
[email protected]eb5a99382010-07-11 03:18:263242// Test delayed socket binding for the case where we have two connects,
3243// and while one is waiting on a connect, the other frees up.
3244// The socket waiting on a connect should switch immediately to the freed
3245// up socket.
3246TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3247 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3248 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3249
3250 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523251 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503252 EXPECT_EQ(
3253 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283254 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3255 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503256 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3257 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013258 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263259
3260 // No idle sockets, no pending jobs.
3261 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263262 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263263
3264 // Create a second socket to the same host, but this one will wait.
3265 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3266 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503267 EXPECT_EQ(
3268 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283269 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3270 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503271 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3272 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263273 // No idle sockets, and one connecting job.
3274 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263275 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263276
3277 // Return the first handle to the pool. This will initiate the delayed
3278 // binding.
3279 handle1.Reset();
3280
fdoray5eeb7642016-06-22 16:11:283281 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263282
3283 // Still no idle sockets, still one pending connect job.
3284 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263285 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263286
3287 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013288 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263289
3290 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263291 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263292
3293 // Finally, signal the waiting Connect.
3294 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263295 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263296
fdoray5eeb7642016-06-22 16:11:283297 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263298}
3299
3300// Test delayed socket binding when a group is at capacity and one
3301// of the group's sockets frees up.
3302TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3303 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3304 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3305
3306 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523307 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503308 EXPECT_EQ(
3309 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283310 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3311 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503312 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3313 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013314 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263315
3316 // No idle sockets, no pending jobs.
3317 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263318 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263319
3320 // Create a second socket to the same host, but this one will wait.
3321 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3322 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503323 EXPECT_EQ(
3324 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283325 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3326 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503327 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3328 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263329 // No idle sockets, and one connecting job.
3330 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263331 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263332
3333 // Return the first handle to the pool. This will initiate the delayed
3334 // binding.
3335 handle1.Reset();
3336
fdoray5eeb7642016-06-22 16:11:283337 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263338
3339 // Still no idle sockets, still one pending connect job.
3340 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263341 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263342
3343 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013344 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263345
3346 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263347 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263348
3349 // Finally, signal the waiting Connect.
3350 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263351 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263352
fdoray5eeb7642016-06-22 16:11:283353 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263354}
3355
3356// Test out the case where we have one socket connected, one
3357// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513358// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263359// should complete, by taking the first socket's idle socket.
3360TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3361 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3362 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3363
3364 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523365 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503366 EXPECT_EQ(
3367 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283368 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3369 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503370 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3371 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013372 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263373
3374 // No idle sockets, no pending jobs.
3375 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263376 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263377
3378 // Create a second socket to the same host, but this one will wait.
3379 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3380 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503381 EXPECT_EQ(
3382 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283383 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3384 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503385 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3386 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263387 // No idle sockets, and one connecting job.
3388 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263389 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263390
3391 // Return the first handle to the pool. This will initiate the delayed
3392 // binding.
3393 handle1.Reset();
3394
fdoray5eeb7642016-06-22 16:11:283395 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263396
3397 // Still no idle sockets, still one pending connect job.
3398 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263399 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263400
3401 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013402 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263403
3404 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263405 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263406
3407 // Finally, signal the waiting Connect.
3408 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263409 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263410
fdoray5eeb7642016-06-22 16:11:283411 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263412}
3413
[email protected]2abfe90a2010-08-25 17:49:513414// Cover the case where on an available socket slot, we have one pending
3415// request that completes synchronously, thereby making the Group empty.
3416TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3417 const int kUnlimitedSockets = 100;
3418 const int kOneSocketPerGroup = 1;
3419 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3420
3421 // Make the first request asynchronous fail.
3422 // This will free up a socket slot later.
3423 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3424
3425 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523426 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203427 EXPECT_EQ(
3428 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283429 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3430 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503431 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3432 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263433 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513434
3435 // Make the second request synchronously fail. This should make the Group
3436 // empty.
3437 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3438 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523439 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513440 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3441 // when created.
tfarina428341112016-09-22 13:38:203442 EXPECT_EQ(
3443 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283444 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3445 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503446 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3447 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513448
Matt Menke9fa17d52019-03-25 19:12:263449 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513450
robpercival214763f2016-07-01 23:27:013451 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3452 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263453 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513454}
3455
[email protected]e1b54dc2010-10-06 21:27:223456TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3457 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3458
3459 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3460
3461 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523462 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203463 EXPECT_EQ(
3464 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283465 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3466 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503467 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3468 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223469
3470 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523471 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203472 EXPECT_EQ(
3473 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283474 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3475 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503476 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3477 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223478 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523479 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203480 EXPECT_EQ(
3481 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283482 handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3483 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503484 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3485 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223486
robpercival214763f2016-07-01 23:27:013487 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3488 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3489 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223490
3491 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353492 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383493 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353494 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383495 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223496
3497 handle1.Reset();
3498 handle2.Reset();
3499 handle3.Reset();
3500
Matt Menkec6b3edf72019-03-19 17:00:393501 EXPECT_EQ(OK, handle1.Init(
Matt Menkef09e64c2019-04-23 22:16:283502 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3503 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393504 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3505 pool_.get(), NetLogWithSource()));
3506 EXPECT_EQ(OK, handle2.Init(
Matt Menkef09e64c2019-04-23 22:16:283507 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3508 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393509 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3510 pool_.get(), NetLogWithSource()));
3511 EXPECT_EQ(OK, handle3.Init(
Matt Menkef09e64c2019-04-23 22:16:283512 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3513 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393514 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3515 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223516
3517 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3518 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3519 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3520}
3521
[email protected]2c2bef152010-10-13 00:55:033522TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3523 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3524 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3525
Matt Menkef09e64c2019-04-23 22:16:283526 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3527 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033528
Matt Menke9fa17d52019-03-25 19:12:263529 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3530 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3531 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3532 TestGroupId("a")));
3533 EXPECT_EQ(2u,
3534 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393535 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033536
3537 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523538 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203539 EXPECT_EQ(
3540 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283541 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3542 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503543 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3544 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033545
3546 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523547 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203548 EXPECT_EQ(
3549 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283550 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3551 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503552 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3553 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033554
Matt Menke9fa17d52019-03-25 19:12:263555 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3556 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3557 TestGroupId("a")));
3558 EXPECT_EQ(0u,
3559 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393560 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033561
robpercival214763f2016-07-01 23:27:013562 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3563 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033564 handle1.Reset();
3565 handle2.Reset();
3566
Matt Menke9fa17d52019-03-25 19:12:263567 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3568 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3569 TestGroupId("a")));
3570 EXPECT_EQ(0u,
3571 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393572 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033573}
3574
3575TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3576 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3577 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3578
3579 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523580 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203581 EXPECT_EQ(
3582 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283583 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3584 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503585 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3586 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033587
Matt Menke9fa17d52019-03-25 19:12:263588 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3589 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3590 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3591 TestGroupId("a")));
3592 EXPECT_EQ(0u,
3593 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393594 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033595
Matt Menkef09e64c2019-04-23 22:16:283596 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3597 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033598
Matt Menke9fa17d52019-03-25 19:12:263599 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3600 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3601 TestGroupId("a")));
3602 EXPECT_EQ(1u,
3603 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393604 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033605
3606 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523607 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203608 EXPECT_EQ(
3609 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283610 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3611 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503612 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3613 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033614
Matt Menke9fa17d52019-03-25 19:12:263615 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3616 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3617 TestGroupId("a")));
3618 EXPECT_EQ(0u,
3619 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393620 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033621
robpercival214763f2016-07-01 23:27:013622 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3623 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033624 handle1.Reset();
3625 handle2.Reset();
3626
Matt Menke9fa17d52019-03-25 19:12:263627 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3628 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3629 TestGroupId("a")));
3630 EXPECT_EQ(0u,
3631 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393632 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033633}
3634
3635TEST_F(ClientSocketPoolBaseTest,
3636 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3637 CreatePool(4, 4);
3638 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3639
3640 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523641 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203642 EXPECT_EQ(
3643 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283644 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3645 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503646 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3647 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033648
3649 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523650 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203651 EXPECT_EQ(
3652 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283653 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3654 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503655 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3656 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033657
3658 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523659 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203660 EXPECT_EQ(
3661 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283662 handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3663 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503664 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3665 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033666
Matt Menke9fa17d52019-03-25 19:12:263667 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3668 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3669 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3670 TestGroupId("a")));
3671 EXPECT_EQ(0u,
3672 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393673 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033674
Matt Menkef09e64c2019-04-23 22:16:283675 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3676 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033677
Matt Menke9fa17d52019-03-25 19:12:263678 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3679 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3680 TestGroupId("a")));
3681 EXPECT_EQ(0u,
3682 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393683 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033684
robpercival214763f2016-07-01 23:27:013685 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3686 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3687 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033688 handle1.Reset();
3689 handle2.Reset();
3690 handle3.Reset();
3691
Matt Menke9fa17d52019-03-25 19:12:263692 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3693 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3694 TestGroupId("a")));
3695 EXPECT_EQ(0u,
3696 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393697 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033698}
3699
3700TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3701 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3702 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3703
Matt Menke9fa17d52019-03-25 19:12:263704 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033705
Matt Menkef09e64c2019-04-23 22:16:283706 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3707 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033708
Matt Menke9fa17d52019-03-25 19:12:263709 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433710 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393711 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263712 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3713 EXPECT_EQ(
3714 kDefaultMaxSockets,
3715 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3716 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433717 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263718 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3719 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033720
Matt Menke9fa17d52019-03-25 19:12:263721 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033722
Matt Menkef09e64c2019-04-23 22:16:283723 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3724 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033725
Matt Menke9fa17d52019-03-25 19:12:263726 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033727}
3728
3729TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3730 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3731 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3732
Matt Menke9fa17d52019-03-25 19:12:263733 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033734
Matt Menkef09e64c2019-04-23 22:16:283735 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3736 kDefaultMaxSockets - 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033737
Matt Menke9fa17d52019-03-25 19:12:263738 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433739 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393740 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263741 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3742 EXPECT_EQ(
3743 kDefaultMaxSockets - 1,
3744 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3745 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433746 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263747 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3748 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483749 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033750
Matt Menke9fa17d52019-03-25 19:12:263751 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033752
Matt Menkef09e64c2019-04-23 22:16:283753 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3754 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033755
Matt Menke9fa17d52019-03-25 19:12:263756 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3757 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483758 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033759}
3760
3761TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3762 CreatePool(4, 4);
3763 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3764
3765 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523766 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203767 EXPECT_EQ(
3768 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283769 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3770 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503771 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3772 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013773 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033774 handle1.Reset();
3775
Matt Menke9fa17d52019-03-25 19:12:263776 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3777 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3778 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3779 TestGroupId("a")));
3780 EXPECT_EQ(0u,
3781 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393782 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033783
Matt Menkef09e64c2019-04-23 22:16:283784 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3785 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033786
Matt Menke9fa17d52019-03-25 19:12:263787 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3788 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3789 TestGroupId("a")));
3790 EXPECT_EQ(1u,
3791 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393792 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033793}
3794
3795TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3796 CreatePool(4, 4);
3797 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3798
3799 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523800 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203801 EXPECT_EQ(
3802 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283803 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3804 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503805 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3806 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013807 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033808
Matt Menke9fa17d52019-03-25 19:12:263809 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3810 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3811 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3812 TestGroupId("a")));
3813 EXPECT_EQ(0u,
3814 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393815 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263816 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033817
Matt Menkef09e64c2019-04-23 22:16:283818 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3819 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033820
Matt Menke9fa17d52019-03-25 19:12:263821 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3822 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3823 TestGroupId("a")));
3824 EXPECT_EQ(1u,
3825 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393826 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263827 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033828}
3829
3830TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3831 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3832 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3833
Matt Menkef09e64c2019-04-23 22:16:283834 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3835 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033836
Matt Menke9fa17d52019-03-25 19:12:263837 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3838 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3839 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3840 TestGroupId("a")));
3841 EXPECT_EQ(0u,
3842 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433843 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393844 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033845
Matt Menkef09e64c2019-04-23 22:16:283846 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3847 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033848
Matt Menke9fa17d52019-03-25 19:12:263849 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3850 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3851 TestGroupId("b")));
3852 EXPECT_EQ(0u,
3853 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433854 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393855 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033856}
3857
[email protected]3c819f522010-12-02 02:03:123858TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3859 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3860 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3861
Matt Menkef09e64c2019-04-23 22:16:283862 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3863 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123864
Matt Menke9fa17d52019-03-25 19:12:263865 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523866
3867 connect_job_factory_->set_job_type(
3868 TestConnectJob::kMockAdditionalErrorStateJob);
Matt Menkef09e64c2019-04-23 22:16:283869 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3870 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523871
Matt Menke9fa17d52019-03-25 19:12:263872 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123873}
3874
[email protected]8159a1c2012-06-07 00:00:103875TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033876 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433877 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033878
Matt Menkef09e64c2019-04-23 22:16:283879 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3880 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033881
Matt Menke9fa17d52019-03-25 19:12:263882 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3883 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3884 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3885 TestGroupId("a")));
3886 EXPECT_EQ(2u,
3887 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3888 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393889 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033890
Matt Menkef09e64c2019-04-23 22:16:283891 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3892 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263893 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3894 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3895 TestGroupId("a")));
3896 EXPECT_EQ(2u,
3897 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3898 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393899 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033900
3901 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523902 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203903 EXPECT_EQ(
3904 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283905 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3906 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503907 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3908 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433909
3910 client_socket_factory_.SignalJob(0);
3911 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3912
Matt Menke9fa17d52019-03-25 19:12:263913 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3914 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3915 TestGroupId("a")));
3916 EXPECT_EQ(1u,
3917 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3918 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393919 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033920
3921 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523922 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433923 EXPECT_EQ(
3924 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283925 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3926 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503927 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3928 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433929 client_socket_factory_.SignalJob(0);
3930 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033931
Matt Menke9fa17d52019-03-25 19:12:263932 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3933 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3934 TestGroupId("a")));
3935 EXPECT_EQ(0u,
3936 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3937 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393938 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103939
[email protected]2c2bef152010-10-13 00:55:033940 handle1.Reset();
3941 handle2.Reset();
3942
Matt Menke9fa17d52019-03-25 19:12:263943 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3944 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3945 TestGroupId("a")));
3946 EXPECT_EQ(0u,
3947 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3948 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393949 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033950
Matt Menkef09e64c2019-04-23 22:16:283951 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3952 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263953 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3954 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3955 TestGroupId("a")));
3956 EXPECT_EQ(0u,
3957 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3958 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393959 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033960}
3961
3962TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3963 CreatePool(4, 4);
3964 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3965
Matt Menkef09e64c2019-04-23 22:16:283966 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3967 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033968
Matt Menke9fa17d52019-03-25 19:12:263969 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3970 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3971 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3972 TestGroupId("a")));
3973 EXPECT_EQ(1u,
3974 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393975 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033976
Matt Menkef09e64c2019-04-23 22:16:283977 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3978 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263979 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3980 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3981 TestGroupId("a")));
3982 EXPECT_EQ(2u,
3983 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393984 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033985
Matt Menkef09e64c2019-04-23 22:16:283986 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 3,
3987 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263988 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3989 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3990 TestGroupId("a")));
3991 EXPECT_EQ(3u,
3992 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393993 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033994
Matt Menkef09e64c2019-04-23 22:16:283995 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3996 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263997 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3998 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3999 TestGroupId("a")));
4000 EXPECT_EQ(3u,
4001 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394002 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034003}
4004
4005TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
4006 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434007 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:034008
Matt Menkef09e64c2019-04-23 22:16:284009 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4010 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:034011
Matt Menke9fa17d52019-03-25 19:12:264012 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4013 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4014 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4015 TestGroupId("a")));
4016 EXPECT_EQ(1u,
4017 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394018 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034019
4020 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524021 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204022 EXPECT_EQ(
4023 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284024 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4025 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504026 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4027 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034028
Matt Menke9fa17d52019-03-25 19:12:264029 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4030 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4031 TestGroupId("a")));
4032 EXPECT_EQ(0u,
4033 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394034 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034035
Lily Chenecebf932018-11-02 17:15:434036 client_socket_factory_.SignalJobs();
4037 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4038
Matt Menke9fa17d52019-03-25 19:12:264039 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4040 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4041 TestGroupId("a")));
4042 EXPECT_EQ(0u,
4043 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394044 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264045 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034046
[email protected]0dc88b32014-03-26 20:12:284047 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:484048 // starts, it has a connect start time.
4049 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:034050 handle1.Reset();
4051
Matt Menkec6b3edf72019-03-19 17:00:394052 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034053}
4054
[email protected]034df0f32013-01-07 23:17:484055// Checks that fully connected preconnect jobs have no connect times, and are
4056// marked as reused.
4057TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
4058 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4059 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkef09e64c2019-04-23 22:16:284060 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4061 NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:484062
Matt Menke9fa17d52019-03-25 19:12:264063 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4064 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4065 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4066 TestGroupId("a")));
4067 EXPECT_EQ(0u,
4068 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394069 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484070
4071 ClientSocketHandle handle;
4072 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394073 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:284074 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4075 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394076 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4077 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484078
4079 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394080 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484081
4082 TestLoadTimingInfoConnectedReused(handle);
4083 handle.Reset();
4084 TestLoadTimingInfoNotConnected(handle);
4085}
4086
[email protected]dcbe168a2010-12-02 03:14:464087// http://crbug.com/64940 regression test.
4088TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4089 const int kMaxTotalSockets = 3;
4090 const int kMaxSocketsPerGroup = 2;
4091 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434092 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464093
Matt Menkef6edce752019-03-19 17:21:564094 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464095 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4096
4097 // Set up one idle socket in "a".
4098 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524099 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204100 EXPECT_EQ(
4101 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284102 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4103 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504104 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4105 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264106 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4107 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4108 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4109 TestGroupId("a")));
4110 EXPECT_EQ(0u,
4111 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394112 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464113
Lily Chenecebf932018-11-02 17:15:434114 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014115 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264116 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4117 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4118 TestGroupId("a")));
4119 EXPECT_EQ(0u,
4120 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4121 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434122
[email protected]dcbe168a2010-12-02 03:14:464123 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394124 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464125
4126 // Set up two active sockets in "b".
4127 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524128 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204129 EXPECT_EQ(
4130 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284131 handle1.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
4132 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504133 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4134 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204135 EXPECT_EQ(
4136 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284137 handle2.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
4138 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504139 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4140 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464141
Matt Menke9fa17d52019-03-25 19:12:264142 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4143 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4144 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4145 TestGroupId("b")));
4146 EXPECT_EQ(0u,
4147 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394148 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434149
4150 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014151 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4152 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394153 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264154 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4155 TestGroupId("b")));
4156 EXPECT_EQ(0u,
4157 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4158 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464159
4160 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4161 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4162 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4163 // sockets for "a", and "b" should still have 2 active sockets.
4164
Matt Menkef09e64c2019-04-23 22:16:284165 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
4166 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264167 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4168 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4169 TestGroupId("a")));
4170 EXPECT_EQ(0u,
4171 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394172 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264173 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4174 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4175 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4176 TestGroupId("b")));
4177 EXPECT_EQ(0u,
4178 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394179 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264180 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464181
4182 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4183 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4184 // "a" should result in closing 1 for "b".
4185 handle1.Reset();
4186 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394187 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264188 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464189
Matt Menkef09e64c2019-04-23 22:16:284190 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
4191 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264192 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4193 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4194 TestGroupId("a")));
4195 EXPECT_EQ(1u,
4196 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394197 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264198 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4199 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4200 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4201 TestGroupId("b")));
4202 EXPECT_EQ(0u,
4203 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394204 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264205 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464206}
4207
[email protected]b7b8be42011-07-12 12:46:414208TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264209 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4210 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074211
4212 // Make the ConnectJob hang until it times out, shorten the timeout.
4213 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4214 connect_job_factory_->set_timeout_duration(
4215 base::TimeDelta::FromMilliseconds(500));
Matt Menkef09e64c2019-04-23 22:16:284216 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4217 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264218 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4219 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4220 TestGroupId("a")));
4221 EXPECT_EQ(1u,
4222 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394223 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074224
[email protected]b7b8be42011-07-12 12:46:414225 // Verify the backup timer doesn't create a backup job, by making
4226 // the backup job a pending job instead of a waiting job, so it
4227 // *would* complete if it were created.
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594228 base::RunLoop loop;
[email protected]a9fc8fc2011-05-10 02:41:074229 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454230 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Lukasz Krakowiak855292082020-06-19 12:43:584231 FROM_HERE, loop.QuitClosure(), base::TimeDelta::FromSeconds(1));
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594232 loop.Run();
Matt Menke9fa17d52019-03-25 19:12:264233 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074234}
4235
[email protected]b7b8be42011-07-12 12:46:414236TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264237 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4238 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074239
4240 // Make the ConnectJob hang forever.
4241 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Matt Menkef09e64c2019-04-23 22:16:284242 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4243 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264244 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4245 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4246 TestGroupId("a")));
4247 EXPECT_EQ(1u,
4248 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394249 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284250 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074251
4252 // Make the backup job be a pending job, so it completes normally.
4253 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4254 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524255 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504256 EXPECT_EQ(
4257 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284258 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4259 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4260 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4261 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414262 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264263 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4264 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4265 TestGroupId("a")));
4266 EXPECT_EQ(0u,
4267 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394268 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264269 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014270 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074271
4272 // The hung connect job should still be there, but everything else should be
4273 // complete.
Matt Menke9fa17d52019-03-25 19:12:264274 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4275 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4276 TestGroupId("a")));
4277 EXPECT_EQ(1u,
4278 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394279 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264280 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074281}
4282
[email protected]0dc88b32014-03-26 20:12:284283// Tests that a preconnect that starts out with unread data can still be used.
4284// http://crbug.com/334467
4285TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4286 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4287 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4288
Matt Menkef09e64c2019-04-23 22:16:284289 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4290 NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284291
Matt Menke9fa17d52019-03-25 19:12:264292 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4293 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4294 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4295 TestGroupId("a")));
4296 EXPECT_EQ(0u,
4297 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394298 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284299
4300 // Fail future jobs to be sure that handle receives the preconnected socket
4301 // rather than closing it and making a new one.
4302 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4303 ClientSocketHandle handle;
4304 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394305 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:284306 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4307 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394308 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4309 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284310
Matt Menke9fa17d52019-03-25 19:12:264311 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4312 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4313 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4314 TestGroupId("a")));
4315 EXPECT_EQ(0u,
4316 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394317 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264318 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284319
4320 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354321 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284322
4323 TestLoadTimingInfoConnectedReused(handle);
4324 handle.Reset();
4325
4326 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394327 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284328}
4329
Lily Chenecebf932018-11-02 17:15:434330TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4331 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4332 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4333
4334 ClientSocketHandle handle1;
4335 TestCompletionCallback callback1;
4336 EXPECT_EQ(
4337 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284338 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4339 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504340 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4341 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434342
Matt Menke9fa17d52019-03-25 19:12:264343 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4344 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4345 TestGroupId("a")));
4346 EXPECT_EQ(0u,
4347 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394348 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434349
Matt Menkec6b3edf72019-03-19 17:00:394350 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4351 &handle1));
Lily Chenecebf932018-11-02 17:15:434352}
4353
4354TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4355 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4356 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4357
4358 ClientSocketHandle handle1;
4359 TestCompletionCallback callback1;
4360 EXPECT_EQ(
4361 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284362 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4363 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504364 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4365 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434366
Matt Menke9fa17d52019-03-25 19:12:264367 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4368 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4369 TestGroupId("a")));
4370 EXPECT_EQ(0u,
4371 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394372 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434373
4374 ClientSocketHandle handle2;
4375 TestCompletionCallback callback2;
4376 EXPECT_EQ(
4377 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284378 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4379 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504380 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4381 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434382
Matt Menke9fa17d52019-03-25 19:12:264383 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4384 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4385 TestGroupId("a")));
4386 EXPECT_EQ(0u,
4387 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394388 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434389
Matt Menkec6b3edf72019-03-19 17:00:394390 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4391 &handle1));
4392 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4393 &handle2));
Lily Chenecebf932018-11-02 17:15:434394
4395 // One job completes. The other request should still have its job.
4396 client_socket_factory_.SignalJob(0);
4397 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4398
Matt Menke9fa17d52019-03-25 19:12:264399 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4400 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4401 TestGroupId("a")));
4402 EXPECT_EQ(0u,
4403 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4404 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394405 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434406
Matt Menkec6b3edf72019-03-19 17:00:394407 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4408 &handle2));
Lily Chenecebf932018-11-02 17:15:434409}
4410
4411TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4412 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4413 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4414
Matt Menkef09e64c2019-04-23 22:16:284415 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4416 NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434417
Matt Menke9fa17d52019-03-25 19:12:264418 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4419 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4420 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4421 TestGroupId("a")));
4422 EXPECT_EQ(1u,
4423 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394424 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434425
4426 ClientSocketHandle handle1;
4427 TestCompletionCallback callback1;
4428 EXPECT_EQ(
4429 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284430 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4431 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504432 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4433 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434434
Matt Menke9fa17d52019-03-25 19:12:264435 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4436 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4437 TestGroupId("a")));
4438 EXPECT_EQ(0u,
4439 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394440 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434441
Matt Menkec6b3edf72019-03-19 17:00:394442 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4443 &handle1));
Lily Chenecebf932018-11-02 17:15:434444}
4445
4446TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4447 CreatePool(kDefaultMaxSockets, 1);
4448 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4449
4450 ClientSocketHandle handle1;
4451 TestCompletionCallback callback1;
4452 EXPECT_EQ(
4453 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284454 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4455 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504456 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4457 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434458
Matt Menke9fa17d52019-03-25 19:12:264459 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4460 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4461 TestGroupId("a")));
4462 EXPECT_EQ(0u,
4463 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394464 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434465
Matt Menkec6b3edf72019-03-19 17:00:394466 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4467 &handle1));
Lily Chenecebf932018-11-02 17:15:434468
4469 // Insert a higher priority request
4470 ClientSocketHandle handle2;
4471 TestCompletionCallback callback2;
4472 EXPECT_EQ(
4473 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284474 handle2.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4475 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504476 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4477 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434478
Matt Menke9fa17d52019-03-25 19:12:264479 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4480 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4481 TestGroupId("a")));
4482 EXPECT_EQ(0u,
4483 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394484 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434485
4486 // The highest priority request should steal the job from the default priority
4487 // request.
Matt Menkec6b3edf72019-03-19 17:00:394488 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4489 &handle2));
4490 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4491 &handle1));
Lily Chenecebf932018-11-02 17:15:434492}
4493
4494TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4495 CreatePool(3, 3);
4496 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4497
4498 ClientSocketHandle handle_lowest;
4499 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284500 EXPECT_EQ(
4501 ERR_IO_PENDING,
4502 handle_lowest.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
4503 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4504 callback_lowest.callback(),
4505 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4506 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434507
Matt Menke9fa17d52019-03-25 19:12:264508 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4509 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4510 TestGroupId("a")));
4511 EXPECT_EQ(0u,
4512 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394513 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434514
4515 ClientSocketHandle handle_highest;
4516 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284517 EXPECT_EQ(
4518 ERR_IO_PENDING,
4519 handle_highest.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4520 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4521 callback_highest.callback(),
4522 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4523 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434524
Matt Menke9fa17d52019-03-25 19:12:264525 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4526 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4527 TestGroupId("a")));
4528 EXPECT_EQ(0u,
4529 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394530 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434531
4532 ClientSocketHandle handle_low;
4533 TestCompletionCallback callback_low;
4534 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284535 handle_low.Init(
4536 TestGroupId("a"), params_, base::nullopt, LOW, SocketTag(),
4537 ClientSocketPool::RespectLimits::ENABLED,
4538 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4539 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434540
Matt Menke9fa17d52019-03-25 19:12:264541 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4542 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4543 TestGroupId("a")));
4544 EXPECT_EQ(0u,
4545 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394546 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434547
4548 ClientSocketHandle handle_lowest2;
4549 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284550 EXPECT_EQ(
4551 ERR_IO_PENDING,
4552 handle_lowest2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
4553 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4554 callback_lowest2.callback(),
4555 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4556 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434557
Matt Menke9fa17d52019-03-25 19:12:264558 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4559 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4560 TestGroupId("a")));
4561 EXPECT_EQ(0u,
4562 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394563 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434564
4565 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394566 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4567 &handle_highest));
4568 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4569 &handle_low));
4570 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4571 &handle_lowest));
4572 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4573 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434574
4575 // Add another request with medium priority. It should steal the job from the
4576 // lowest priority request with a job.
4577 ClientSocketHandle handle_medium;
4578 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284579 EXPECT_EQ(
4580 ERR_IO_PENDING,
4581 handle_medium.Init(TestGroupId("a"), params_, base::nullopt, MEDIUM,
4582 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4583 callback_medium.callback(),
4584 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4585 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434586
Matt Menke9fa17d52019-03-25 19:12:264587 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4588 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4589 TestGroupId("a")));
4590 EXPECT_EQ(0u,
4591 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394592 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4593 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4594 &handle_highest));
4595 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4596 &handle_medium));
4597 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4598 &handle_low));
4599 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4600 &handle_lowest));
4601 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4602 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434603}
4604
4605TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4606 CreatePool(kDefaultMaxSockets, 1);
4607 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4608
4609 ClientSocketHandle handle1;
4610 TestCompletionCallback callback1;
4611 EXPECT_EQ(
4612 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284613 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4614 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504615 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4616 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434617
Matt Menke9fa17d52019-03-25 19:12:264618 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4619 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4620 TestGroupId("a")));
4621 EXPECT_EQ(0u,
4622 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394623 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434624
4625 ClientSocketHandle handle2;
4626 TestCompletionCallback callback2;
4627 EXPECT_EQ(
4628 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284629 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4630 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504631 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4632 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434633
Matt Menke9fa17d52019-03-25 19:12:264634 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4635 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4636 TestGroupId("a")));
4637 EXPECT_EQ(0u,
4638 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394639 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434640
4641 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394642 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4643 &handle1));
4644 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4645 &handle2));
Lily Chenecebf932018-11-02 17:15:434646
4647 // Reprioritizing the second request places it above the first, and it steals
4648 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394649 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4650 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4651 &handle2));
4652 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4653 &handle1));
Lily Chenecebf932018-11-02 17:15:434654}
4655
4656TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4657 CreatePool(kDefaultMaxSockets, 1);
4658 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4659
4660 ClientSocketHandle handle1;
4661 TestCompletionCallback callback1;
4662 EXPECT_EQ(
4663 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284664 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4665 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504666 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4667 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434668
Matt Menke9fa17d52019-03-25 19:12:264669 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4670 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4671 TestGroupId("a")));
4672 EXPECT_EQ(0u,
4673 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394674 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434675
Matt Menkec6b3edf72019-03-19 17:00:394676 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4677 &handle1));
Lily Chenecebf932018-11-02 17:15:434678
4679 ClientSocketHandle handle2;
4680 TestCompletionCallback callback2;
4681 EXPECT_EQ(
4682 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284683 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4684 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504685 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4686 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434687
Matt Menke9fa17d52019-03-25 19:12:264688 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4689 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4690 TestGroupId("a")));
4691 EXPECT_EQ(0u,
4692 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394693 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434694
4695 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394696 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4697 &handle1));
4698 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4699 &handle2));
Lily Chenecebf932018-11-02 17:15:434700
4701 // The second request should get a job upon cancelling the first request.
4702 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264703 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4704 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4705 TestGroupId("a")));
4706 EXPECT_EQ(0u,
4707 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394708 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434709
Matt Menkec6b3edf72019-03-19 17:00:394710 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4711 &handle2));
Lily Chenecebf932018-11-02 17:15:434712}
4713
4714TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4715 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4716 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4717
4718 ClientSocketHandle handle1;
4719 TestCompletionCallback callback1;
4720 EXPECT_EQ(
4721 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284722 handle1.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4723 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504724 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4725 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434726
Matt Menke9fa17d52019-03-25 19:12:264727 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4728 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4729 TestGroupId("a")));
4730 EXPECT_EQ(0u,
4731 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394732 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434733
4734 ClientSocketHandle handle2;
4735 TestCompletionCallback callback2;
4736 EXPECT_EQ(
4737 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284738 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4739 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504740 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4741 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434742
Matt Menke9fa17d52019-03-25 19:12:264743 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4744 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4745 TestGroupId("a")));
4746 EXPECT_EQ(0u,
4747 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394748 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434749
Matt Menkec6b3edf72019-03-19 17:00:394750 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4751 &handle1));
4752 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4753 &handle2));
Lily Chenecebf932018-11-02 17:15:434754
4755 // The lower-priority job completes first. The higher-priority request should
4756 // get the socket, and the lower-priority request should get the remaining
4757 // job.
4758 client_socket_factory_.SignalJob(1);
4759 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264760 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4761 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4762 TestGroupId("a")));
4763 EXPECT_EQ(0u,
4764 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4765 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394766 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434767 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394768 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4769 &handle2));
Lily Chenecebf932018-11-02 17:15:434770}
4771
[email protected]043b68c82013-08-22 23:41:524772class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204773 public:
Matt Menke9fa17d52019-03-25 19:12:264774 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394775 const ClientSocketPool::GroupId& group_id)
4776 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524777 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204778 }
4779
Daniel Cheng4496d0822018-04-26 21:52:154780 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204781
Matt Menke9fa17d52019-03-25 19:12:264782 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504783 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034784 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:284785 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
4786 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4787 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204788 }
4789
Matt Menke9fa17d52019-03-25 19:12:264790 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504791 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034792 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:284793 base::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504794 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4795 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204796 }
4797
4798 bool ReleaseOneConnection() {
4799 if (!handle_.is_initialized() || !can_release_connection_) {
4800 return false;
4801 }
4802 handle_.socket()->Disconnect();
4803 handle_.Reset();
4804 return true;
4805 }
4806
4807 void set_can_release_connection(bool can_release_connection) {
4808 can_release_connection_ = can_release_connection;
4809 }
4810
4811 MOCK_METHOD0(CloseOneIdleConnection, bool());
4812
4813 private:
Matt Menke9fa17d52019-03-25 19:12:264814 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204815 ClientSocketHandle handle_;
4816 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394817 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204818 bool can_release_connection_;
4819};
4820
[email protected]58e562f2013-04-22 17:32:204821// Tests the basic case of closing an idle socket in a higher layered pool when
4822// a new request is issued and the lower layer pool is stalled.
4823TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4824 CreatePool(1, 1);
4825 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4826
Matt Menkec6b3edf72019-03-19 17:00:394827 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014828 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204829 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4830 .WillOnce(Invoke(&mock_layered_pool,
4831 &MockLayeredPool::ReleaseOneConnection));
4832 ClientSocketHandle handle;
4833 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504834 EXPECT_EQ(
4835 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284836 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4837 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4838 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4839 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014840 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204841}
4842
Matt Menke833678642019-03-05 22:05:514843// Tests the case that trying to close an idle socket in a higher layered pool
4844// fails.
4845TEST_F(ClientSocketPoolBaseTest,
4846 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4847 CreatePool(1, 1);
4848 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4849
Matt Menkec6b3edf72019-03-19 17:00:394850 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514851 mock_layered_pool.set_can_release_connection(false);
4852 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4853 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4854 .WillOnce(Invoke(&mock_layered_pool,
4855 &MockLayeredPool::ReleaseOneConnection));
4856 ClientSocketHandle handle;
4857 TestCompletionCallback callback;
4858 EXPECT_EQ(
4859 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284860 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4861 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4862 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4863 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514864 base::RunLoop().RunUntilIdle();
4865 EXPECT_FALSE(callback.have_result());
4866}
4867
[email protected]58e562f2013-04-22 17:32:204868// Same as above, but the idle socket is in the same group as the stalled
4869// socket, and closes the only other request in its group when closing requests
4870// in higher layered pools. This generally shouldn't happen, but it may be
4871// possible if a higher level pool issues a request and the request is
4872// subsequently cancelled. Even if it's not possible, best not to crash.
4873TEST_F(ClientSocketPoolBaseTest,
4874 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4875 CreatePool(2, 2);
4876 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4877
4878 // Need a socket in another group for the pool to be stalled (If a group
4879 // has the maximum number of connections already, it's not stalled).
4880 ClientSocketHandle handle1;
4881 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284882 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4883 DEFAULT_PRIORITY, SocketTag(),
4884 ClientSocketPool::RespectLimits::ENABLED,
4885 callback1.callback(),
4886 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4887 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204888
Matt Menkec6b3edf72019-03-19 17:00:394889 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014890 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204891 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4892 .WillOnce(Invoke(&mock_layered_pool,
4893 &MockLayeredPool::ReleaseOneConnection));
4894 ClientSocketHandle handle;
4895 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284896 EXPECT_EQ(ERR_IO_PENDING,
4897 handle.Init(
4898 TestGroupId("group2"), params_, base::nullopt, DEFAULT_PRIORITY,
4899 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4900 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4901 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014902 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204903}
4904
4905// Tests the case when an idle socket can be closed when a new request is
4906// issued, and the new request belongs to a group that was previously stalled.
4907TEST_F(ClientSocketPoolBaseTest,
4908 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4909 CreatePool(2, 2);
4910 std::list<TestConnectJob::JobType> job_types;
4911 job_types.push_back(TestConnectJob::kMockJob);
4912 job_types.push_back(TestConnectJob::kMockJob);
4913 job_types.push_back(TestConnectJob::kMockJob);
4914 job_types.push_back(TestConnectJob::kMockJob);
4915 connect_job_factory_->set_job_types(&job_types);
4916
4917 ClientSocketHandle handle1;
4918 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284919 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4920 DEFAULT_PRIORITY, SocketTag(),
4921 ClientSocketPool::RespectLimits::ENABLED,
4922 callback1.callback(),
4923 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4924 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204925
Matt Menkec6b3edf72019-03-19 17:00:394926 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014927 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204928 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4929 .WillRepeatedly(Invoke(&mock_layered_pool,
4930 &MockLayeredPool::ReleaseOneConnection));
4931 mock_layered_pool.set_can_release_connection(false);
4932
4933 // The third request is made when the socket pool is in a stalled state.
4934 ClientSocketHandle handle3;
4935 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:284936 EXPECT_EQ(ERR_IO_PENDING,
4937 handle3.Init(
4938 TestGroupId("group3"), params_, base::nullopt, DEFAULT_PRIORITY,
4939 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4940 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4941 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204942
4943 base::RunLoop().RunUntilIdle();
4944 EXPECT_FALSE(callback3.have_result());
4945
4946 // The fourth request is made when the pool is no longer stalled. The third
4947 // request should be serviced first, since it was issued first and has the
4948 // same priority.
4949 mock_layered_pool.set_can_release_connection(true);
4950 ClientSocketHandle handle4;
4951 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:284952 EXPECT_EQ(ERR_IO_PENDING,
4953 handle4.Init(
4954 TestGroupId("group3"), params_, base::nullopt, DEFAULT_PRIORITY,
4955 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4956 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4957 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014958 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204959 EXPECT_FALSE(callback4.have_result());
4960
4961 // Closing a handle should free up another socket slot.
4962 handle1.Reset();
robpercival214763f2016-07-01 23:27:014963 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204964}
4965
4966// Tests the case when an idle socket can be closed when a new request is
4967// issued, and the new request belongs to a group that was previously stalled.
4968//
4969// The two differences from the above test are that the stalled requests are not
4970// in the same group as the layered pool's request, and the the fourth request
4971// has a higher priority than the third one, so gets a socket first.
4972TEST_F(ClientSocketPoolBaseTest,
4973 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4974 CreatePool(2, 2);
4975 std::list<TestConnectJob::JobType> job_types;
4976 job_types.push_back(TestConnectJob::kMockJob);
4977 job_types.push_back(TestConnectJob::kMockJob);
4978 job_types.push_back(TestConnectJob::kMockJob);
4979 job_types.push_back(TestConnectJob::kMockJob);
4980 connect_job_factory_->set_job_types(&job_types);
4981
4982 ClientSocketHandle handle1;
4983 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284984 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4985 DEFAULT_PRIORITY, SocketTag(),
4986 ClientSocketPool::RespectLimits::ENABLED,
4987 callback1.callback(),
4988 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4989 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204990
Matt Menkec6b3edf72019-03-19 17:00:394991 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014992 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204993 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4994 .WillRepeatedly(Invoke(&mock_layered_pool,
4995 &MockLayeredPool::ReleaseOneConnection));
4996 mock_layered_pool.set_can_release_connection(false);
4997
4998 // The third request is made when the socket pool is in a stalled state.
4999 ClientSocketHandle handle3;
5000 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:205001 EXPECT_EQ(
5002 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285003 handle3.Init(TestGroupId("group3"), params_, base::nullopt, MEDIUM,
5004 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505005 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5006 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205007
5008 base::RunLoop().RunUntilIdle();
5009 EXPECT_FALSE(callback3.have_result());
5010
5011 // The fourth request is made when the pool is no longer stalled. This
5012 // request has a higher priority than the third request, so is serviced first.
5013 mock_layered_pool.set_can_release_connection(true);
5014 ClientSocketHandle handle4;
5015 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:205016 EXPECT_EQ(
5017 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285018 handle4.Init(TestGroupId("group3"), params_, base::nullopt, HIGHEST,
5019 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505020 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5021 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015022 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205023 EXPECT_FALSE(callback3.have_result());
5024
5025 // Closing a handle should free up another socket slot.
5026 handle1.Reset();
robpercival214763f2016-07-01 23:27:015027 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205028}
5029
5030TEST_F(ClientSocketPoolBaseTest,
5031 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
5032 CreatePool(1, 1);
5033 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5034
Matt Menkec6b3edf72019-03-19 17:00:395035 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:015036 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205037 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
5038 .WillRepeatedly(Invoke(&mock_layered_pool1,
5039 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:395040 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:015041 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
5042 IsOk());
[email protected]58e562f2013-04-22 17:32:205043 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
5044 .WillRepeatedly(Invoke(&mock_layered_pool2,
5045 &MockLayeredPool::ReleaseOneConnection));
5046 ClientSocketHandle handle;
5047 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:505048 EXPECT_EQ(
5049 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285050 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
5051 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5052 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5053 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015054 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205055}
5056
[email protected]b021ece62013-06-11 11:06:335057// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:155058// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
5059// socket instead of a request with the same priority that was issued earlier,
5060// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:335061TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:335062 CreatePool(1, 1);
5063
5064 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395065 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5066 TestGroupId("a"), MAXIMUM_PRIORITY,
5067 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265068 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335069
5070 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5071
mmenked3641e12016-01-28 16:06:155072 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395073 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155074 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265075 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335076
mmenked3641e12016-01-28 16:06:155077 // Issue a request that ignores the limits, so a new ConnectJob is
5078 // created.
5079 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395080 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155081 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265082 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335083
robpercival214763f2016-07-01 23:27:015084 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335085 EXPECT_FALSE(request(1)->have_result());
5086}
5087
[email protected]c55fabd2013-11-04 23:26:565088// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155089// issued for a request with RespectLimits::DISABLED is not cancelled when a
5090// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565091TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565092 CreatePool(1, 1);
5093
5094 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395095 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5096 TestGroupId("a"), MAXIMUM_PRIORITY,
5097 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265098 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565099
5100 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5101
mmenked3641e12016-01-28 16:06:155102 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395103 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155104 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265105 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565106
mmenked3641e12016-01-28 16:06:155107 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5108 // created.
5109 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395110 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155111 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265112 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335113
mmenked3641e12016-01-28 16:06:155114 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335115 // should not be cancelled.
5116 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265117 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335118
robpercival214763f2016-07-01 23:27:015119 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335120 EXPECT_FALSE(request(1)->have_result());
5121}
5122
Matt Menkeb57663b32019-03-01 17:17:105123TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5124 CreatePool(1, 1);
5125
5126 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5127
5128 ClientSocketHandle handle;
5129 TestCompletionCallback callback;
5130 EXPECT_EQ(
5131 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285132 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
5133 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5134 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5135 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105136
Matt Menke9fa17d52019-03-25 19:12:265137 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105138
5139 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5140 EXPECT_FALSE(handle.is_initialized());
5141 EXPECT_FALSE(handle.socket());
5142
5143 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265144 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105145}
5146
5147class TestAuthHelper {
5148 public:
5149 TestAuthHelper() = default;
5150 ~TestAuthHelper() = default;
5151
Matt Menkec6b3edf72019-03-19 17:00:395152 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195153 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265154 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395155 RequestPriority priority = DEFAULT_PRIORITY,
5156 ClientSocketPool::RespectLimits respect_limits =
5157 ClientSocketPool::RespectLimits::ENABLED,
5158 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105159 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285160 handle_.Init(group_id_in, params, base::nullopt, priority,
5161 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105162 base::BindRepeating(&TestAuthHelper::AuthCallback,
5163 base::Unretained(this)),
5164 pool, NetLogWithSource()));
5165 }
5166
5167 void WaitForAuth() {
5168 run_loop_ = std::make_unique<base::RunLoop>();
5169 run_loop_->Run();
5170 run_loop_.reset();
5171 }
5172
5173 void WaitForAuthAndRestartSync() {
5174 restart_sync_ = true;
5175 WaitForAuth();
5176 restart_sync_ = false;
5177 }
5178
5179 void WaitForAuthAndResetHandleSync() {
5180 reset_handle_sync_ = true;
5181 WaitForAuth();
5182 reset_handle_sync_ = false;
5183 }
5184
5185 void RestartWithAuth() {
5186 DCHECK(restart_with_auth_callback_);
5187 std::move(restart_with_auth_callback_).Run();
5188 }
5189
5190 int WaitForResult() {
5191 int result = callback_.WaitForResult();
5192 // There shouldn't be any callback waiting to be invoked once the request is
5193 // complete.
5194 EXPECT_FALSE(restart_with_auth_callback_);
5195 // The socket should only be initialized on success.
5196 EXPECT_EQ(result == OK, handle_.is_initialized());
5197 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5198 return result;
5199 }
5200
5201 ClientSocketHandle* handle() { return &handle_; }
5202 int auth_count() const { return auth_count_; }
5203 int have_result() const { return callback_.have_result(); }
5204
5205 private:
5206 void AuthCallback(const HttpResponseInfo& response,
5207 HttpAuthController* auth_controller,
5208 base::OnceClosure restart_with_auth_callback) {
5209 EXPECT_FALSE(restart_with_auth_callback_);
5210 EXPECT_TRUE(restart_with_auth_callback);
5211
5212 // Once there's a result, this method shouldn't be invoked again.
5213 EXPECT_FALSE(callback_.have_result());
5214
5215 ++auth_count_;
5216 run_loop_->Quit();
5217 if (restart_sync_) {
5218 std::move(restart_with_auth_callback).Run();
5219 return;
5220 }
5221
5222 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5223
5224 if (reset_handle_sync_) {
5225 handle_.Reset();
5226 return;
5227 }
5228 }
5229
5230 std::unique_ptr<base::RunLoop> run_loop_;
5231 base::OnceClosure restart_with_auth_callback_;
5232
5233 bool restart_sync_ = false;
5234 bool reset_handle_sync_ = false;
5235
5236 ClientSocketHandle handle_;
5237 int auth_count_ = 0;
5238 TestCompletionCallback callback_;
5239
5240 DISALLOW_COPY_AND_ASSIGN(TestAuthHelper);
5241};
5242
5243TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5244 CreatePool(1, 1);
5245 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5246
5247 TestAuthHelper auth_helper;
5248 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265249 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015250 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395251 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105252
5253 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265254 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015255 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395256 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105257
5258 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265259 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015260 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395261 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105262
5263 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5264 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265265 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5266 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395267 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105268 EXPECT_EQ(0, pool_->IdleSocketCount());
5269}
5270
5271TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5272 CreatePool(1, 1);
5273 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5274
5275 TestAuthHelper auth_helper;
5276 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265277 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015278 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395279 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105280
5281 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265282 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015283 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395284 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105285
5286 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5287 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265288 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5289 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395290 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105291 EXPECT_EQ(0, pool_->IdleSocketCount());
5292}
5293
5294TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5295 CreatePool(1, 1);
5296 connect_job_factory_->set_job_type(
5297 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5298
5299 TestAuthHelper auth_helper;
5300 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265301 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105302
5303 auth_helper.WaitForAuth();
5304 auth_helper.RestartWithAuth();
5305 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5306
5307 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265308 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105309 EXPECT_EQ(0, pool_->IdleSocketCount());
5310}
5311
5312TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5313 CreatePool(1, 1);
5314 connect_job_factory_->set_job_type(
5315 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5316
5317 TestAuthHelper auth_helper;
5318 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265319 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105320
5321 auth_helper.WaitForAuthAndRestartSync();
5322 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5323
5324 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265325 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105326 EXPECT_EQ(0, pool_->IdleSocketCount());
5327}
5328
5329TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5330 CreatePool(1, 1);
5331 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5332
5333 TestAuthHelper auth_helper;
5334 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265335 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105336
5337 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265338 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105339
5340 auth_helper.handle()->Reset();
5341
5342 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265343 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105344 EXPECT_EQ(0, pool_->IdleSocketCount());
5345 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5346 EXPECT_FALSE(auth_helper.handle()->socket());
5347}
5348
5349TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5350 CreatePool(1, 1);
5351 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5352
5353 TestAuthHelper auth_helper;
5354 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265355 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105356
5357 auth_helper.WaitForAuthAndResetHandleSync();
5358 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265359 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105360 EXPECT_EQ(0, pool_->IdleSocketCount());
5361 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5362 EXPECT_FALSE(auth_helper.handle()->socket());
5363}
5364
5365TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5366 CreatePool(1, 1);
5367 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5368
5369 TestAuthHelper auth_helper;
5370 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265371 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105372
5373 auth_helper.WaitForAuth();
5374
Matt Menke433de6d2020-03-04 00:24:115375 pool_->FlushWithError(ERR_FAILED, "Network changed");
Matt Menkeb57663b32019-03-01 17:17:105376 base::RunLoop().RunUntilIdle();
5377
5378 // When flushing the socket pool, bound sockets should delay returning the
5379 // error until completion.
5380 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265381 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105382 EXPECT_EQ(0, pool_->IdleSocketCount());
5383
5384 auth_helper.RestartWithAuth();
5385 // The callback should be called asynchronously.
5386 EXPECT_FALSE(auth_helper.have_result());
5387
5388 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265389 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105390 EXPECT_EQ(0, pool_->IdleSocketCount());
5391}
5392
5393TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5394 CreatePool(1, 1);
5395 connect_job_factory_->set_job_type(
5396 TestConnectJob::kMockAuthChallengeTwiceJob);
5397
5398 TestAuthHelper auth_helper;
5399 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265400 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015401 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395402 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105403
5404 auth_helper.WaitForAuth();
5405 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265406 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105407 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015408 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395409 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105410
5411 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265412 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015413 EXPECT_EQ(2, auth_helper.auth_count());
5414 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395415 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015416
Matt Menkeb57663b32019-03-01 17:17:105417 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265418 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105419 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015420 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395421 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105422
5423 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5424 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265425 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5426 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395427 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105428 EXPECT_EQ(0, pool_->IdleSocketCount());
5429}
5430
5431TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5432 CreatePool(1, 1);
5433 connect_job_factory_->set_job_type(
5434 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5435
5436 TestAuthHelper auth_helper;
5437 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265438 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105439
5440 auth_helper.WaitForAuth();
5441 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265442 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105443 EXPECT_EQ(1, auth_helper.auth_count());
5444
5445 auth_helper.WaitForAuth();
5446 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265447 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105448 EXPECT_EQ(2, auth_helper.auth_count());
5449
5450 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5451 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265452 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105453 EXPECT_EQ(0, pool_->IdleSocketCount());
5454}
5455
5456// Makes sure that when a bound request is destroyed, a new ConnectJob is
5457// created, if needed.
5458TEST_F(ClientSocketPoolBaseTest,
5459 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5460 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5461 connect_job_factory_->set_job_type(
5462 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5463
5464 // First request creates a ConnectJob.
5465 TestAuthHelper auth_helper1;
5466 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265467 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105468
5469 // A second request come in, but no new ConnectJob is needed, since the limit
5470 // has been reached.
5471 TestAuthHelper auth_helper2;
5472 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265473 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105474
5475 // Run until the auth callback for the first request is invoked.
5476 auth_helper1.WaitForAuth();
5477 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265478 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5479 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395480 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105481
5482 // Make connect jobs succeed, then cancel the first request, which should
5483 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5484 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5485 auth_helper1.handle()->Reset();
5486 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265487 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105488
5489 // The second ConnectJob should succeed.
5490 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5491 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265492 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105493}
5494
5495// Makes sure that when a bound request is destroyed, a new ConnectJob is
5496// created for another group, if needed.
5497TEST_F(ClientSocketPoolBaseTest,
5498 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5499 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5500 connect_job_factory_->set_job_type(
5501 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5502
5503 // First request creates a ConnectJob.
5504 TestAuthHelper auth_helper1;
5505 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265506 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105507
5508 // A second request come in, but no new ConnectJob is needed, since the limit
5509 // has been reached.
5510 TestAuthHelper auth_helper2;
5511 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395512 ClientSocketPool::RespectLimits::ENABLED,
5513 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265514 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5515 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105516
5517 // Run until the auth callback for the first request is invoked.
5518 auth_helper1.WaitForAuth();
5519 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265520 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5521 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395522 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265523 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5524 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395525 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105526
5527 // Make connect jobs succeed, then cancel the first request, which should
5528 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5529 // other group.
5530 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5531 auth_helper1.handle()->Reset();
5532 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265533 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5534 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105535
5536 // The second ConnectJob should succeed.
5537 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5538 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265539 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5540 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105541}
5542
5543// Test that once an auth challenge is bound, that's the request that gets all
5544// subsequent calls and the socket itself.
5545TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5546 CreatePool(1, 1);
5547 connect_job_factory_->set_job_type(
5548 TestConnectJob::kMockAuthChallengeTwiceJob);
5549
5550 // First request creates a ConnectJob.
5551 TestAuthHelper auth_helper1;
5552 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265553 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105554
5555 // A second, higher priority request is made.
5556 TestAuthHelper auth_helper2;
5557 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265558 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105559
5560 // Run until the auth callback for the second request is invoked.
5561 auth_helper2.WaitForAuth();
5562 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265563 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5564 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395565 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105566
5567 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5568 // ConnectJob.
5569 TestAuthHelper auth_helper3;
5570 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265571 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105572
5573 // Start a higher job that ignores limits, creating a hanging socket. It
5574 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5575 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5576 TestAuthHelper auth_helper4;
5577 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5578 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265579 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105580
5581 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5582 // again.
5583 auth_helper2.RestartWithAuth();
5584 auth_helper2.WaitForAuth();
5585 EXPECT_EQ(0, auth_helper1.auth_count());
5586 EXPECT_FALSE(auth_helper1.have_result());
5587 EXPECT_EQ(2, auth_helper2.auth_count());
5588 EXPECT_FALSE(auth_helper2.have_result());
5589 EXPECT_EQ(0, auth_helper3.auth_count());
5590 EXPECT_FALSE(auth_helper3.have_result());
5591 EXPECT_EQ(0, auth_helper4.auth_count());
5592 EXPECT_FALSE(auth_helper4.have_result());
5593
5594 // Advance auth again, and |auth_helper2| should get the socket.
5595 auth_helper2.RestartWithAuth();
5596 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5597 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5598 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265599 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5600 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105601 EXPECT_EQ(0, auth_helper1.auth_count());
5602 EXPECT_FALSE(auth_helper1.have_result());
5603 EXPECT_EQ(0, auth_helper3.auth_count());
5604 EXPECT_FALSE(auth_helper3.have_result());
5605 EXPECT_EQ(0, auth_helper4.auth_count());
5606 EXPECT_FALSE(auth_helper4.have_result());
5607
5608 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5609 // socket request should be able to claim it.
5610 auth_helper2.handle()->Reset();
5611 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5612 EXPECT_EQ(0, auth_helper1.auth_count());
5613 EXPECT_FALSE(auth_helper1.have_result());
5614 EXPECT_EQ(0, auth_helper3.auth_count());
5615 EXPECT_FALSE(auth_helper3.have_result());
5616 EXPECT_EQ(0, auth_helper4.auth_count());
5617}
5618
David Benjaminbac8dff2019-08-07 01:30:415619enum class RefreshType {
5620 kServer,
5621 kProxy,
5622};
5623
5624// Common base class to test RefreshGroup() when called from either
5625// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5626//
5627// Tests which test behavior specific to one or the other case should use
5628// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5629// when the pool's proxy matches.
5630class ClientSocketPoolBaseRefreshTest
5631 : public ClientSocketPoolBaseTest,
5632 public testing::WithParamInterface<RefreshType> {
5633 public:
5634 void CreatePoolForRefresh(int max_sockets,
5635 int max_sockets_per_group,
5636 bool enable_backup_connect_jobs = false) {
5637 switch (GetParam()) {
5638 case RefreshType::kServer:
5639 CreatePool(max_sockets, max_sockets_per_group,
5640 enable_backup_connect_jobs);
5641 break;
5642 case RefreshType::kProxy:
5643 CreatePoolWithIdleTimeouts(
5644 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5645 ClientSocketPool::used_idle_socket_timeout(),
5646 enable_backup_connect_jobs,
5647 ProxyServer::FromPacString("HTTPS myproxy:70"));
5648 break;
5649 }
5650 }
5651
5652 static ClientSocketPool::GroupId GetGroupId() {
5653 return TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5654 }
5655
David Benjamin6dd7e882019-10-10 02:35:235656 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5657 // Note this GroupId will match GetGroupId() unless
5658 // kPartitionConnectionsByNetworkIsolationKey is enabled.
5659 const auto kOrigin = url::Origin::Create(GURL("https://b/"));
5660 const NetworkIsolationKey kNetworkIsolationKey(kOrigin, kOrigin);
5661 return TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5662 PrivacyMode::PRIVACY_MODE_DISABLED,
5663 kNetworkIsolationKey);
5664 }
5665
David Benjaminbac8dff2019-08-07 01:30:415666 void OnSSLConfigForServerChanged() {
5667 switch (GetParam()) {
5668 case RefreshType::kServer:
5669 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5670 break;
5671 case RefreshType::kProxy:
5672 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5673 break;
5674 }
5675 }
5676};
5677
5678INSTANTIATE_TEST_SUITE_P(RefreshType,
5679 ClientSocketPoolBaseRefreshTest,
5680 ::testing::Values(RefreshType::kServer,
5681 RefreshType::kProxy));
5682
5683TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5684 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5685 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245686
5687 // First job will be waiting until it gets aborted.
5688 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5689
5690 ClientSocketHandle handle;
5691 TestCompletionCallback callback;
5692 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285693 handle.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5694 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5695 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5696 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245697 IsError(ERR_IO_PENDING));
5698
5699 // Switch connect job types, so creating a new ConnectJob will result in
5700 // success.
5701 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5702
David Benjaminbac8dff2019-08-07 01:30:415703 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245704 EXPECT_EQ(OK, callback.WaitForResult());
5705 ASSERT_TRUE(handle.socket());
5706 EXPECT_EQ(0, pool_->IdleSocketCount());
5707 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5708 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5709 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5710 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5711}
5712
David Benjaminbac8dff2019-08-07 01:30:415713TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235714 base::test::ScopedFeatureList feature_list;
5715 feature_list.InitAndEnableFeature(
5716 features::kPartitionConnectionsByNetworkIsolationKey);
5717
David Benjaminbac8dff2019-08-07 01:30:415718 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5719 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235720 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245721
Matt Menkef09e64c2019-04-23 22:16:285722 pool_->RequestSockets(kGroupId, params_, base::nullopt, 2,
5723 NetLogWithSource());
David Benjamin6dd7e882019-10-10 02:35:235724 pool_->RequestSockets(kGroupIdInPartition, params_, base::nullopt, 2,
5725 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245726 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235727 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5728 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245729 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235730 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245731
David Benjaminbac8dff2019-08-07 01:30:415732 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245733 EXPECT_EQ(0, pool_->IdleSocketCount());
5734 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235735 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245736}
5737
5738TEST_F(ClientSocketPoolBaseTest,
5739 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5740 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415741 const ClientSocketPool::GroupId kGroupId =
5742 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5743 const ClientSocketPool::GroupId kOtherGroupId =
5744 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
Matt Menkebf3c767d2019-04-15 23:28:245745
Matt Menkef09e64c2019-04-23 22:16:285746 pool_->RequestSockets(kOtherGroupId, params_, base::nullopt, 2,
5747 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245748 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5749 EXPECT_EQ(2, pool_->IdleSocketCount());
5750 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5751
David Benjaminbac8dff2019-08-07 01:30:415752 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245753 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5754 EXPECT_EQ(2, pool_->IdleSocketCount());
5755 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5756}
5757
David Benjaminbac8dff2019-08-07 01:30:415758TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5759 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5760 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245761
5762 ClientSocketHandle handle;
5763 TestCompletionCallback callback;
5764 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285765 handle.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5766 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5767 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5768 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245769 IsOk());
5770 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5771 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5772
David Benjaminbac8dff2019-08-07 01:30:415773 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245774
5775 handle.Reset();
5776 EXPECT_EQ(0, pool_->IdleSocketCount());
5777 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5778}
5779
5780TEST_F(ClientSocketPoolBaseTest,
5781 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5782 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415783 const ClientSocketPool::GroupId kGroupId =
5784 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5785 const ClientSocketPool::GroupId kOtherGroupId =
5786 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
Matt Menkebf3c767d2019-04-15 23:28:245787
5788 ClientSocketHandle handle;
5789 TestCompletionCallback callback;
5790 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285791 handle.Init(kOtherGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5792 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5793 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5794 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245795 IsOk());
5796 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5797 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5798
David Benjaminbac8dff2019-08-07 01:30:415799 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245800
5801 handle.Reset();
5802 EXPECT_EQ(1, pool_->IdleSocketCount());
5803 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5804 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5805}
5806
David Benjaminbac8dff2019-08-07 01:30:415807TEST_P(ClientSocketPoolBaseRefreshTest,
5808 RefreshGroupReplacesBoundConnectJobOnConnect) {
5809 CreatePoolForRefresh(1, 1);
5810 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245811 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5812
5813 TestAuthHelper auth_helper;
5814 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5815 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5816 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5817
5818 auth_helper.WaitForAuth();
5819
5820 // This should update the generation, but not cancel the old ConnectJob - it's
5821 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415822 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245823
5824 // Providing auth credentials and restarting the request with them will cause
5825 // the ConnectJob to complete successfully, but the result will be discarded
5826 // because of the generation mismatch.
5827 auth_helper.RestartWithAuth();
5828
5829 // Despite using ConnectJobs that simulate a single challenge, a second
5830 // challenge will be seen, due to using a new ConnectJob.
5831 auth_helper.WaitForAuth();
5832 auth_helper.RestartWithAuth();
5833
5834 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5835 EXPECT_TRUE(auth_helper.handle()->socket());
5836 EXPECT_EQ(2, auth_helper.auth_count());
5837
5838 // When released, the socket will be returned to the socket pool, and
5839 // available for reuse.
5840 auth_helper.handle()->Reset();
5841 EXPECT_EQ(1, pool_->IdleSocketCount());
5842 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5843 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5844}
5845
David Benjaminbac8dff2019-08-07 01:30:415846TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5847 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5848 kUnusedIdleSocketTimeout,
5849 ClientSocketPool::used_idle_socket_timeout(),
5850 false /* no backup connect jobs */,
5851 ProxyServer::FromPacString("HTTPS myproxy:70"));
5852
5853 const ClientSocketPool::GroupId kGroupId1 =
5854 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5855 const ClientSocketPool::GroupId kGroupId2 =
5856 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
5857 const ClientSocketPool::GroupId kGroupId3 =
5858 TestGroupId("c", 443, ClientSocketPool::SocketType::kSsl);
5859
5860 // Make three sockets in three different groups. The third socket is released
5861 // to the pool as idle.
5862 ClientSocketHandle handle1, handle2, handle3;
5863 TestCompletionCallback callback;
5864 EXPECT_THAT(
5865 handle1.Init(kGroupId1, params_, base::nullopt, DEFAULT_PRIORITY,
5866 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5867 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5868 pool_.get(), NetLogWithSource()),
5869 IsOk());
5870 EXPECT_THAT(
5871 handle2.Init(kGroupId2, params_, base::nullopt, DEFAULT_PRIORITY,
5872 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5873 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5874 pool_.get(), NetLogWithSource()),
5875 IsOk());
5876 EXPECT_THAT(
5877 handle3.Init(kGroupId3, params_, base::nullopt, DEFAULT_PRIORITY,
5878 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5879 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5880 pool_.get(), NetLogWithSource()),
5881 IsOk());
5882 handle3.Reset();
5883 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5884 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5885 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5886 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5887 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5888 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5889
5890 // Changes to some other proxy do not affect the pool. The idle socket remains
5891 // alive and closing |handle2| makes the socket available for the pool.
5892 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5893
5894 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5895 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5896 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5897 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5898 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5899 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5900
5901 handle2.Reset();
5902 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5903 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5904
5905 // Changes to the matching proxy refreshes all groups.
5906 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5907
5908 // Idle sockets are closed.
5909 EXPECT_EQ(0, pool_->IdleSocketCount());
5910 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
5911 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
5912
5913 // The active socket, however, continues to be active.
5914 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5915 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5916
5917 // Closing it does not make it available for the pool.
5918 handle1.Reset();
5919 EXPECT_EQ(0, pool_->IdleSocketCount());
5920 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
5921}
5922
5923TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
5924 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5925
5926 const ClientSocketPool::GroupId kGroupId =
5927 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5928 PrivacyMode::PRIVACY_MODE_DISABLED);
5929 const ClientSocketPool::GroupId kGroupIdPrivacy =
5930 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5931 PrivacyMode::PRIVACY_MODE_ENABLED);
5932 const ClientSocketPool::GroupId kOtherGroupId =
5933 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
5934
5935 // Make a socket in each groups.
5936 ClientSocketHandle handle1, handle2, handle3;
5937 TestCompletionCallback callback;
5938 EXPECT_THAT(
5939 handle1.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5940 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5941 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5942 pool_.get(), NetLogWithSource()),
5943 IsOk());
5944 EXPECT_THAT(
5945 handle2.Init(kGroupIdPrivacy, params_, base::nullopt, DEFAULT_PRIORITY,
5946 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5947 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5948 pool_.get(), NetLogWithSource()),
5949 IsOk());
5950 EXPECT_THAT(
5951 handle3.Init(kOtherGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5952 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5953 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5954 pool_.get(), NetLogWithSource()),
5955 IsOk());
5956 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5957 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5958 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5959 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5960 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5961 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5962
5963 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5964
5965 // Active sockets continue to be active.
5966 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5967 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5968 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5969 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5970 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5971 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5972
5973 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
5974 // are unusable.
5975 handle1.Reset();
5976 handle2.Reset();
5977 handle3.Reset();
5978 EXPECT_EQ(1, pool_->IdleSocketCount());
5979 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5980 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5981 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5982 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5983}
5984
[email protected]f6d1d6eb2009-06-24 20:16:095985} // namespace
5986
5987} // namespace net