blob: ae102ac3dd8af1d6204ae6ea08c50701060e0703 [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
tbansalf82cc8e2015-10-14 20:05:495#include <stdint.h>
Daniel Cheng5feb16f2022-02-28 06:52:076
dchengc7eeda422015-12-26 03:56:487#include <utility>
[email protected]51fdc7c2012-04-10 19:19:488#include <vector>
9
[email protected]6ecf2b92011-12-15 01:14:5210#include "base/bind.h"
[email protected]2041cf342010-02-19 03:15:5911#include "base/callback.h"
danakjdb9ae7942020-11-11 16:01:3512#include "base/callback_helpers.h"
Hans Wennborg0924470b2020-04-27 21:08:0513#include "base/check_op.h"
skyostil4891b25b2015-06-11 11:43:4514#include "base/location.h"
Daniel Cheng5feb16f2022-02-28 06:52:0715#include "base/memory/raw_ptr.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"
[email protected]034df0f32013-01-07 23:17:4819#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:5120#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1521#include "base/strings/stringprintf.h"
Patrick Monette643cdf62021-10-15 19:13:4222#include "base/task/single_thread_task_runner.h"
Matt Menke166443c2019-05-24 18:45:5923#include "base/test/scoped_feature_list.h"
[email protected]f214f8792011-01-01 02:17:0824#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3525#include "base/threading/thread_task_runner_handle.h"
Gabriel Charetted87f10f2022-03-31 00:44:2226#include "base/time/time.h"
[email protected]f3a1c642011-07-12 19:15:0327#include "base/values.h"
Matt Menke166443c2019-05-24 18:45:5928#include "net/base/features.h"
Eric Ortha2e7773212021-06-22 21:49:5529#include "net/base/host_port_pair.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"
Eric Orth5ccc3f02021-09-23 00:01:5736#include "net/base/proxy_string_util.h"
[email protected]ac790b42009-12-02 04:31:3137#include "net/base/request_priority.h"
Matt Menke4807a9a2020-11-21 00:14:4138#include "net/base/schemeful_site.h"
[email protected]f6d1d6eb2009-06-24 20:16:0939#include "net/base/test_completion_callback.h"
dalykedd30d982019-12-16 15:31:1040#include "net/dns/public/resolve_error_info.h"
Ben Schwartz3ff4dc1e62021-04-27 21:15:2341#include "net/dns/public/secure_dns_policy.h"
[email protected]277d5942010-08-11 21:02:3542#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5143#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0744#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0045#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1946#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0047#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5648#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4649#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0950#include "net/socket/client_socket_factory.h"
51#include "net/socket/client_socket_handle.h"
Eric Ortha9b8be02021-06-29 23:09:0852#include "net/socket/connect_job_factory.h"
tfarina5dd13c22016-11-16 12:08:2653#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2854#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5455#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1756#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4457#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1058#include "net/socket/stream_socket.h"
Daniel Cheng5feb16f2022-02-28 06:52:0759#include "net/socket/transport_client_socket_pool.h"
Matt Menke9fa17d52019-03-25 19:12:2660#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5161#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0162#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4063#include "net/test/test_with_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2864#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3865#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4866#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0967#include "testing/gtest/include/gtest/gtest.h"
Anton Bikineev068d2912021-05-15 20:43:5268#include "third_party/abseil-cpp/absl/types/optional.h"
Eric Ortha2e7773212021-06-22 21:49:5569#include "url/scheme_host_port.h"
70#include "url/url_constants.h"
[email protected]f6d1d6eb2009-06-24 20:16:0971
robpercival214763f2016-07-01 23:27:0172using net::test::IsError;
73using net::test::IsOk;
74
[email protected]51fdc7c2012-04-10 19:19:4875using ::testing::Invoke;
76using ::testing::Return;
77
[email protected]f6d1d6eb2009-06-24 20:16:0978namespace net {
79
80namespace {
81
[email protected]211d21722009-07-22 15:48:5382const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2083const int kDefaultMaxSocketsPerGroup = 2;
Peter Kastinge5a38ed2021-10-02 03:06:3584constexpr base::TimeDelta kUnusedIdleSocketTimeout = base::Seconds(10);
[email protected]0b7648c2009-07-06 20:14:0185
Matt Menkebdf777802019-04-22 19:38:5986ClientSocketPool::GroupId TestGroupId(
Eric Ortha2e7773212021-06-22 21:49:5587 base::StringPiece host,
Matt Menkebdf777802019-04-22 19:38:5988 int port = 80,
Eric Ortha2e7773212021-06-22 21:49:5589 base::StringPiece scheme = url::kHttpScheme,
Matt Menke166443c2019-05-24 18:45:5990 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
91 NetworkIsolationKey network_isolation_key = NetworkIsolationKey()) {
Eric Ortha2e7773212021-06-22 21:49:5592 return ClientSocketPool::GroupId(url::SchemeHostPort(scheme, host, port),
dalyk5f48a132019-10-14 15:20:1993 privacy_mode, network_isolation_key,
Ben Schwartz3ff4dc1e62021-04-27 21:15:2394 SecureDnsPolicy::kAllow);
Matt Menkec6b3edf72019-03-19 17:00:3995}
96
[email protected]034df0f32013-01-07 23:17:4897// Make sure |handle| sets load times correctly when it has been assigned a
98// reused socket.
99void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
100 LoadTimingInfo load_timing_info;
101 // Only pass true in as |is_reused|, as in general, HttpStream types should
102 // have stricter concepts of reuse than socket pools.
103 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
104
105 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19106 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48107
[email protected]b258e0792013-01-12 07:11:59108 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
109 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48110}
111
112// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33113// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48114// of a connection where |is_reused| is false may consider the connection
115// reused.
116void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
117 EXPECT_FALSE(handle.is_reused());
118
119 LoadTimingInfo load_timing_info;
120 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
121
122 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19123 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48124
[email protected]b258e0792013-01-12 07:11:59125 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
126 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
127 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48128
129 TestLoadTimingInfoConnectedReused(handle);
130}
131
132// Make sure |handle| sets load times correctly, in the case that it does not
133// currently have a socket.
134void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
135 // Should only be set to true once a socket is assigned, if at all.
136 EXPECT_FALSE(handle.is_reused());
137
138 LoadTimingInfo load_timing_info;
139 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
140
141 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19142 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48143
[email protected]b258e0792013-01-12 07:11:59144 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
145 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48146}
147
[email protected]3268023f2011-05-05 00:08:10148class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09149 public:
[email protected]034df0f32013-01-07 23:17:48150 explicit MockClientSocket(net::NetLog* net_log)
151 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28152 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20153 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30154 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09155
Peter Boström407869b2021-10-07 04:42:48156 MockClientSocket(const MockClientSocket&) = delete;
157 MockClientSocket& operator=(const MockClientSocket&) = delete;
158
[email protected]0dc88b32014-03-26 20:12:28159 // Sets whether the socket has unread data. If true, the next call to Read()
160 // will return 1 byte and IsConnectedAndIdle() will return false.
161 void set_has_unread_data(bool has_unread_data) {
162 has_unread_data_ = has_unread_data;
163 }
164
[email protected]3f55aa12011-12-07 02:03:33165 // Socket implementation.
dchengb03027d2014-10-21 12:00:20166 int Read(IOBuffer* /* buf */,
167 int len,
Brad Lassey3a814172018-04-26 03:30:21168 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28169 if (has_unread_data_ && len > 0) {
170 has_unread_data_ = false;
171 was_used_to_convey_data_ = true;
172 return 1;
173 }
[email protected]e86df8dc2013-03-30 13:18:28174 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33175 }
[email protected]ab838892009-06-30 18:49:05176
[email protected]a2b2cfc2017-12-06 09:06:08177 int Write(
178 IOBuffer* /* buf */,
179 int len,
Brad Lassey3a814172018-04-26 03:30:21180 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08181 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01182 was_used_to_convey_data_ = true;
183 return len;
[email protected]ab838892009-06-30 18:49:05184 }
Avi Drissman13fc8932015-12-20 04:40:46185 int SetReceiveBufferSize(int32_t size) override { return OK; }
186 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05187
[email protected]dbf036f2011-12-06 23:33:24188 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21189 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24190 connected_ = true;
191 return OK;
192 }
[email protected]f6d1d6eb2009-06-24 20:16:09193
dchengb03027d2014-10-21 12:00:20194 void Disconnect() override { connected_ = false; }
195 bool IsConnected() const override { return connected_; }
196 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28197 return connected_ && !has_unread_data_;
198 }
[email protected]0b7648c2009-07-06 20:14:01199
dchengb03027d2014-10-21 12:00:20200 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16201 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09202 }
[email protected]f6d1d6eb2009-06-24 20:16:09203
dchengb03027d2014-10-21 12:00:20204 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35205 return ERR_UNEXPECTED;
206 }
207
tfarina428341112016-09-22 13:38:20208 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02209
dchengb03027d2014-10-21 12:00:20210 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37211 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20212 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
213 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
tbansalf82cc8e2015-10-14 20:05:49214 int64_t GetTotalReceivedBytes() const override {
215 NOTIMPLEMENTED();
216 return 0;
217 }
Paul Jensen0f49dec2017-12-12 23:39:58218 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45219
[email protected]f6d1d6eb2009-06-24 20:16:09220 private:
221 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28222 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20223 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01224 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09225};
226
[email protected]5fc08e32009-07-15 17:09:57227class TestConnectJob;
228
[email protected]f6d1d6eb2009-06-24 20:16:09229class MockClientSocketFactory : public ClientSocketFactory {
230 public:
[email protected]ab838892009-06-30 18:49:05231 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09232
danakj655b66c2016-04-16 00:51:38233 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04234 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41235 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19236 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41237 NOTREACHED();
David Benjamin24725be2019-07-24 20:57:18238 return nullptr;
[email protected]98b0e582011-06-22 14:31:41239 }
240
Helen Lid5bb9222018-04-12 15:33:09241 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07242 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38243 std::unique_ptr<
244 SocketPerformanceWatcher> /* socket_performance_watcher */,
Eric Roman2bc77162020-09-16 18:30:45245 NetworkQualityEstimator* /* network_quality_estimator */,
[email protected]0a0b7682010-08-25 17:08:07246 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19247 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09248 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09249 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09250 }
251
danakj655b66c2016-04-16 00:51:38252 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
David Benjamin24725be2019-07-24 20:57:18253 SSLClientContext* context,
Matt Menke841fc412019-03-05 23:20:12254 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27255 const HostPortPair& host_and_port,
David Benjamin24725be2019-07-24 20:57:18256 const SSLConfig& ssl_config) override {
[email protected]f6d1d6eb2009-06-24 20:16:09257 NOTIMPLEMENTED();
David Benjamin24725be2019-07-24 20:57:18258 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09259 }
Matt Menkefd956922019-02-04 23:44:03260
[email protected]5fc08e32009-07-15 17:09:57261 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55262
[email protected]5fc08e32009-07-15 17:09:57263 void SignalJobs();
264
[email protected]03b7c8c2013-07-20 04:38:55265 void SignalJob(size_t job);
266
267 void SetJobLoadState(size_t job, LoadState load_state);
268
Matt Menke141b87f22019-01-30 02:43:03269 // Sets the HasConnectionEstablished value of the specified job to true,
270 // without invoking the callback.
271 void SetJobHasEstablishedConnection(size_t job);
272
[email protected]f6d1d6eb2009-06-24 20:16:09273 int allocation_count() const { return allocation_count_; }
274
[email protected]f6d1d6eb2009-06-24 20:16:09275 private:
276 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57277 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09278};
279
[email protected]ab838892009-06-30 18:49:05280class TestConnectJob : public ConnectJob {
281 public:
282 enum JobType {
283 kMockJob,
284 kMockFailingJob,
285 kMockPendingJob,
286 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57287 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10288
289 // Certificate errors return a socket in addition to an error code.
290 kMockCertErrorJob,
291 kMockPendingCertErrorJob,
292
[email protected]e60e47a2010-07-14 03:37:18293 kMockAdditionalErrorStateJob,
294 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28295 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10296
297 kMockAuthChallengeOnceJob,
298 kMockAuthChallengeTwiceJob,
299 kMockAuthChallengeOnceFailingJob,
300 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05301 };
302
[email protected]994d4932010-07-12 17:55:13303 // The kMockPendingJob uses a slight delay before allowing the connect
304 // to complete.
305 static const int kPendingConnectDelay = 2;
306
[email protected]ab838892009-06-30 18:49:05307 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40308 RequestPriority request_priority,
309 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34310 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43311 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05312 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43313 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40314 : ConnectJob(request_priority,
315 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38316 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43317 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38318 delegate,
319 nullptr /* net_log */,
320 NetLogSourceType::TRANSPORT_CONNECT_JOB,
321 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58322 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05323 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18324 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03325 has_established_connection_(false),
Jeremy Romand54000b22019-07-08 18:40:16326 store_additional_error_state_(false) {}
[email protected]ab838892009-06-30 18:49:05327
Peter Boström407869b2021-10-07 04:42:48328 TestConnectJob(const TestConnectJob&) = delete;
329 TestConnectJob& operator=(const TestConnectJob&) = delete;
330
[email protected]974ebd62009-08-03 23:14:34331 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13332 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34333 }
334
[email protected]03b7c8c2013-07-20 04:38:55335 void set_load_state(LoadState load_state) { load_state_ = load_state; }
336
Matt Menke141b87f22019-01-30 02:43:03337 void set_has_established_connection() {
338 DCHECK(!has_established_connection_);
339 has_established_connection_ = true;
340 }
341
[email protected]03b7c8c2013-07-20 04:38:55342 // From ConnectJob:
343
dchengb03027d2014-10-21 12:00:20344 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21345
Matt Menke141b87f22019-01-30 02:43:03346 bool HasEstablishedConnection() const override {
347 return has_established_connection_;
348 }
349
dalykedd30d982019-12-16 15:31:10350 ResolveErrorInfo GetResolveErrorInfo() const override {
351 return ResolveErrorInfo(OK);
352 }
353
Matt Menke6f84d1f12019-04-11 19:26:47354 bool IsSSLError() const override { return store_additional_error_state_; }
355
356 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
357 if (store_additional_error_state_)
358 return base::MakeRefCounted<SSLCertRequestInfo>();
359 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18360 }
361
[email protected]974ebd62009-08-03 23:14:34362 private:
[email protected]03b7c8c2013-07-20 04:38:55363 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05364
dchengb03027d2014-10-21 12:00:20365 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05366 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35367 client_socket_factory_->CreateTransportClientSocket(
Eric Roman2bc77162020-09-16 18:30:45368 ignored, nullptr, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05369 switch (job_type_) {
370 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13371 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10372 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05373 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13374 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10375 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05376 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57377 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47378
379 // Depending on execution timings, posting a delayed task can result
380 // in the task getting executed the at the earliest possible
381 // opportunity or only after returning once from the message loop and
382 // then a second call into the message loop. In order to make behavior
383 // more deterministic, we change the default delay to 2ms. This should
384 // always require us to wait for the second call into the message loop.
385 //
386 // N.B. The correct fix for this and similar timing problems is to
387 // abstract time for the purpose of unittests. Unfortunately, we have
388 // a lot of third-party components that directly call the various
389 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45390 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05391 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49392 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
393 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10394 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35395 base::Milliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05396 return ERR_IO_PENDING;
397 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57398 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45399 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05400 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49401 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
402 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10403 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35404 base::Milliseconds(2));
[email protected]ab838892009-06-30 18:49:05405 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57406 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55407 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57408 client_socket_factory_->WaitForSignal(this);
409 waiting_success_ = true;
410 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10411 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13412 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10413 true /* cert_error */);
414 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13415 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45416 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13417 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49418 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
419 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10420 true /* async */, true /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35421 base::Milliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13422 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18423 case kMockAdditionalErrorStateJob:
424 store_additional_error_state_ = true;
425 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10426 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18427 case kMockPendingAdditionalErrorStateJob:
428 set_load_state(LOAD_STATE_CONNECTING);
429 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45430 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18431 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49432 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
433 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10434 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35435 base::Milliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18436 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28437 case kMockUnreadDataJob: {
438 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10439 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28440 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
441 return ret;
442 }
Matt Menkeb57663b32019-03-01 17:17:10443 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01444 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10445 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
446 return ERR_IO_PENDING;
447 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01448 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10449 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
450 return ERR_IO_PENDING;
451 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01452 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10453 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
454 return ERR_IO_PENDING;
455 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01456 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10457 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
458 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05459 default:
460 NOTREACHED();
Anton Bikineev068d2912021-05-15 20:43:52461 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05462 return ERR_FAILED;
463 }
464 }
465
Lily Chen02ef29a2018-11-30 16:31:43466 void ChangePriorityInternal(RequestPriority priority) override {}
467
Matt Menkeb57663b32019-03-01 17:17:10468 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13469 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03470 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05471 if (succeed) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19472 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52473 absl::nullopt);
Bence Békybdbb0e72018-08-07 21:42:59474 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10475 } else if (cert_error) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19476 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52477 absl::nullopt);
Matt Menkeb57663b32019-03-01 17:17:10478 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40479 } else {
[email protected]e772db3f2010-07-12 18:11:13480 result = ERR_CONNECTION_FAILED;
Anton Bikineev068d2912021-05-15 20:43:52481 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05482 }
[email protected]2ab05b52009-07-01 23:57:58483
484 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30485 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05486 return result;
487 }
488
Matt Menkeb57663b32019-03-01 17:17:10489 void DoAdvanceAuthChallenge(int remaining_challenges,
490 bool succeed_after_last_challenge) {
491 base::ThreadTaskRunnerHandle::Get()->PostTask(
492 FROM_HERE,
493 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
494 weak_factory_.GetWeakPtr(), remaining_challenges,
495 succeed_after_last_challenge));
496 }
497
498 void InvokeNextProxyAuthCallback(int remaining_challenges,
499 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01500 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10501 if (remaining_challenges == 0) {
502 DoConnect(succeed_after_last_challenge, true /* was_async */,
503 false /* cert_error */);
504 return;
505 }
506
507 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
508 // The auth tests here are just focused on ConnectJob bookkeeping.
509 HttpResponseInfo info;
510 NotifyDelegateOfProxyAuth(
511 info, nullptr /* http_auth_controller */,
512 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
513 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
514 succeed_after_last_challenge));
515 }
516
[email protected]5fc08e32009-07-15 17:09:57517 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05518 const JobType job_type_;
Keishi Hattori0e45c022021-11-27 09:25:52519 const raw_ptr<MockClientSocketFactory> client_socket_factory_;
[email protected]46451352009-09-01 14:54:21520 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03521 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18522 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05523
Jeremy Romand54000b22019-07-08 18:40:16524 base::WeakPtrFactory<TestConnectJob> weak_factory_{this};
[email protected]ab838892009-06-30 18:49:05525};
526
Eric Ortha9b8be02021-06-29 23:09:08527class TestConnectJobFactory : public ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05528 public:
Eric Ortha9b8be02021-06-29 23:09:08529 explicit TestConnectJobFactory(MockClientSocketFactory* client_socket_factory)
530 : client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05531
Peter Boström293b1342021-09-22 17:31:43532 TestConnectJobFactory(const TestConnectJobFactory&) = delete;
533 TestConnectJobFactory& operator=(const TestConnectJobFactory&) = delete;
534
Chris Watkins7a41d3552017-12-01 02:13:27535 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05536
537 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
538
[email protected]51fdc7c2012-04-10 19:19:48539 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
540 job_types_ = job_types;
541 CHECK(!job_types_->empty());
542 }
543
[email protected]974ebd62009-08-03 23:14:34544 void set_timeout_duration(base::TimeDelta timeout_duration) {
545 timeout_duration_ = timeout_duration;
546 }
547
[email protected]3f55aa12011-12-07 02:03:33548 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55549
Eric Ortha9b8be02021-06-29 23:09:08550 std::unique_ptr<ConnectJob> CreateConnectJob(
Eric Orthc98a3e62021-07-02 17:46:37551 Endpoint endpoint,
Eric Ortha9b8be02021-06-29 23:09:08552 const ProxyServer& proxy_server,
Anton Bikineev068d2912021-05-15 20:43:52553 const absl::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Eric Ortha9b8be02021-06-29 23:09:08554 const SSLConfig* ssl_config_for_origin,
555 const SSLConfig* ssl_config_for_proxy,
556 bool force_tunnel,
557 PrivacyMode privacy_mode,
558 const OnHostResolutionCallback& resolution_callback,
Matt Menke16f5c2e52019-03-25 21:50:40559 RequestPriority request_priority,
560 SocketTag socket_tag,
Eric Ortha9b8be02021-06-29 23:09:08561 const NetworkIsolationKey& network_isolation_key,
562 SecureDnsPolicy secure_dns_policy,
563 const CommonConnectJobParams* common_connect_job_params,
mostynbba063d6032014-10-09 11:01:13564 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48565 EXPECT_TRUE(!job_types_ || !job_types_->empty());
566 TestConnectJob::JobType job_type = job_type_;
567 if (job_types_ && !job_types_->empty()) {
568 job_type = job_types_->front();
569 job_types_->pop_front();
570 }
Matt Menkea6f99ad2019-03-08 02:26:43571 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40572 job_type, request_priority, socket_tag, timeout_duration_,
Eric Ortha9b8be02021-06-29 23:09:08573 common_connect_job_params, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05574 }
575
576 private:
Eric Ortha9b8be02021-06-29 23:09:08577 TestConnectJob::JobType job_type_ = TestConnectJob::kMockJob;
Keishi Hattori0e45c022021-11-27 09:25:52578 raw_ptr<std::list<TestConnectJob::JobType>> job_types_ = nullptr;
[email protected]974ebd62009-08-03 23:14:34579 base::TimeDelta timeout_duration_;
Keishi Hattori0e45c022021-11-27 09:25:52580 const raw_ptr<MockClientSocketFactory> client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05581};
582
[email protected]a937a06d2009-08-19 21:19:24583} // namespace
584
[email protected]a937a06d2009-08-19 21:19:24585namespace {
586
[email protected]5fc08e32009-07-15 17:09:57587void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26588 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57589 (*it)->Signal();
590 }
591 waiting_jobs_.clear();
592}
593
[email protected]03b7c8c2013-07-20 04:38:55594void MockClientSocketFactory::SignalJob(size_t job) {
595 ASSERT_LT(job, waiting_jobs_.size());
596 waiting_jobs_[job]->Signal();
597 waiting_jobs_.erase(waiting_jobs_.begin() + job);
598}
599
600void MockClientSocketFactory::SetJobLoadState(size_t job,
601 LoadState load_state) {
602 ASSERT_LT(job, waiting_jobs_.size());
603 waiting_jobs_[job]->set_load_state(load_state);
604}
605
Matt Menke141b87f22019-01-30 02:43:03606void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
607 ASSERT_LT(job, waiting_jobs_.size());
608 waiting_jobs_[job]->set_has_established_connection();
609}
610
Gabriel Charette694c3c332019-08-19 14:53:05611class ClientSocketPoolBaseTest : public TestWithTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09612 protected:
Alex Clarke0def2092018-12-10 12:01:45613 ClientSocketPoolBaseTest()
Gabriel Charette694c3c332019-08-19 14:53:05614 : TestWithTaskEnvironment(
615 base::test::TaskEnvironment::TimeSource::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03616 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54617 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40618 TransportClientSocketPool::connect_backup_jobs_enabled();
619 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54620 }
[email protected]2431756e2010-09-29 20:26:13621
dcheng67be2b1f2014-10-27 21:47:29622 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40623 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54624 connect_backup_jobs_enabled_);
625 }
[email protected]c9d6a1d2009-07-14 16:15:20626
Matt Menke9fa17d52019-03-25 19:12:26627 void CreatePool(int max_sockets,
628 int max_sockets_per_group,
629 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59630 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
631 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26632 ClientSocketPool::used_idle_socket_timeout(),
633 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16634 }
635
David Benjaminbac8dff2019-08-07 01:30:41636 void CreatePoolWithIdleTimeouts(
637 int max_sockets,
638 int max_sockets_per_group,
639 base::TimeDelta unused_idle_socket_timeout,
640 base::TimeDelta used_idle_socket_timeout,
641 bool enable_backup_connect_jobs = false,
642 ProxyServer proxy_server = ProxyServer::Direct()) {
[email protected]c9d6a1d2009-07-14 16:15:20643 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26644 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
Eric Ortha9b8be02021-06-29 23:09:08645 std::make_unique<TestConnectJobFactory>(&client_socket_factory_);
Matt Menke9fa17d52019-03-25 19:12:26646 connect_job_factory_ = connect_job_factory.get();
647 pool_ = TransportClientSocketPool::CreateForTesting(
648 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
Eric Ortha9b8be02021-06-29 23:09:08649 used_idle_socket_timeout, proxy_server, /*is_for_websockets=*/false,
650 &common_connect_job_params_, std::move(connect_job_factory),
Matt Menke9fa17d52019-03-25 19:12:26651 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20652 }
[email protected]f6d1d6eb2009-06-24 20:16:09653
mmenked3641e12016-01-28 16:06:15654 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39655 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33656 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15657 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39658 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15659 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33660 }
661
Matt Menkec6b3edf72019-03-19 17:00:39662 int StartRequest(const ClientSocketPool::GroupId& group_id,
663 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15664 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39665 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09666 }
667
[email protected]2431756e2010-09-29 20:26:13668 int GetOrderOfRequest(size_t index) const {
669 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09670 }
671
[email protected]2431756e2010-09-29 20:26:13672 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
673 return test_base_.ReleaseOneConnection(keep_alive);
674 }
675
676 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
677 test_base_.ReleaseAllConnections(keep_alive);
678 }
679
Matt Menke433de6d2020-03-04 00:24:11680 // Expects a single NetLogEventType::SOCKET_POOL_CLOSING_SOCKET in |net_log_|.
681 // It should be logged for the provided source and have the indicated reason.
682 void ExpectSocketClosedWithReason(NetLogSource expected_source,
683 const char* expected_reason) {
Matt Reichhoff0049a0b72021-10-20 20:44:26684 auto entries = net_log_observer_.GetEntriesForSourceWithType(
Matt Menke433de6d2020-03-04 00:24:11685 expected_source, NetLogEventType::SOCKET_POOL_CLOSING_SOCKET,
686 NetLogEventPhase::NONE);
687 ASSERT_EQ(1u, entries.size());
688 ASSERT_TRUE(entries[0].HasParams());
689 ASSERT_TRUE(entries[0].params.is_dict());
Matt Menkeca721da2022-06-01 04:47:29690 const std::string* reason =
691 entries[0].params.GetDict().FindString("reason");
Matt Menke433de6d2020-03-04 00:24:11692 ASSERT_TRUE(reason);
693 EXPECT_EQ(expected_reason, *reason);
694 }
695
[email protected]2431756e2010-09-29 20:26:13696 TestSocketRequest* request(int i) { return test_base_.request(i); }
697 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38698 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42699 return test_base_.requests();
700 }
rdsmith29dbad12017-02-17 02:22:18701 // Only counts the requests that get sockets asynchronously;
702 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13703 size_t completion_count() const { return test_base_.completion_count(); }
704
Eric Ortha9b8be02021-06-29 23:09:08705 const CommonConnectJobParams common_connect_job_params_{
706 nullptr /* client_socket_factory */,
707 nullptr /* host_resolver */,
708 nullptr /* http_auth_cache */,
709 nullptr /* http_auth_handler_factory */,
710 nullptr /* spdy_session_pool */,
711 nullptr /* quic_supported_versions */,
712 nullptr /* quic_stream_factory */,
713 nullptr /* proxy_delegate */,
714 nullptr /* http_user_agent_settings */,
715 nullptr /* ssl_client_context */,
716 nullptr /* socket_performance_watcher_factory */,
717 nullptr /* network_quality_estimator */,
Matt Reichhoff36a1fd62021-10-12 22:52:20718 NetLog::Get(),
Eric Ortha9b8be02021-06-29 23:09:08719 nullptr /* websocket_endpoint_lock_manager */};
[email protected]636b8252011-04-08 19:56:54720 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09721 MockClientSocketFactory client_socket_factory_;
Keishi Hattori0e45c022021-11-27 09:25:52722 raw_ptr<TestConnectJobFactory> connect_job_factory_;
Matt Reichhoff0049a0b72021-10-20 20:44:26723 RecordingNetLogObserver net_log_observer_;
Matt Menke9fa17d52019-03-25 19:12:26724 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19725 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26726 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13727 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09728};
729
[email protected]5fc08e32009-07-15 17:09:57730TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53731 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20732
[email protected]6ecf2b92011-12-15 01:14:52733 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06734 ClientSocketHandle handle;
Matt Reichhoff0049a0b72021-10-20 20:44:26735 NetLogWithSource net_log_with_source =
736 NetLogWithSource::Make(NetLogSourceType::NONE);
737
[email protected]034df0f32013-01-07 23:17:48738 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53739
Matt Menkef09e64c2019-04-23 22:16:28740 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:52741 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28742 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
743 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:26744 pool_.get(), net_log_with_source));
[email protected]f6d1d6eb2009-06-24 20:16:09745 EXPECT_TRUE(handle.is_initialized());
746 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48747 TestLoadTimingInfoConnectedNotReused(handle);
748
[email protected]f6d1d6eb2009-06-24 20:16:09749 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48750 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30751
Matt Reichhoff0049a0b72021-10-20 20:44:26752 auto entries =
753 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:40754
Matt Menke9fa17d52019-03-25 19:12:26755 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53756 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26757 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00758 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26759 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
760 EXPECT_TRUE(LogContainsEvent(
761 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
762 NetLogEventPhase::NONE));
763 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00764 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
765 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26766 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09767}
768
[email protected]ab838892009-06-30 18:49:05769TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53770 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20771
[email protected]ab838892009-06-30 18:49:05772 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Reichhoff0049a0b72021-10-20 20:44:26773 NetLogWithSource net_log_with_source =
774 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]9e743cd2010-03-16 07:03:53775
[email protected]2431756e2010-09-29 20:26:13776 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52777 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18778 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13779 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51780 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50781 EXPECT_EQ(
782 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:52783 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28784 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
785 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:26786 pool_.get(), net_log_with_source));
[email protected]2431756e2010-09-29 20:26:13787 EXPECT_FALSE(handle.socket());
788 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51789 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48790 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30791
Matt Reichhoff0049a0b72021-10-20 20:44:26792 auto entries =
793 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:40794
Matt Menke9fa17d52019-03-25 19:12:26795 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17796 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26797 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00798 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26799 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
800 EXPECT_TRUE(LogContainsEvent(
801 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
802 NetLogEventPhase::NONE));
803 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09804}
805
Matt Menke433de6d2020-03-04 00:24:11806// Test releasing an open socket into the socket pool, telling the socket pool
807// to close the socket.
808TEST_F(ClientSocketPoolBaseTest, ReleaseAndCloseConnection) {
809 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
810
811 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
812 ASSERT_TRUE(request(0)->handle()->socket());
813 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
814 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
815
816 EXPECT_EQ(0, pool_->IdleSocketCount());
817 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
818
819 ExpectSocketClosedWithReason(
820 source, TransportClientSocketPool::kClosedConnectionReturnedToPool);
821}
822
823TEST_F(ClientSocketPoolBaseTest, SocketWithUnreadDataReturnedToPool) {
824 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
825 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
826
827 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
828 ASSERT_TRUE(request(0)->handle()->socket());
829 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
830 EXPECT_TRUE(request(0)->handle()->socket()->IsConnected());
831 EXPECT_FALSE(request(0)->handle()->socket()->IsConnectedAndIdle());
832 ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE);
833
834 EXPECT_EQ(0, pool_->IdleSocketCount());
835 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
836
837 ExpectSocketClosedWithReason(
838 source, TransportClientSocketPool::kDataReceivedUnexpectedly);
839}
840
Matt Menkef6edce752019-03-19 17:21:56841// Make sure different groups do not share sockets.
842TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59843 base::test::ScopedFeatureList feature_list;
844 feature_list.InitAndEnableFeature(
845 features::kPartitionConnectionsByNetworkIsolationKey);
846
Matt Menkef6edce752019-03-19 17:21:56847 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
848
849 const HostPortPair kHostPortPairs[] = {
850 {"a", 80},
851 {"a", 443},
852 {"b", 80},
853 };
854
Eric Ortha2e7773212021-06-22 21:49:55855 const char* const kSchemes[] = {
856 url::kHttpScheme,
857 url::kHttpsScheme,
Matt Menkef6edce752019-03-19 17:21:56858 };
859
Matt Menkebdf777802019-04-22 19:38:59860 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
861 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56862
Matt Menke4807a9a2020-11-21 00:14:41863 const SchemefulSite kSiteA(GURL("http://a.test/"));
864 const SchemefulSite kSiteB(GURL("http://b.test/"));
Matt Menke166443c2019-05-24 18:45:59865 const NetworkIsolationKey kNetworkIsolationKeys[] = {
Matt Menke4807a9a2020-11-21 00:14:41866 NetworkIsolationKey(kSiteA, kSiteA),
867 NetworkIsolationKey(kSiteB, kSiteB),
Matt Menke166443c2019-05-24 18:45:59868 };
869
Ben Schwartz3ff4dc1e62021-04-27 21:15:23870 const SecureDnsPolicy kSecureDnsPolicys[] = {SecureDnsPolicy::kAllow,
871 SecureDnsPolicy::kDisable};
dalyk5f48a132019-10-14 15:20:19872
Matt Menkef6edce752019-03-19 17:21:56873 int total_idle_sockets = 0;
874
875 // Walk through each GroupId, making sure that requesting a socket for one
876 // group does not return a previously connected socket for another group.
877 for (const auto& host_port_pair : kHostPortPairs) {
878 SCOPED_TRACE(host_port_pair.ToString());
Eric Ortha2e7773212021-06-22 21:49:55879 for (const char* scheme : kSchemes) {
880 SCOPED_TRACE(scheme);
Matt Menkef6edce752019-03-19 17:21:56881 for (const auto& privacy_mode : kPrivacyModes) {
882 SCOPED_TRACE(privacy_mode);
Matt Menke166443c2019-05-24 18:45:59883 for (const auto& network_isolation_key : kNetworkIsolationKeys) {
884 SCOPED_TRACE(network_isolation_key.ToString());
Ben Schwartz3ff4dc1e62021-04-27 21:15:23885 for (const auto& secure_dns_policy : kSecureDnsPolicys) {
886 SCOPED_TRACE(static_cast<int>(secure_dns_policy));
Matt Menkef6edce752019-03-19 17:21:56887
dalyk5f48a132019-10-14 15:20:19888 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56889
dalyk5f48a132019-10-14 15:20:19890 ClientSocketPool::GroupId group_id(
Eric Ortha2e7773212021-06-22 21:49:55891 url::SchemeHostPort(scheme, host_port_pair.host(),
892 host_port_pair.port()),
893 privacy_mode, network_isolation_key, secure_dns_policy);
Matt Menkef6edce752019-03-19 17:21:56894
dalyk5f48a132019-10-14 15:20:19895 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56896
dalyk5f48a132019-10-14 15:20:19897 TestCompletionCallback callback;
898 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56899
dalyk5f48a132019-10-14 15:20:19900 // Since the group is empty, requesting a socket should not complete
901 // synchronously.
Anton Bikineev068d2912021-05-15 20:43:52902 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19903 DEFAULT_PRIORITY, SocketTag(),
904 ClientSocketPool::RespectLimits::ENABLED,
905 callback.callback(),
906 ClientSocketPool::ProxyAuthCallback(),
907 pool_.get(), NetLogWithSource()),
908 IsError(ERR_IO_PENDING));
909 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
910 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56911
dalyk5f48a132019-10-14 15:20:19912 EXPECT_THAT(callback.WaitForResult(), IsOk());
913 EXPECT_TRUE(handle.socket());
914 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
915 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56916
dalyk5f48a132019-10-14 15:20:19917 // Return socket to pool.
918 handle.Reset();
919 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56920
dalyk5f48a132019-10-14 15:20:19921 // Requesting a socket again should return the same socket as
922 // before, so should complete synchronously.
Anton Bikineev068d2912021-05-15 20:43:52923 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19924 DEFAULT_PRIORITY, SocketTag(),
925 ClientSocketPool::RespectLimits::ENABLED,
926 callback.callback(),
927 ClientSocketPool::ProxyAuthCallback(),
928 pool_.get(), NetLogWithSource()),
929 IsOk());
930 EXPECT_TRUE(handle.socket());
931 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56932
dalyk5f48a132019-10-14 15:20:19933 // Return socket to pool again.
934 handle.Reset();
935 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56936
dalyk5f48a132019-10-14 15:20:19937 ++total_idle_sockets;
938 }
Matt Menke166443c2019-05-24 18:45:59939 }
Matt Menkef6edce752019-03-19 17:21:56940 }
941 }
942 }
943}
944
[email protected]211d21722009-07-22 15:48:53945TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
946 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
947
[email protected]9e743cd2010-03-16 07:03:53948 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30949
Matt Menkec6b3edf72019-03-19 17:00:39950 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
951 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
952 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
953 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53954
[email protected]2431756e2010-09-29 20:26:13955 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53956 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13957 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53958
Matt Menkec6b3edf72019-03-19 17:00:39959 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
960 IsError(ERR_IO_PENDING));
961 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
962 IsError(ERR_IO_PENDING));
963 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
964 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53965
[email protected]2431756e2010-09-29 20:26:13966 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53967
[email protected]2431756e2010-09-29 20:26:13968 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53969 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13970 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53971
972 EXPECT_EQ(1, GetOrderOfRequest(1));
973 EXPECT_EQ(2, GetOrderOfRequest(2));
974 EXPECT_EQ(3, GetOrderOfRequest(3));
975 EXPECT_EQ(4, GetOrderOfRequest(4));
976 EXPECT_EQ(5, GetOrderOfRequest(5));
977 EXPECT_EQ(6, GetOrderOfRequest(6));
978 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17979
980 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13981 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53982}
983
984TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
985 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
986
[email protected]9e743cd2010-03-16 07:03:53987 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30988
[email protected]211d21722009-07-22 15:48:53989 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39990 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
991 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
992 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
993 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53994
[email protected]2431756e2010-09-29 20:26:13995 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53996 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13997 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53998
999 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:391000 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1001 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531002
[email protected]2431756e2010-09-29 20:26:131003 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531004
[email protected]2431756e2010-09-29 20:26:131005 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531006 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131007 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531008
1009 EXPECT_EQ(1, GetOrderOfRequest(1));
1010 EXPECT_EQ(2, GetOrderOfRequest(2));
1011 EXPECT_EQ(3, GetOrderOfRequest(3));
1012 EXPECT_EQ(4, GetOrderOfRequest(4));
1013 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:171014
1015 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131016 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531017}
1018
1019TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
1020 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1021
Matt Menkec6b3edf72019-03-19 17:00:391022 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
1023 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
1024 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1025 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:531026
[email protected]2431756e2010-09-29 20:26:131027 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531028 client_socket_factory_.allocation_count());
1029
Matt Menkec6b3edf72019-03-19 17:00:391030 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
1031 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1032 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531033
[email protected]2431756e2010-09-29 20:26:131034 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531035
[email protected]2431756e2010-09-29 20:26:131036 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531037
1038 // First 4 requests don't have to wait, and finish in order.
1039 EXPECT_EQ(1, GetOrderOfRequest(1));
1040 EXPECT_EQ(2, GetOrderOfRequest(2));
1041 EXPECT_EQ(3, GetOrderOfRequest(3));
1042 EXPECT_EQ(4, GetOrderOfRequest(4));
1043
Matt Menkec6b3edf72019-03-19 17:00:391044 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1045 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531046 EXPECT_EQ(7, GetOrderOfRequest(5));
1047 EXPECT_EQ(6, GetOrderOfRequest(6));
1048 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171049
1050 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131051 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531052}
1053
rdsmith29dbad12017-02-17 02:22:181054// Test reprioritizing a request before completion doesn't interfere with
1055// its completion.
1056TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1057 CreatePool(kDefaultMaxSockets, 1);
1058
Matt Menkec6b3edf72019-03-19 17:00:391059 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1060 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181061 EXPECT_TRUE(request(0)->handle()->socket());
1062 EXPECT_FALSE(request(1)->handle()->socket());
1063
Lily Chenecebf932018-11-02 17:15:431064 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181065
1066 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1067
1068 EXPECT_TRUE(request(1)->handle()->socket());
1069}
1070
1071// Reprioritize a request up past another one and make sure that changes the
1072// completion order.
1073TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1074 CreatePool(kDefaultMaxSockets, 1);
1075
Matt Menkec6b3edf72019-03-19 17:00:391076 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1077 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1078 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181079 EXPECT_TRUE(request(0)->handle()->socket());
1080 EXPECT_FALSE(request(1)->handle()->socket());
1081 EXPECT_FALSE(request(2)->handle()->socket());
1082
1083 request(2)->handle()->SetPriority(HIGHEST);
1084
1085 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1086
1087 EXPECT_EQ(1, GetOrderOfRequest(1));
1088 EXPECT_EQ(3, GetOrderOfRequest(2));
1089 EXPECT_EQ(2, GetOrderOfRequest(3));
1090}
1091
1092// Reprioritize a request without changing relative priorities and check
1093// that the order doesn't change.
1094TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1095 CreatePool(kDefaultMaxSockets, 1);
1096
Matt Menkec6b3edf72019-03-19 17:00:391097 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1098 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1099 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181100 EXPECT_TRUE(request(0)->handle()->socket());
1101 EXPECT_FALSE(request(1)->handle()->socket());
1102 EXPECT_FALSE(request(2)->handle()->socket());
1103
1104 request(2)->handle()->SetPriority(MEDIUM);
1105
1106 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1107
1108 EXPECT_EQ(1, GetOrderOfRequest(1));
1109 EXPECT_EQ(2, GetOrderOfRequest(2));
1110 EXPECT_EQ(3, GetOrderOfRequest(3));
1111}
1112
1113// Reprioritize a request past down another one and make sure that changes the
1114// completion order.
1115TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1116 CreatePool(kDefaultMaxSockets, 1);
1117
Matt Menkec6b3edf72019-03-19 17:00:391118 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1119 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1120 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181121 EXPECT_TRUE(request(0)->handle()->socket());
1122 EXPECT_FALSE(request(1)->handle()->socket());
1123 EXPECT_FALSE(request(2)->handle()->socket());
1124
1125 request(1)->handle()->SetPriority(LOW);
1126
1127 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1128
1129 EXPECT_EQ(1, GetOrderOfRequest(1));
1130 EXPECT_EQ(3, GetOrderOfRequest(2));
1131 EXPECT_EQ(2, GetOrderOfRequest(3));
1132}
1133
1134// Reprioritize a request to the same level as another and confirm it is
1135// put after the old request.
1136TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1137 CreatePool(kDefaultMaxSockets, 1);
1138
Matt Menkec6b3edf72019-03-19 17:00:391139 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1140 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1141 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181142 EXPECT_TRUE(request(0)->handle()->socket());
1143 EXPECT_FALSE(request(1)->handle()->socket());
1144 EXPECT_FALSE(request(2)->handle()->socket());
1145
1146 request(1)->handle()->SetPriority(MEDIUM);
1147
1148 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1149
1150 EXPECT_EQ(1, GetOrderOfRequest(1));
1151 EXPECT_EQ(3, GetOrderOfRequest(2));
1152 EXPECT_EQ(2, GetOrderOfRequest(3));
1153}
1154
[email protected]211d21722009-07-22 15:48:531155TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1156 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1157
Matt Menkec6b3edf72019-03-19 17:00:391158 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1159 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1160 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1161 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531162
[email protected]2431756e2010-09-29 20:26:131163 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531164 client_socket_factory_.allocation_count());
1165
Matt Menkec6b3edf72019-03-19 17:00:391166 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1167 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1168 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531169
[email protected]2431756e2010-09-29 20:26:131170 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531171
[email protected]2431756e2010-09-29 20:26:131172 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531173 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131174 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531175
1176 // First 4 requests don't have to wait, and finish in order.
1177 EXPECT_EQ(1, GetOrderOfRequest(1));
1178 EXPECT_EQ(2, GetOrderOfRequest(2));
1179 EXPECT_EQ(3, GetOrderOfRequest(3));
1180 EXPECT_EQ(4, GetOrderOfRequest(4));
1181
1182 // Request ("b", 7) has the highest priority, but we can't make new socket for
1183 // group "b", because it has reached the per-group limit. Then we make
1184 // socket for ("c", 6), because it has higher priority than ("a", 4),
1185 // and we still can't make a socket for group "b".
1186 EXPECT_EQ(5, GetOrderOfRequest(5));
1187 EXPECT_EQ(6, GetOrderOfRequest(6));
1188 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171189
1190 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131191 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531192}
1193
1194// Make sure that we count connecting sockets against the total limit.
1195TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1196 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1197
Matt Menkec6b3edf72019-03-19 17:00:391198 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1199 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1200 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531201
1202 // Create one asynchronous request.
1203 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391204 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1205 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531206
[email protected]6b175382009-10-13 06:47:471207 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1208 // actually become pending until 2ms after they have been created. In order
1209 // to flush all tasks, we need to wait so that we know there are no
1210 // soon-to-be-pending tasks waiting.
Peter Kastinge5a38ed2021-10-02 03:06:351211 FastForwardBy(base::Milliseconds(10));
[email protected]6b175382009-10-13 06:47:471212
[email protected]211d21722009-07-22 15:48:531213 // The next synchronous request should wait for its turn.
1214 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391215 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1216 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531217
[email protected]2431756e2010-09-29 20:26:131218 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531219
[email protected]2431756e2010-09-29 20:26:131220 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531221 client_socket_factory_.allocation_count());
1222
1223 EXPECT_EQ(1, GetOrderOfRequest(1));
1224 EXPECT_EQ(2, GetOrderOfRequest(2));
1225 EXPECT_EQ(3, GetOrderOfRequest(3));
1226 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171227 EXPECT_EQ(5, GetOrderOfRequest(5));
1228
1229 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131230 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531231}
1232
[email protected]6427fe22010-04-16 22:27:411233TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1234 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1235 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1236
Matt Menkec6b3edf72019-03-19 17:00:391237 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1238 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1239 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1240 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411241
1242 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1243
1244 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1245
Matt Menkec6b3edf72019-03-19 17:00:391246 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1247 IsError(ERR_IO_PENDING));
1248 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1249 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411250
1251 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1252
[email protected]2431756e2010-09-29 20:26:131253 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411254 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[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 + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131257 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1258 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411259 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1260}
1261
[email protected]d7027bb2010-05-10 18:58:541262TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1263 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1264 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1265
1266 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521267 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501268 EXPECT_EQ(
1269 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521270 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281271 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1272 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1273 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541274
1275 ClientSocketHandle handles[4];
Daniel Cheng5feb16f2022-02-28 06:52:071276 for (size_t i = 0; i < std::size(handles); ++i) {
Matt Menke28ac03e2019-02-25 22:25:501277 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391278 handles[i].Init(
Anton Bikineev068d2912021-05-15 20:43:521279 TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281280 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1281 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1282 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541283 }
1284
1285 // One will be stalled, cancel all the handles now.
1286 // This should hit the OnAvailableSocketSlot() code where we previously had
1287 // stalled groups, but no longer have any.
Daniel Cheng5feb16f2022-02-28 06:52:071288 for (size_t i = 0; i < std::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541289 handles[i].Reset();
1290}
1291
[email protected]eb5a99382010-07-11 03:18:261292TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541293 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1294 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1295
[email protected]eb5a99382010-07-11 03:18:261296 {
1297 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521298 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261299 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Eric Ortha2e7773212021-06-22 21:49:551300 EXPECT_EQ(OK, handles[i].Init(TestGroupId("a" + base::NumberToString(i)),
1301 params_, absl::nullopt, DEFAULT_PRIORITY,
1302 SocketTag(),
1303 ClientSocketPool::RespectLimits::ENABLED,
1304 callbacks[i].callback(),
1305 ClientSocketPool::ProxyAuthCallback(),
1306 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261307 }
1308
1309 // Force a stalled group.
1310 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521311 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201312 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391313 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521314 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281315 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1316 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1317 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261318
1319 // Cancel the stalled request.
1320 stalled_handle.Reset();
1321
1322 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1323 EXPECT_EQ(0, pool_->IdleSocketCount());
1324
1325 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541326 }
1327
[email protected]43a21b82010-06-10 21:30:541328 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1329 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261330}
[email protected]43a21b82010-06-10 21:30:541331
[email protected]eb5a99382010-07-11 03:18:261332TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1333 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1334 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1335
1336 {
1337 ClientSocketHandle handles[kDefaultMaxSockets];
1338 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521339 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201340 EXPECT_EQ(ERR_IO_PENDING,
Eric Ortha2e7773212021-06-22 21:49:551341 handles[i].Init(
1342 TestGroupId("a" + base::NumberToString(i)), params_,
1343 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1344 ClientSocketPool::RespectLimits::ENABLED,
1345 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1346 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261347 }
1348
1349 // Force a stalled group.
1350 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1351 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521352 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201353 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391354 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521355 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281356 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1357 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1358 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261359
1360 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261361 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1362 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1363 TestGroupId("foo")));
1364 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1365 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261366
1367 // Cancel the stalled request.
1368 handles[0].Reset();
1369
[email protected]eb5a99382010-07-11 03:18:261370 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261371 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1372 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1373 TestGroupId("foo")));
1374 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1375 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261376
1377 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011378 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261379
1380 EXPECT_EQ(kDefaultMaxSockets + 1,
1381 client_socket_factory_.allocation_count());
1382 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261383 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1384 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1385 TestGroupId("foo")));
1386 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1387 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261388
1389 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541390 }
1391
[email protected]eb5a99382010-07-11 03:18:261392 EXPECT_EQ(1, pool_->IdleSocketCount());
1393}
[email protected]43a21b82010-06-10 21:30:541394
[email protected]eb5a99382010-07-11 03:18:261395TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1396 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1397 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541398
[email protected]eb5a99382010-07-11 03:18:261399 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521400 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261401 {
[email protected]51fdc7c2012-04-10 19:19:481402 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261403 ClientSocketHandle handles[kDefaultMaxSockets];
1404 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:391405 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281406 OK, handles[i].Init(
Eric Ortha2e7773212021-06-22 21:49:551407 TestGroupId(base::StringPrintf("take-2-%d", i)), params_,
Anton Bikineev068d2912021-05-15 20:43:521408 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:281409 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1410 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1411 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261412 }
1413
1414 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1415 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481416 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261417
1418 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201419 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391420 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521421 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281422 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1423 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1424 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481425 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261426
1427 // Dropping out of scope will close all handles and return them to idle.
1428 }
[email protected]43a21b82010-06-10 21:30:541429
1430 // But if we wait for it, the released idle sockets will be closed in
1431 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011432 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261433
1434 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1435 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541436}
1437
1438// Regression test for http://crbug.com/40952.
1439TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261440 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1441 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541442 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1443
1444 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1445 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521446 TestCompletionCallback callback;
Eric Ortha2e7773212021-06-22 21:49:551447 EXPECT_EQ(
1448 OK,
1449 handle.Init(TestGroupId("a" + base::NumberToString(i)), params_,
1450 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1451 ClientSocketPool::RespectLimits::ENABLED,
1452 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1453 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541454 }
1455
1456 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281457 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541458
1459 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1460 // reuse a socket.
1461 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1462 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521463 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541464
Eric Ortha2e7773212021-06-22 21:49:551465 // "a0" is special here, since it should be the first entry in the sorted map,
[email protected]43a21b82010-06-10 21:30:541466 // which is the one which we would close an idle socket for. We shouldn't
1467 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391468 EXPECT_EQ(OK, handle.Init(
Eric Ortha2e7773212021-06-22 21:49:551469 TestGroupId("a0"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281470 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391471 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1472 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541473
1474 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1475 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1476}
1477
[email protected]ab838892009-06-30 18:49:051478TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531479 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091480
Matt Menkec6b3edf72019-03-19 17:00:391481 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1482 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1483 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1484 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1485 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1486 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1487 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1488 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091489
[email protected]2431756e2010-09-29 20:26:131490 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201491 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1492 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131493 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1494 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091495
[email protected]c9d6a1d2009-07-14 16:15:201496 EXPECT_EQ(1, GetOrderOfRequest(1));
1497 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031498 EXPECT_EQ(8, GetOrderOfRequest(3));
1499 EXPECT_EQ(6, GetOrderOfRequest(4));
1500 EXPECT_EQ(4, GetOrderOfRequest(5));
1501 EXPECT_EQ(3, GetOrderOfRequest(6));
1502 EXPECT_EQ(5, GetOrderOfRequest(7));
1503 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171504
1505 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131506 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091507}
1508
[email protected]ab838892009-06-30 18:49:051509TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531510 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091511
Matt Menkec6b3edf72019-03-19 17:00:391512 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1513 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1514 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1515 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1516 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1517 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1518 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091519
[email protected]2431756e2010-09-29 20:26:131520 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091521
[email protected]2431756e2010-09-29 20:26:131522 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011523 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201524
[email protected]2431756e2010-09-29 20:26:131525 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201526 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131527 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1528 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091529}
1530
Matt Menke7eb405e2019-04-25 20:48:211531TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1532 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1533
1534 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1535 ClientSocketHandle handle;
1536 TestCompletionCallback callback;
1537 EXPECT_EQ(
1538 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521539 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke7eb405e2019-04-25 20:48:211540 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1541 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1542 pool_.get(), NetLogWithSource()));
1543
1544 EXPECT_THAT(callback.WaitForResult(), IsOk());
1545 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1546 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1547 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1548 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1549
1550 handle.ResetAndCloseSocket();
1551 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1552}
1553
Matt Menke99251ea42019-04-25 22:59:021554// This test will start up a socket request and then call Reset() on the handle.
1555// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211556TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531557 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201558
[email protected]ab838892009-06-30 18:49:051559 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131560 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521561 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501562 EXPECT_EQ(
1563 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521564 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281565 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1566 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1567 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131568 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211569 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1570 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1571}
1572
Matt Menke99251ea42019-04-25 22:59:021573// This test will start up a socket request and then call ResetAndCloseSocket()
1574// on the handle. The pending ConnectJob or connected socket should be
1575// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211576TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1577 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1578
Matt Menke99251ea42019-04-25 22:59:021579 // When true, the socket connects before it's canceled.
1580 for (bool cancel_when_callback_pending : {false, true}) {
1581 if (cancel_when_callback_pending) {
1582 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1583 } else {
1584 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1585 }
1586 ClientSocketHandle handle;
1587 TestCompletionCallback callback;
1588 EXPECT_EQ(
1589 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521590 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021591 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1592 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1593 pool_.get(), NetLogWithSource()));
1594 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1595 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1596
1597 if (cancel_when_callback_pending) {
1598 client_socket_factory_.SignalJobs();
1599 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1600 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1601 }
1602
1603 handle.ResetAndCloseSocket();
1604 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1605 }
Matt Menke7eb405e2019-04-25 20:48:211606}
1607
1608TEST_F(ClientSocketPoolBaseTest,
1609 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1610 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1611
Matt Menke99251ea42019-04-25 22:59:021612 // When true, the sockets connect before they're canceled.
1613 for (bool cancel_when_callback_pending : {false, true}) {
1614 if (cancel_when_callback_pending) {
1615 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1616 } else {
1617 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1618 }
Matt Menke7eb405e2019-04-25 20:48:211619
Matt Menke99251ea42019-04-25 22:59:021620 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1621 TestCompletionCallback callback;
1622 // Make |kDefaultMaxSockets + 1| socket requests.
1623 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1624 std::unique_ptr<ClientSocketHandle> handle =
1625 std::make_unique<ClientSocketHandle>();
1626 EXPECT_EQ(ERR_IO_PENDING,
1627 handle->Init(
Anton Bikineev068d2912021-05-15 20:43:521628 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021629 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1630 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1631 pool_.get(), NetLogWithSource()));
1632 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211633 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021634 EXPECT_EQ(
1635 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1636 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1637 }
1638
1639 if (cancel_when_callback_pending) {
1640 client_socket_factory_.SignalJobs();
1641 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1642 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1643 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1644 }
1645
1646 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1647 // or close a socket, since there are more requests than ConnectJobs or
1648 // sockets.
1649 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1650 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1651 if (cancel_when_callback_pending) {
1652 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1653 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1654 } else {
1655 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211656 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1657 }
Matt Menke99251ea42019-04-25 22:59:021658
1659 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1660 // or close a socket.
1661 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1662 handles[i]->ResetAndCloseSocket();
1663 if (i > 0) {
1664 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1665 if (cancel_when_callback_pending) {
1666 EXPECT_EQ(i,
1667 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1668 } else {
1669 EXPECT_EQ(static_cast<size_t>(i),
1670 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1671 }
1672 } else {
1673 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1674 }
1675 }
Matt Menke7eb405e2019-04-25 20:48:211676 }
[email protected]f6d1d6eb2009-06-24 20:16:091677}
1678
[email protected]ab838892009-06-30 18:49:051679TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531680 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201681
[email protected]ab838892009-06-30 18:49:051682 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061683 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521684 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091685
Matt Menke28ac03e2019-02-25 22:25:501686 EXPECT_EQ(
1687 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521688 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281689 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1690 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1691 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091692
1693 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211694 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1695 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091696
Matt Menke7eb405e2019-04-25 20:48:211697 // This will create a second ConnectJob, since the other ConnectJob was
1698 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521699 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501700 EXPECT_EQ(
1701 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521702 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281703 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501704 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1705 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091706
Matt Menke7eb405e2019-04-25 20:48:211707 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1708 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1709
robpercival214763f2016-07-01 23:27:011710 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091711 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211712 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1713 // One ConnectJob completed, and its socket is now assigned to |handle|.
1714 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1715 // The other ConnectJob should have either completed, or still be connecting.
1716 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1717 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091718
1719 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211720 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1721 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1722 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1723 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091724}
1725
[email protected]ab838892009-06-30 18:49:051726TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531727 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091728
Matt Menkec6b3edf72019-03-19 17:00:391729 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1730 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1731 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1732 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1733 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1734 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1735 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091736
1737 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201738 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131739 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1740 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091741
[email protected]2431756e2010-09-29 20:26:131742 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091743
[email protected]c9d6a1d2009-07-14 16:15:201744 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1745 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131746 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1747 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091748
[email protected]c9d6a1d2009-07-14 16:15:201749 EXPECT_EQ(1, GetOrderOfRequest(1));
1750 EXPECT_EQ(2, GetOrderOfRequest(2));
1751 EXPECT_EQ(5, GetOrderOfRequest(3));
1752 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131753 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1754 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201755 EXPECT_EQ(4, GetOrderOfRequest(6));
1756 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171757
1758 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131759 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091760}
1761
mmenke33d24423d2015-05-19 19:41:091762// Function to be used as a callback on socket request completion. It first
1763// disconnects the successfully connected socket from the first request, and
1764// then reuses the ClientSocketHandle to request another socket.
1765//
1766// |nested_callback| is called with the result of the second socket request.
1767void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261768 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091769 TestConnectJobFactory* test_connect_job_factory,
1770 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411771 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091772 int first_request_result) {
robpercival214763f2016-07-01 23:27:011773 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091774
1775 test_connect_job_factory->set_job_type(next_job_type);
1776
1777 // Don't allow reuse of the socket. Disconnect it and then release it.
1778 if (handle->socket())
1779 handle->socket()->Disconnect();
1780 handle->Reset();
1781
mmenke33d24423d2015-05-19 19:41:091782 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501783 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031784 TestGroupId("a"),
Anton Bikineev068d2912021-05-15 20:43:521785 ClientSocketPool::SocketParams::CreateForHttpForTesting(), absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:281786 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031787 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1788 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091789 if (rv != ERR_IO_PENDING) {
1790 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411791 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091792 } else {
1793 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521794 }
mmenke33d24423d2015-05-19 19:41:091795}
[email protected]f6d1d6eb2009-06-24 20:16:091796
mmenke33d24423d2015-05-19 19:41:091797// Tests the case where a second socket is requested in a completion callback,
1798// and the second socket connects asynchronously. Reuses the same
1799// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581800TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531801 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201802
[email protected]0b7648c2009-07-06 20:14:011803 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061804 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091805 TestCompletionCallback second_result_callback;
1806 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521807 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541808 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501809 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1810 connect_job_factory_, TestConnectJob::kMockPendingJob,
1811 &second_result_callback),
1812 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011813 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091814
robpercival214763f2016-07-01 23:27:011815 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581816}
[email protected]f6d1d6eb2009-06-24 20:16:091817
mmenke33d24423d2015-05-19 19:41:091818// Tests the case where a second socket is requested in a completion callback,
1819// and the second socket connects synchronously. Reuses the same
1820// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581821TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531822 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201823
[email protected]0b7648c2009-07-06 20:14:011824 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061825 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091826 TestCompletionCallback second_result_callback;
1827 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521828 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541829 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501830 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1831 connect_job_factory_, TestConnectJob::kMockPendingJob,
1832 &second_result_callback),
1833 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011834 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581835
robpercival214763f2016-07-01 23:27:011836 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091837}
1838
1839// Make sure that pending requests get serviced after active requests get
1840// cancelled.
[email protected]ab838892009-06-30 18:49:051841TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531842 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201843
[email protected]0b7648c2009-07-06 20:14:011844 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091845
Matt Menkec6b3edf72019-03-19 17:00:391846 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1847 IsError(ERR_IO_PENDING));
1848 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1849 IsError(ERR_IO_PENDING));
1850 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1851 IsError(ERR_IO_PENDING));
1852 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1853 IsError(ERR_IO_PENDING));
1854 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1855 IsError(ERR_IO_PENDING));
1856 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1857 IsError(ERR_IO_PENDING));
1858 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1859 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091860
[email protected]c9d6a1d2009-07-14 16:15:201861 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1862 // Let's cancel them.
1863 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131864 ASSERT_FALSE(request(i)->handle()->is_initialized());
1865 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091866 }
1867
[email protected]f6d1d6eb2009-06-24 20:16:091868 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131869 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011870 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131871 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091872 }
1873
[email protected]2431756e2010-09-29 20:26:131874 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1875 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091876}
1877
1878// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051879TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531880 const size_t kMaxSockets = 5;
1881 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201882
[email protected]0b7648c2009-07-06 20:14:011883 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091884
[email protected]211d21722009-07-22 15:48:531885 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1886 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091887
1888 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531889 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391890 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1891 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091892
[email protected]211d21722009-07-22 15:48:531893 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011894 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091895}
1896
mmenke9d72fe42017-05-18 22:36:071897// Make sure that pending requests that complete synchronously get serviced
1898// after active requests fail. See https://crbug.com/723748
1899TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1900 const size_t kNumberOfRequests = 10;
1901 const size_t kMaxSockets = 1;
1902 CreatePool(kMaxSockets, kMaxSockets);
1903
1904 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1905
Matt Menkec6b3edf72019-03-19 17:00:391906 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1907 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071908
1909 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1910
1911 // Queue up all the other requests
1912 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391913 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1914 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071915
1916 // Make sure all requests fail, instead of hanging.
1917 for (size_t i = 0; i < kNumberOfRequests; ++i)
1918 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1919}
1920
[email protected]5fc08e32009-07-15 17:09:571921TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531922 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571923
1924 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1925
[email protected]2431756e2010-09-29 20:26:131926 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521927 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501928 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521929 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501930 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1931 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011932 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571933
1934 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131935 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571936
Anton Bikineev068d2912021-05-15 20:43:521937 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281938 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501939 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1940 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011941 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1942 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571943
[email protected]2431756e2010-09-29 20:26:131944 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481945 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571946 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1947}
1948
xunjieli26619e72016-11-23 19:39:551949TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
Matt Menke433de6d2020-03-04 00:24:111950 const char kReason[] = "Really nifty reason";
1951
xunjieli26619e72016-11-23 19:39:551952 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1953 ClientSocketHandle handle;
1954 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261955 int rv =
1956 handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
1957 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1958 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1959 NetLogWithSource::Make(NetLogSourceType::NONE));
xunjieli26619e72016-11-23 19:39:551960 EXPECT_THAT(rv, IsOk());
Matt Menke433de6d2020-03-04 00:24:111961 ASSERT_TRUE(handle.socket());
1962 NetLogSource source = handle.socket()->NetLog().source();
xunjieli26619e72016-11-23 19:39:551963 handle.Reset();
1964 EXPECT_EQ(1, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111965 pool_->CloseIdleSockets(kReason);
1966 ExpectSocketClosedWithReason(source, kReason);
xunjieli26619e72016-11-23 19:39:551967}
1968
xunjieli92feb332017-03-03 17:19:231969TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231970 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1971 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261972 NetLogWithSource net_log_with_source =
1973 NetLogWithSource::Make(NetLogSourceType::NONE);
xunjieli92feb332017-03-03 17:19:231974 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501975 int rv = handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:521976 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501977 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261978 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231979 EXPECT_THAT(rv, IsOk());
1980 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:521981 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281982 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501983 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261984 pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231985 ClientSocketHandle handle3;
Anton Bikineev068d2912021-05-15 20:43:521986 rv = handle3.Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281987 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501988 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261989 pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231990 EXPECT_THAT(rv, IsOk());
1991 handle1.Reset();
1992 handle2.Reset();
1993 handle3.Reset();
1994 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111995 pool_->CloseIdleSocketsInGroup(TestGroupId("a"), "Very good reason");
xunjieli92feb332017-03-03 17:19:231996 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231997}
1998
xunjieli26619e72016-11-23 19:39:551999TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:552000 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2001 ClientSocketHandle handle;
2002 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262003 NetLogWithSource net_log_with_source =
2004 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502005 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522006 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502007 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262008 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
xunjieli26619e72016-11-23 19:39:552009 EXPECT_THAT(rv, IsOk());
2010 StreamSocket* socket = handle.socket();
Matt Menke433de6d2020-03-04 00:24:112011 ASSERT_TRUE(socket);
xunjieli26619e72016-11-23 19:39:552012 handle.Reset();
2013 EXPECT_EQ(1, pool_->IdleSocketCount());
2014
2015 // Disconnect socket now to make the socket unusable.
Matt Menke433de6d2020-03-04 00:24:112016 NetLogSource source = socket->NetLog().source();
xunjieli26619e72016-11-23 19:39:552017 socket->Disconnect();
2018 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:522019 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282020 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502021 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262022 pool_.get(), net_log_with_source);
xunjieli26619e72016-11-23 19:39:552023 EXPECT_THAT(rv, IsOk());
2024 EXPECT_FALSE(handle2.is_reused());
Matt Menke433de6d2020-03-04 00:24:112025
2026 // This is admittedly not an accurate error in this case, but normally code
2027 // doesn't secretly keep a raw pointers to sockets returned to the socket pool
2028 // and close them out of band, so discovering an idle socket was closed when
2029 // trying to reuse it normally means it was closed by the remote side.
2030 ExpectSocketClosedWithReason(
2031 source, TransportClientSocketPool::kRemoteSideClosedConnection);
xunjieli26619e72016-11-23 19:39:552032}
2033
[email protected]2b7523d2009-07-29 20:29:232034// Regression test for http://crbug.com/17985.
2035TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
2036 const int kMaxSockets = 3;
2037 const int kMaxSocketsPerGroup = 2;
2038 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
2039
[email protected]ac790b42009-12-02 04:31:312040 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:232041
Matt Menkec6b3edf72019-03-19 17:00:392042 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2043 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232044
2045 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:392046 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2047 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232048
2049 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:392050 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232051
2052 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:392053 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2054 IsError(ERR_IO_PENDING));
2055 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2056 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232057
Matt Menkec6b3edf72019-03-19 17:00:392058 // Release the first two sockets from TestGroupId("a"). Because this is a
2059 // keepalive, the first release will unblock the pending request for
2060 // TestGroupId("a"). The second release will unblock a request for "c",
2061 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:132062 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
2063 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:232064
2065 // Closing idle sockets should not get us into trouble, but in the bug
2066 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:392067 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke433de6d2020-03-04 00:24:112068 pool_->CloseIdleSockets("Very good reason");
[email protected]eb5a99382010-07-11 03:18:262069
[email protected]2da659e2013-05-23 20:51:342070 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282071 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232072}
2073
[email protected]4d3b05d2010-01-27 21:27:292074TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532075 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572076
2077 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132078 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522079 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262080 NetLogWithSource net_log_with_source =
2081 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502082 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522083 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502084 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262085 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
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
Matt Reichhoff0049a0b72021-10-20 20:44:262099 auto entries =
2100 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:402101
Matt Menke9fa17d52019-03-25 19:12:262102 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172103 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262104 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002105 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262106 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2107 EXPECT_TRUE(LogContainsEvent(
2108 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2109 NetLogEventPhase::NONE));
2110 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002111 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2112 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262113 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572114}
2115
[email protected]4d3b05d2010-01-27 21:27:292116TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572117 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532118 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572119
2120 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132121 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522122 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262123 NetLogWithSource net_log_with_source =
2124 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]e60e47a2010-07-14 03:37:182125 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132126 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512127 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502128 EXPECT_EQ(
2129 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522130 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282131 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2132 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262133 pool_.get(), net_log_with_source));
Matt Menkec6b3edf72019-03-19 17:00:392134 EXPECT_EQ(LOAD_STATE_CONNECTING,
2135 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012136 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132137 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512138 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302139
Matt Reichhoff0049a0b72021-10-20 20:44:262140 auto entries =
2141 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:402142
Matt Menke9fa17d52019-03-25 19:12:262143 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172144 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262145 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002146 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262147 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2148 EXPECT_TRUE(LogContainsEvent(
2149 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2150 NetLogEventPhase::NONE));
2151 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572152}
2153
mmenke6be122f2015-03-09 22:22:472154// Check that an async ConnectJob failure does not result in creation of a new
2155// ConnectJob when there's another pending request also waiting on its own
2156// ConnectJob. See http://crbug.com/463960.
2157TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2158 CreatePool(2, 2);
2159 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2160
Matt Menkec6b3edf72019-03-19 17:00:392161 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2162 IsError(ERR_IO_PENDING));
2163 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2164 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472165
robpercival214763f2016-07-01 23:27:012166 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2167 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472168
2169 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2170}
2171
[email protected]4d3b05d2010-01-27 21:27:292172TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102173 // TODO(eroman): Add back the log expectations! Removed them because the
2174 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532175 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572176
2177 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132178 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522179 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132180 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522181 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572182
Matt Menke28ac03e2019-02-25 22:25:502183 EXPECT_EQ(
2184 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522185 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282186 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2187 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2188 pool_.get(), NetLogWithSource()));
Matt Reichhoff0049a0b72021-10-20 20:44:262189 RecordingNetLogObserver log2;
tfarina428341112016-09-22 13:38:202190 EXPECT_EQ(
2191 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522192 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282193 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502194 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2195 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572196
[email protected]2431756e2010-09-29 20:26:132197 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572198
[email protected]fd7b7c92009-08-20 19:38:302199
2200 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302201
robpercival214763f2016-07-01 23:27:012202 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132203 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302204
2205 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532206 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572207}
2208
[email protected]4d3b05d2010-01-27 21:27:292209TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342210 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2211
[email protected]17a0c6c2009-08-04 00:07:042212 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2213
Matt Menkec6b3edf72019-03-19 17:00:392214 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2215 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2216 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2217 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342218
Raul Tambre8335a6d2019-02-21 16:57:432219 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262220 static_cast<int>(
2221 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132222 (*requests())[2]->handle()->Reset();
2223 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432224 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262225 static_cast<int>(
2226 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342227
[email protected]2431756e2010-09-29 20:26:132228 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432229 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262230 static_cast<int>(
2231 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342232
[email protected]2431756e2010-09-29 20:26:132233 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432234 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262235 static_cast<int>(
2236 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342237}
2238
[email protected]5fc08e32009-07-15 17:09:572239// When requests and ConnectJobs are not coupled, the request will get serviced
2240// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292241TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532242 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572243
2244 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322245 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572246
[email protected]2431756e2010-09-29 20:26:132247 std::vector<TestSocketRequest*> request_order;
2248 size_t completion_count; // unused
2249 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502250 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522251 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502252 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2253 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012254 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2255 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572256
2257 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2258 // without a job.
2259 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2260
[email protected]2431756e2010-09-29 20:26:132261 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502262 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522263 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502264 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2265 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012266 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132267 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502268 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522269 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502270 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2271 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012272 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572273
2274 // Both Requests 2 and 3 are pending. We release socket 1 which should
2275 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332276 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342277 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282278 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332279 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012280 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332281 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572282
2283 // Signal job 2, which should service request 3.
2284
2285 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012286 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572287
Raul Tambre8335a6d2019-02-21 16:57:432288 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132289 EXPECT_EQ(&req1, request_order[0]);
2290 EXPECT_EQ(&req2, request_order[1]);
2291 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392292 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572293}
2294
2295// The requests are not coupled to the jobs. So, the requests should finish in
2296// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292297TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532298 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572299 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322300 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572301
[email protected]2431756e2010-09-29 20:26:132302 std::vector<TestSocketRequest*> request_order;
2303 size_t completion_count; // unused
2304 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502305 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522306 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502307 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2308 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012309 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572310
[email protected]2431756e2010-09-29 20:26:132311 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502312 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522313 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502314 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2315 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012316 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572317
2318 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322319 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572320
[email protected]2431756e2010-09-29 20:26:132321 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502322 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522323 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502324 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2325 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012326 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572327
robpercival214763f2016-07-01 23:27:012328 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2329 EXPECT_THAT(req2.WaitForResult(), IsOk());
2330 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572331
Raul Tambre8335a6d2019-02-21 16:57:432332 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132333 EXPECT_EQ(&req1, request_order[0]);
2334 EXPECT_EQ(&req2, request_order[1]);
2335 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572336}
2337
[email protected]03b7c8c2013-07-20 04:38:552338// Test GetLoadState in the case there's only one socket request.
2339TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532340 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552341 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572342
[email protected]2431756e2010-09-29 20:26:132343 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522344 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502345 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522346 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502347 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2348 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012349 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552350 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572351
[email protected]03b7c8c2013-07-20 04:38:552352 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2353 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2354
2355 // No point in completing the connection, since ClientSocketHandles only
2356 // expect the LoadState to be checked while connecting.
2357}
2358
2359// Test GetLoadState in the case there are two socket requests.
2360TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2361 CreatePool(2, 2);
2362 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2363
2364 ClientSocketHandle handle;
2365 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502366 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522367 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502368 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2369 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012370 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002371 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2372
2373 ClientSocketHandle handle2;
2374 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522375 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282376 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502377 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2378 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012379 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002380 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2381
Matt Menke4b69f932019-03-04 16:20:012382 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002383 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2384 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2385
Matt Menke4b69f932019-03-04 16:20:012386 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002387 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2388
Matt Menke4b69f932019-03-04 16:20:012389 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002390 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002391 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012392
2393 // Update the state of the second job.
2394 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2395
2396 // Only the state of the second request should have changed.
2397 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2398 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2399
2400 // Second job connects and the first request gets the socket. The
2401 // second handle switches to the state of the remaining ConnectJob.
2402 client_socket_factory_.SignalJob(1);
2403 EXPECT_THAT(callback.WaitForResult(), IsOk());
2404 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552405}
2406
2407// Test GetLoadState in the case the per-group limit is reached.
2408TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2409 CreatePool(2, 1);
2410 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2411
2412 ClientSocketHandle handle;
2413 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502414 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522415 TestGroupId("a"), params_, absl::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502416 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2417 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012418 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552419 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2420
2421 // Request another socket from the same pool, buth with a higher priority.
2422 // The first request should now be stalled at the socket group limit.
2423 ClientSocketHandle handle2;
2424 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522425 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:282426 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502427 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2428 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012429 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552430 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2431 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2432
2433 // The first handle should remain stalled as the other socket goes through
2434 // the connect process.
2435
2436 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2437 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2438 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2439
2440 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012441 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552442 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2443
2444 // Closing the second socket should cause the stalled handle to finally get a
2445 // ConnectJob.
2446 handle2.socket()->Disconnect();
2447 handle2.Reset();
2448 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2449}
2450
2451// Test GetLoadState in the case the per-pool limit is reached.
2452TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2453 CreatePool(2, 2);
2454 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2455
2456 ClientSocketHandle handle;
2457 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502458 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522459 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502460 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2461 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012462 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552463
2464 // Request for socket from another pool.
2465 ClientSocketHandle handle2;
2466 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522467 rv = handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282468 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502469 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2470 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012471 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552472
2473 // Request another socket from the first pool. Request should stall at the
2474 // socket pool limit.
2475 ClientSocketHandle handle3;
2476 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522477 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282478 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502479 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2480 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012481 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552482
2483 // The third handle should remain stalled as the other sockets in its group
2484 // goes through the connect process.
2485
2486 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2487 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2488
2489 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2490 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2491 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2492
2493 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012494 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552495 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2496
2497 // Closing a socket should allow the stalled handle to finally get a new
2498 // ConnectJob.
2499 handle.socket()->Disconnect();
2500 handle.Reset();
2501 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572502}
2503
Matt Menkeb57663b32019-03-01 17:17:102504TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132505 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102506 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132507
[email protected]2431756e2010-09-29 20:26:132508 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522509 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502510 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102511 ERR_CERT_COMMON_NAME_INVALID,
Anton Bikineev068d2912021-05-15 20:43:522512 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282513 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2514 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2515 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132516 EXPECT_TRUE(handle.is_initialized());
2517 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132518}
2519
Matt Menkeb57663b32019-03-01 17:17:102520TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132521 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2522
Matt Menkeb57663b32019-03-01 17:17:102523 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132524 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522525 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502526 EXPECT_EQ(
2527 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522528 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282529 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2530 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2531 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392532 EXPECT_EQ(LOAD_STATE_CONNECTING,
2533 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102534 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132535 EXPECT_TRUE(handle.is_initialized());
2536 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132537}
2538
[email protected]e60e47a2010-07-14 03:37:182539TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2540 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2541 connect_job_factory_->set_job_type(
2542 TestConnectJob::kMockAdditionalErrorStateJob);
2543
[email protected]2431756e2010-09-29 20:26:132544 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522545 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502546 EXPECT_EQ(
2547 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:522548 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282549 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2550 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2551 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132552 EXPECT_FALSE(handle.is_initialized());
2553 EXPECT_FALSE(handle.socket());
2554 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512555 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182556}
2557
2558TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2559 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2560
2561 connect_job_factory_->set_job_type(
2562 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132563 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522564 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502565 EXPECT_EQ(
2566 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522567 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282568 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2569 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2570 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392571 EXPECT_EQ(LOAD_STATE_CONNECTING,
2572 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012573 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132574 EXPECT_FALSE(handle.is_initialized());
2575 EXPECT_FALSE(handle.socket());
2576 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512577 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182578}
2579
martijn003cd612016-05-19 22:24:382580// Make sure we can reuse sockets.
2581TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412582 CreatePoolWithIdleTimeouts(
2583 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032584 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352585 base::Days(1)); // Don't time out used sockets.
[email protected]e7b1c6d2c2012-05-05 00:54:032586
2587 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2588
2589 ClientSocketHandle handle;
2590 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502591 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522592 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502593 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2594 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012595 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392596 EXPECT_EQ(LOAD_STATE_CONNECTING,
2597 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012598 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032599
2600 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352601 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382602 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482603 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032604 handle.Reset();
2605
2606 // Should now have one idle socket.
2607 ASSERT_EQ(1, pool_->IdleSocketCount());
2608
2609 // Request a new socket. This should reuse the old socket and complete
2610 // synchronously.
Matt Reichhoff0049a0b72021-10-20 20:44:262611 NetLogWithSource net_log_with_source =
2612 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502613 rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522614 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502615 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262616 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012617 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032618 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482619 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032620
Matt Menke9fa17d52019-03-25 19:12:262621 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392622 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262623 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032624
Matt Reichhoff0049a0b72021-10-20 20:44:262625 auto entries =
2626 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
Matt Menke9fa17d52019-03-25 19:12:262627 EXPECT_TRUE(LogContainsEvent(
2628 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2629 NetLogEventPhase::NONE));
2630 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032631 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262632 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032633}
2634
martijn003cd612016-05-19 22:24:382635// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172636TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032637 CreatePoolWithIdleTimeouts(
2638 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2639 base::TimeDelta(), // Time out unused sockets immediately
2640 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412641
2642 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2643
2644 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2645
2646 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522647 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502648 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522649 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502650 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2651 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012652 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392653 EXPECT_EQ(LOAD_STATE_CONNECTING,
2654 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412655
2656 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522657 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522658 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282659 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502660 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2661 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012662 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392663 EXPECT_EQ(LOAD_STATE_CONNECTING,
2664 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412665
2666 // Cancel one of the requests. Wait for the other, which will get the first
2667 // job. Release the socket. Run the loop again to make sure the second
2668 // socket is sitting idle and the first one is released (since ReleaseSocket()
2669 // just posts a DoReleaseSocket() task).
2670
2671 handle.Reset();
robpercival214763f2016-07-01 23:27:012672 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menke433de6d2020-03-04 00:24:112673 // Get the NetLogSource for the socket, so the time out reason can be checked
2674 // at the end of the test.
2675 NetLogSource net_log_source2 = handle2.socket()->NetLog().source();
[email protected]64770b7d2011-11-16 04:30:412676 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352677 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382678 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412679 handle2.Reset();
2680
[email protected]e7b1c6d2c2012-05-05 00:54:032681 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2682 // actually become pending until 2ms after they have been created. In order
2683 // to flush all tasks, we need to wait so that we know there are no
2684 // soon-to-be-pending tasks waiting.
Peter Kastinge5a38ed2021-10-02 03:06:352685 FastForwardBy(base::Milliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412686
[email protected]e7b1c6d2c2012-05-05 00:54:032687 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412688 ASSERT_EQ(2, pool_->IdleSocketCount());
2689
2690 // Request a new socket. This should cleanup the unused and timed out ones.
2691 // A new socket will be created rather than reusing the idle one.
Matt Reichhoff0049a0b72021-10-20 20:44:262692 NetLogWithSource net_log_with_source =
2693 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]6ecf2b92011-12-15 01:14:522694 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522695 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282696 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502697 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262698 pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012699 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2700 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412701 EXPECT_FALSE(handle.is_reused());
2702
[email protected]e7b1c6d2c2012-05-05 00:54:032703 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262704 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392705 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262706 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412707
Matt Reichhoff0049a0b72021-10-20 20:44:262708 auto entries =
2709 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]64770b7d2011-11-16 04:30:412710 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002711 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
Matt Menke433de6d2020-03-04 00:24:112712 ExpectSocketClosedWithReason(
2713 net_log_source2, TransportClientSocketPool::kIdleTimeLimitExpired);
[email protected]64770b7d2011-11-16 04:30:412714}
2715
[email protected]2041cf342010-02-19 03:15:592716// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162717// because of multiple releasing disconnected sockets.
2718TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2719 CreatePoolWithIdleTimeouts(
2720 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2721 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352722 base::Days(1)); // Don't time out used sockets.
[email protected]4f2abec2010-02-03 18:10:162723
2724 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2725
2726 // Startup 4 connect jobs. Two of them will be pending.
2727
[email protected]2431756e2010-09-29 20:26:132728 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522729 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502730 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522731 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502732 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2733 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012734 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162735
[email protected]2431756e2010-09-29 20:26:132736 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522737 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522738 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282739 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502740 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2741 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012742 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162743
[email protected]2431756e2010-09-29 20:26:132744 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522745 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522746 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282747 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502748 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2749 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012750 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162751
[email protected]2431756e2010-09-29 20:26:132752 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522753 TestCompletionCallback callback4;
Anton Bikineev068d2912021-05-15 20:43:522754 rv = handle4.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282755 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502756 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2757 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012758 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162759
2760 // Release two disconnected sockets.
2761
[email protected]2431756e2010-09-29 20:26:132762 handle.socket()->Disconnect();
2763 handle.Reset();
2764 handle2.socket()->Disconnect();
2765 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162766
robpercival214763f2016-07-01 23:27:012767 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132768 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012769 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132770 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162771}
2772
[email protected]d7027bb2010-05-10 18:58:542773// Regression test for http://crbug.com/42267.
2774// When DoReleaseSocket() is processed for one socket, it is blocked because the
2775// other stalled groups all have releasing sockets, so no progress can be made.
2776TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2777 CreatePoolWithIdleTimeouts(
2778 4 /* socket limit */, 4 /* socket limit per group */,
2779 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352780 base::Days(1)); // Don't time out used sockets.
[email protected]d7027bb2010-05-10 18:58:542781
2782 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2783
2784 // Max out the socket limit with 2 per group.
2785
[email protected]2431756e2010-09-29 20:26:132786 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522787 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132788 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522789 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542790
2791 for (int i = 0; i < 2; ++i) {
Anton Bikineev068d2912021-05-15 20:43:522792 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282793 LOWEST, SocketTag(),
2794 ClientSocketPool::RespectLimits::ENABLED,
2795 callback_a[i].callback(),
2796 ClientSocketPool::ProxyAuthCallback(),
2797 pool_.get(), NetLogWithSource()));
Anton Bikineev068d2912021-05-15 20:43:522798 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282799 LOWEST, SocketTag(),
2800 ClientSocketPool::RespectLimits::ENABLED,
2801 callback_b[i].callback(),
2802 ClientSocketPool::ProxyAuthCallback(),
2803 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542804 }
[email protected]b89f7e42010-05-20 20:37:002805
[email protected]d7027bb2010-05-10 18:58:542806 // Make 4 pending requests, 2 per group.
2807
2808 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282809 EXPECT_EQ(
2810 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522811 handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282812 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2813 callback_a[i].callback(),
2814 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2815 NetLogWithSource()));
2816 EXPECT_EQ(
2817 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522818 handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282819 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2820 callback_b[i].callback(),
2821 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2822 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542823 }
2824
2825 // Release b's socket first. The order is important, because in
2826 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2827 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2828 // first, which has a releasing socket, so it refuses to start up another
2829 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132830 handle_b[0].socket()->Disconnect();
2831 handle_b[0].Reset();
2832 handle_a[0].socket()->Disconnect();
2833 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542834
2835 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282836 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542837
[email protected]2431756e2010-09-29 20:26:132838 handle_b[1].socket()->Disconnect();
2839 handle_b[1].Reset();
2840 handle_a[1].socket()->Disconnect();
2841 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542842
2843 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012844 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2845 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542846 }
2847}
2848
[email protected]fd4fe0b2010-02-08 23:02:152849TEST_F(ClientSocketPoolBaseTest,
2850 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2851 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2852
2853 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2854
Matt Menkec6b3edf72019-03-19 17:00:392855 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2856 IsError(ERR_IO_PENDING));
2857 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2858 IsError(ERR_IO_PENDING));
2859 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2860 IsError(ERR_IO_PENDING));
2861 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2862 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152863
robpercival214763f2016-07-01 23:27:012864 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2865 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132866 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152867
2868 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132869 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012870 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152871
[email protected]2431756e2010-09-29 20:26:132872 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012873 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132874 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152875
2876 EXPECT_EQ(1, GetOrderOfRequest(1));
2877 EXPECT_EQ(2, GetOrderOfRequest(2));
2878 EXPECT_EQ(3, GetOrderOfRequest(3));
2879 EXPECT_EQ(4, GetOrderOfRequest(4));
2880
2881 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132882 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152883}
2884
[email protected]6ecf2b92011-12-15 01:14:522885class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042886 public:
Matt Menke9fa17d52019-03-25 19:12:262887 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132888 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182889 bool reset_releasing_handle)
2890 : pool_(pool),
2891 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042892 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522893
Chris Watkins7a41d3552017-12-01 02:13:272894 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042895
2896 ClientSocketHandle* handle() { return &handle_; }
2897
Bence Béky8ddc2492018-06-13 01:02:042898 CompletionOnceCallback callback() {
2899 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2900 base::Unretained(this));
2901 }
[email protected]4f1e4982010-03-02 18:31:042902
2903 private:
[email protected]6ecf2b92011-12-15 01:14:522904 void OnComplete(int result) {
2905 SetResult(result);
2906 if (reset_releasing_handle_)
2907 handle_.Reset();
2908
Matt Menkec6b3edf72019-03-19 17:00:392909 EXPECT_EQ(
2910 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032911 handle2_.Init(
2912 TestGroupId("a"),
2913 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:522914 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032915 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2916 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522917 }
2918
Keishi Hattori0e45c022021-11-27 09:25:522919 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]e60e47a2010-07-14 03:37:182920 int expected_result_;
2921 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042922 ClientSocketHandle handle_;
2923 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042924};
2925
[email protected]e60e47a2010-07-14 03:37:182926
2927TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2928 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2929
Matt Menkec6b3edf72019-03-19 17:00:392930 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2931 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2932 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182933
[email protected]2431756e2010-09-29 20:26:132934 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182935 client_socket_factory_.allocation_count());
2936
2937 connect_job_factory_->set_job_type(
2938 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2939 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282940 EXPECT_EQ(ERR_IO_PENDING,
2941 req.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522942 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282943 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2944 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2945 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182946 // The next job should complete synchronously
2947 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2948
robpercival214763f2016-07-01 23:27:012949 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182950 EXPECT_FALSE(req.handle()->is_initialized());
2951 EXPECT_FALSE(req.handle()->socket());
2952 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512953 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182954}
2955
[email protected]b6501d3d2010-06-03 23:53:342956// http://crbug.com/44724 regression test.
2957// We start releasing the pool when we flush on network change. When that
2958// happens, the only active references are in the ClientSocketHandles. When a
2959// ConnectJob completes and calls back into the last ClientSocketHandle, that
2960// callback can release the last reference and delete the pool. After the
2961// callback finishes, we go back to the stack frame within the now-deleted pool.
2962// Executing any code that refers to members of the now-deleted pool can cause
2963// crashes.
2964TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2965 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2966 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2967
2968 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522969 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502970 EXPECT_EQ(
2971 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522972 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282973 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2974 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2975 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342976
Matt Menke433de6d2020-03-04 00:24:112977 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]b6501d3d2010-06-03 23:53:342978
2979 // We'll call back into this now.
2980 callback.WaitForResult();
2981}
2982
[email protected]a7e38572010-06-07 18:22:242983TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2984 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2985 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2986
2987 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522988 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502989 EXPECT_EQ(
2990 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522991 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282992 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2993 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2994 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012995 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242996 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:112997 NetLogSource source = handle.socket()->NetLog().source();
[email protected]a7e38572010-06-07 18:22:242998
Matt Menke433de6d2020-03-04 00:24:112999 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]a7e38572010-06-07 18:22:243000
3001 handle.Reset();
fdoray5eeb7642016-06-22 16:11:283002 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:243003
Matt Menke28ac03e2019-02-25 22:25:503004 EXPECT_EQ(
3005 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523006 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283007 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3008 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3009 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013010 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243011 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113012
3013 ExpectSocketClosedWithReason(
3014 source, TransportClientSocketPool::kSocketGenerationOutOfDate);
[email protected]a7e38572010-06-07 18:22:243015}
3016
[email protected]6ecf2b92011-12-15 01:14:523017class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:143018 public:
Matt Menke9fa17d52019-03-25 19:12:263019 ConnectWithinCallback(
3020 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:193021 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:263022 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:393023 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:143024
Peter Boström293b1342021-09-22 17:31:433025 ConnectWithinCallback(const ConnectWithinCallback&) = delete;
3026 ConnectWithinCallback& operator=(const ConnectWithinCallback&) = delete;
3027
Chris Watkins7a41d3552017-12-01 02:13:273028 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:143029
3030 int WaitForNestedResult() {
3031 return nested_callback_.WaitForResult();
3032 }
3033
Bence Béky8ddc2492018-06-13 01:02:043034 CompletionOnceCallback callback() {
3035 return base::BindOnce(&ConnectWithinCallback::OnComplete,
3036 base::Unretained(this));
3037 }
[email protected]6ecf2b92011-12-15 01:14:523038
[email protected]06f92462010-08-31 19:24:143039 private:
[email protected]6ecf2b92011-12-15 01:14:523040 void OnComplete(int result) {
3041 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:283042 EXPECT_EQ(
3043 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523044 handle_.Init(group_id_, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283045 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3046 nested_callback_.callback(),
3047 ClientSocketPool::ProxyAuthCallback(), pool_,
3048 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:523049 }
3050
Matt Menkec6b3edf72019-03-19 17:00:393051 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:193052 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Keishi Hattori0e45c022021-11-27 09:25:523053 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]06f92462010-08-31 19:24:143054 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:523055 TestCompletionCallback nested_callback_;
[email protected]06f92462010-08-31 19:24:143056};
3057
3058TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
3059 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3060
3061 // First job will be waiting until it gets aborted.
3062 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3063
3064 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:393065 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:503066 EXPECT_EQ(
3067 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523068 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283069 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3070 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3071 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:143072
3073 // Second job will be started during the first callback, and will
3074 // asynchronously complete with OK.
3075 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menke433de6d2020-03-04 00:24:113076 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
robpercival214763f2016-07-01 23:27:013077 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
3078 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:143079}
3080
Matt Menke141b87f22019-01-30 02:43:033081TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:263082 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3083 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033084
3085 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3086 ClientSocketHandle handle;
3087 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503088 EXPECT_EQ(
3089 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523090 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283091 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3092 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3093 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033094 // The backup timer fires but doesn't start a new ConnectJob while resolving
3095 // the hostname.
3096 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
Peter Kastinge5a38ed2021-10-02 03:06:353097 FastForwardBy(
3098 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033099 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3100
3101 // Once the ConnectJob has finished resolving the hostname, the backup timer
3102 // will create a ConnectJob when it fires.
3103 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
Peter Kastinge5a38ed2021-10-02 03:06:353104 FastForwardBy(
3105 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs));
Matt Menke141b87f22019-01-30 02:43:033106 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3107}
3108
3109// Test that no backup socket is created when a ConnectJob connects before it
3110// completes.
3111TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263112 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3113 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033114
3115 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3116 ClientSocketHandle handle;
3117 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503118 EXPECT_EQ(
3119 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523120 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283121 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3122 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3123 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033124 // The backup timer fires but doesn't start a new ConnectJob while resolving
3125 // the hostname.
3126 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
Peter Kastinge5a38ed2021-10-02 03:06:353127 FastForwardBy(
3128 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033129 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3130
3131 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3132 client_socket_factory_.SetJobHasEstablishedConnection(0);
Peter Kastinge5a38ed2021-10-02 03:06:353133 FastForwardBy(
3134 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033135 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3136}
3137
[email protected]25eea382010-07-10 23:55:263138// Cancel a pending socket request while we're at max sockets,
3139// and verify that the backup socket firing doesn't cause a crash.
3140TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3141 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263142 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3143 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263144
[email protected]4baaf9d2010-08-31 15:15:443145 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3146 // timer.
[email protected]25eea382010-07-10 23:55:263147 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3148 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523149 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503150 EXPECT_EQ(
3151 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523152 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283153 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3154 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3155 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263156
3157 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3158 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3159 ClientSocketHandle handles[kDefaultMaxSockets];
3160 for (int i = 1; i < kDefaultMaxSockets; ++i) {
Anton Bikineev068d2912021-05-15 20:43:523161 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283162 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203163 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503164 callback.callback(),
3165 ClientSocketPool::ProxyAuthCallback(),
3166 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263167 }
3168
fdoray5eeb7642016-06-22 16:11:283169 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263170
3171 // Cancel the pending request.
3172 handle.Reset();
3173
3174 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353175 FastForwardBy(
3176 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263177
[email protected]25eea382010-07-10 23:55:263178 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3179}
3180
[email protected]3f00be82010-09-27 19:50:023181TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263182 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3183 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443184
3185 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3186 // timer.
3187 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3188 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523189 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503190 EXPECT_EQ(
3191 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523192 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283193 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3194 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3195 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263196 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3197 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3198 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3199 TestGroupId("bar")));
3200 EXPECT_EQ(
3201 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443202
3203 // Cancel the socket request. This should cancel the backup timer. Wait for
3204 // the backup time to see if it indeed got canceled.
3205 handle.Reset();
3206 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353207 FastForwardBy(
3208 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263209 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3210 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443211}
3212
[email protected]3f00be82010-09-27 19:50:023213TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263214 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3215 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023216
3217 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3218 // timer.
3219 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3220 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523221 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503222 EXPECT_EQ(
3223 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523224 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283225 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3226 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3227 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023228 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3229 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523230 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203231 EXPECT_EQ(
3232 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523233 handle2.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283234 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503235 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3236 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263237 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3238 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023239
3240 // Cancel request 1 and then complete request 2. With the requests finished,
3241 // the backup timer should be cancelled.
3242 handle.Reset();
robpercival214763f2016-07-01 23:27:013243 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023244 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353245 FastForwardBy(
3246 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023247}
3248
[email protected]eb5a99382010-07-11 03:18:263249// Test delayed socket binding for the case where we have two connects,
3250// and while one is waiting on a connect, the other frees up.
3251// The socket waiting on a connect should switch immediately to the freed
3252// up socket.
3253TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3254 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3255 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3256
3257 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523258 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503259 EXPECT_EQ(
3260 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523261 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283262 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503263 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3264 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013265 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263266
3267 // No idle sockets, no pending jobs.
3268 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263269 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263270
3271 // Create a second socket to the same host, but this one will wait.
3272 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3273 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503274 EXPECT_EQ(
3275 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523276 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283277 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503278 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3279 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263280 // No idle sockets, and one connecting job.
3281 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263282 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263283
3284 // Return the first handle to the pool. This will initiate the delayed
3285 // binding.
3286 handle1.Reset();
3287
fdoray5eeb7642016-06-22 16:11:283288 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263289
3290 // Still no idle sockets, still one pending connect job.
3291 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263292 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263293
3294 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013295 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263296
3297 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263298 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263299
3300 // Finally, signal the waiting Connect.
3301 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263302 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263303
fdoray5eeb7642016-06-22 16:11:283304 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263305}
3306
3307// Test delayed socket binding when a group is at capacity and one
3308// of the group's sockets frees up.
3309TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3310 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3311 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3312
3313 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523314 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503315 EXPECT_EQ(
3316 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523317 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283318 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503319 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3320 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013321 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263322
3323 // No idle sockets, no pending jobs.
3324 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263325 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263326
3327 // Create a second socket to the same host, but this one will wait.
3328 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3329 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503330 EXPECT_EQ(
3331 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523332 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283333 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503334 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3335 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263336 // No idle sockets, and one connecting job.
3337 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263338 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263339
3340 // Return the first handle to the pool. This will initiate the delayed
3341 // binding.
3342 handle1.Reset();
3343
fdoray5eeb7642016-06-22 16:11:283344 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263345
3346 // Still no idle sockets, still one pending connect job.
3347 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263348 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263349
3350 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013351 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263352
3353 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263354 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263355
3356 // Finally, signal the waiting Connect.
3357 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263358 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263359
fdoray5eeb7642016-06-22 16:11:283360 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263361}
3362
3363// Test out the case where we have one socket connected, one
3364// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513365// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263366// should complete, by taking the first socket's idle socket.
3367TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3368 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3369 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3370
3371 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523372 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503373 EXPECT_EQ(
3374 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523375 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283376 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503377 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3378 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013379 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263380
3381 // No idle sockets, no pending jobs.
3382 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263383 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263384
3385 // Create a second socket to the same host, but this one will wait.
3386 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3387 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503388 EXPECT_EQ(
3389 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523390 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283391 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503392 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3393 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263394 // No idle sockets, and one connecting job.
3395 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263396 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263397
3398 // Return the first handle to the pool. This will initiate the delayed
3399 // binding.
3400 handle1.Reset();
3401
fdoray5eeb7642016-06-22 16:11:283402 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263403
3404 // Still no idle sockets, still one pending connect job.
3405 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263406 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263407
3408 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013409 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263410
3411 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263412 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263413
3414 // Finally, signal the waiting Connect.
3415 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263416 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263417
fdoray5eeb7642016-06-22 16:11:283418 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263419}
3420
[email protected]2abfe90a2010-08-25 17:49:513421// Cover the case where on an available socket slot, we have one pending
3422// request that completes synchronously, thereby making the Group empty.
3423TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3424 const int kUnlimitedSockets = 100;
3425 const int kOneSocketPerGroup = 1;
3426 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3427
3428 // Make the first request asynchronous fail.
3429 // This will free up a socket slot later.
3430 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3431
3432 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523433 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203434 EXPECT_EQ(
3435 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523436 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283437 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503438 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3439 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263440 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513441
3442 // Make the second request synchronously fail. This should make the Group
3443 // empty.
3444 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3445 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523446 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513447 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3448 // when created.
tfarina428341112016-09-22 13:38:203449 EXPECT_EQ(
3450 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523451 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283452 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503453 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3454 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513455
Matt Menke9fa17d52019-03-25 19:12:263456 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513457
robpercival214763f2016-07-01 23:27:013458 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3459 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263460 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513461}
3462
[email protected]e1b54dc2010-10-06 21:27:223463TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3464 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3465
3466 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3467
3468 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523469 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203470 EXPECT_EQ(
3471 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523472 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283473 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503474 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3475 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223476
3477 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523478 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203479 EXPECT_EQ(
3480 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523481 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283482 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503483 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3484 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223485 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523486 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203487 EXPECT_EQ(
3488 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523489 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283490 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503491 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3492 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223493
robpercival214763f2016-07-01 23:27:013494 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3495 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3496 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223497
3498 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353499 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383500 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353501 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383502 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223503
3504 handle1.Reset();
3505 handle2.Reset();
3506 handle3.Reset();
3507
Matt Menkec6b3edf72019-03-19 17:00:393508 EXPECT_EQ(OK, handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:523509 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283510 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393511 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3512 pool_.get(), NetLogWithSource()));
3513 EXPECT_EQ(OK, handle2.Init(
Anton Bikineev068d2912021-05-15 20:43:523514 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283515 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393516 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3517 pool_.get(), NetLogWithSource()));
3518 EXPECT_EQ(OK, handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:523519 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283520 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393521 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3522 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223523
3524 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3525 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3526 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3527}
3528
[email protected]2c2bef152010-10-13 00:55:033529TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3530 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3531 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3532
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213533 TestCompletionCallback preconnect_callback;
3534 EXPECT_EQ(ERR_IO_PENDING,
3535 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3536 preconnect_callback.callback(),
3537 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033538
Matt Menke9fa17d52019-03-25 19:12:263539 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3540 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3541 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3542 TestGroupId("a")));
3543 EXPECT_EQ(2u,
3544 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393545 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033546
3547 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523548 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203549 EXPECT_EQ(
3550 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523551 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283552 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503553 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3554 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033555
3556 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523557 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203558 EXPECT_EQ(
3559 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523560 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283561 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503562 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3563 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033564
Matt Menke9fa17d52019-03-25 19:12:263565 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3566 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3567 TestGroupId("a")));
3568 EXPECT_EQ(0u,
3569 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393570 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033571
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213572 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
robpercival214763f2016-07-01 23:27:013573 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3574 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033575 handle1.Reset();
3576 handle2.Reset();
3577
Matt Menke9fa17d52019-03-25 19:12:263578 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3579 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3580 TestGroupId("a")));
3581 EXPECT_EQ(0u,
3582 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393583 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033584}
3585
3586TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3587 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3588 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3589
3590 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523591 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203592 EXPECT_EQ(
3593 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523594 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283595 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503596 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3597 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033598
Matt Menke9fa17d52019-03-25 19:12:263599 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3600 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3601 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3602 TestGroupId("a")));
3603 EXPECT_EQ(0u,
3604 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393605 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033606
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213607 TestCompletionCallback preconnect_callback;
3608 EXPECT_EQ(ERR_IO_PENDING,
3609 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3610 preconnect_callback.callback(),
3611 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033612
Matt Menke9fa17d52019-03-25 19:12:263613 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3614 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3615 TestGroupId("a")));
3616 EXPECT_EQ(1u,
3617 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393618 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033619
3620 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523621 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203622 EXPECT_EQ(
3623 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523624 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283625 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503626 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3627 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033628
Matt Menke9fa17d52019-03-25 19:12:263629 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3630 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3631 TestGroupId("a")));
3632 EXPECT_EQ(0u,
3633 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393634 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033635
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213636 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
robpercival214763f2016-07-01 23:27:013637 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3638 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033639 handle1.Reset();
3640 handle2.Reset();
3641
Matt Menke9fa17d52019-03-25 19:12:263642 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3643 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3644 TestGroupId("a")));
3645 EXPECT_EQ(0u,
3646 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393647 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033648}
3649
3650TEST_F(ClientSocketPoolBaseTest,
3651 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3652 CreatePool(4, 4);
3653 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3654
3655 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523656 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203657 EXPECT_EQ(
3658 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523659 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283660 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503661 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3662 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033663
3664 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523665 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203666 EXPECT_EQ(
3667 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523668 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283669 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503670 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3671 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033672
3673 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523674 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203675 EXPECT_EQ(
3676 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523677 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283678 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503679 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3680 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033681
Matt Menke9fa17d52019-03-25 19:12:263682 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3683 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3684 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3685 TestGroupId("a")));
3686 EXPECT_EQ(0u,
3687 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393688 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033689
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213690 EXPECT_EQ(
3691 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3692 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033693
Matt Menke9fa17d52019-03-25 19:12:263694 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3695 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3696 TestGroupId("a")));
3697 EXPECT_EQ(0u,
3698 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393699 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033700
robpercival214763f2016-07-01 23:27:013701 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3702 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3703 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033704 handle1.Reset();
3705 handle2.Reset();
3706 handle3.Reset();
3707
Matt Menke9fa17d52019-03-25 19:12:263708 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3709 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3710 TestGroupId("a")));
3711 EXPECT_EQ(0u,
3712 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393713 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033714}
3715
3716TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3717 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3718 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3719
Matt Menke9fa17d52019-03-25 19:12:263720 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033721
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213722 TestCompletionCallback preconnect_callback;
3723 EXPECT_EQ(ERR_IO_PENDING,
3724 pool_->RequestSockets(
3725 TestGroupId("a"), params_, absl::nullopt, kDefaultMaxSockets,
3726 preconnect_callback.callback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033727
Matt Menke9fa17d52019-03-25 19:12:263728 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433729 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393730 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263731 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3732 EXPECT_EQ(
3733 kDefaultMaxSockets,
3734 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3735 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433736 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263737 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3738 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033739
Matt Menke9fa17d52019-03-25 19:12:263740 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033741
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213742 EXPECT_EQ(OK,
3743 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
3744 kDefaultMaxSockets, CompletionOnceCallback(),
3745 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033746
Matt Menke9fa17d52019-03-25 19:12:263747 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213748
3749 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033750}
3751
3752TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3753 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3754 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3755
Matt Menke9fa17d52019-03-25 19:12:263756 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033757
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213758 TestCompletionCallback preconnect_callback1;
3759 EXPECT_EQ(ERR_IO_PENDING,
3760 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3761 kDefaultMaxSockets - 1,
3762 preconnect_callback1.callback(),
3763 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033764
Matt Menke9fa17d52019-03-25 19:12:263765 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433766 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393767 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263768 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3769 EXPECT_EQ(
3770 kDefaultMaxSockets - 1,
3771 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3772 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433773 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263774 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3775 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483776 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033777
Matt Menke9fa17d52019-03-25 19:12:263778 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033779
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213780 TestCompletionCallback preconnect_callback2;
3781 EXPECT_EQ(ERR_IO_PENDING,
3782 pool_->RequestSockets(
3783 TestGroupId("b"), params_, absl::nullopt, kDefaultMaxSockets,
3784 preconnect_callback2.callback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033785
Matt Menke9fa17d52019-03-25 19:12:263786 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3787 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483788 EXPECT_FALSE(pool_->IsStalled());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213789
3790 EXPECT_THAT(preconnect_callback1.WaitForResult(), IsOk());
3791 EXPECT_THAT(preconnect_callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033792}
3793
3794TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3795 CreatePool(4, 4);
3796 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3797
3798 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523799 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203800 EXPECT_EQ(
3801 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523802 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283803 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503804 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3805 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013806 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033807 handle1.Reset();
3808
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(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033816
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213817 TestCompletionCallback preconnect_callback;
3818 EXPECT_EQ(ERR_IO_PENDING,
3819 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3820 preconnect_callback.callback(),
3821 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033822
Matt Menke9fa17d52019-03-25 19:12:263823 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3824 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3825 TestGroupId("a")));
3826 EXPECT_EQ(1u,
3827 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393828 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213829
3830 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033831}
3832
3833TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3834 CreatePool(4, 4);
3835 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3836
3837 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523838 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203839 EXPECT_EQ(
3840 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523841 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283842 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503843 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3844 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013845 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033846
Matt Menke9fa17d52019-03-25 19:12:263847 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3848 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3849 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3850 TestGroupId("a")));
3851 EXPECT_EQ(0u,
3852 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393853 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263854 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033855
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213856 TestCompletionCallback preconnect_callback;
3857 EXPECT_EQ(ERR_IO_PENDING,
3858 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3859 preconnect_callback.callback(),
3860 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033861
Matt Menke9fa17d52019-03-25 19:12:263862 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3863 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3864 TestGroupId("a")));
3865 EXPECT_EQ(1u,
3866 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393867 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263868 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213869
3870 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033871}
3872
3873TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3874 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3875 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3876
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213877 EXPECT_EQ(
3878 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3879 kDefaultMaxSocketsPerGroup,
3880 CompletionOnceCallback(), 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(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3884 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3885 TestGroupId("a")));
3886 EXPECT_EQ(0u,
3887 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433888 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393889 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033890
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213891 EXPECT_EQ(
3892 OK, pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
3893 kDefaultMaxSocketsPerGroup,
3894 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033895
Matt Menke9fa17d52019-03-25 19:12:263896 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3897 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3898 TestGroupId("b")));
3899 EXPECT_EQ(0u,
3900 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433901 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393902 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033903}
3904
[email protected]3c819f522010-12-02 02:03:123905TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3906 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3907 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3908
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213909 EXPECT_EQ(
3910 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3911 kDefaultMaxSocketsPerGroup,
3912 CompletionOnceCallback(), NetLogWithSource()));
[email protected]3c819f522010-12-02 02:03:123913
Matt Menke9fa17d52019-03-25 19:12:263914 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523915
3916 connect_job_factory_->set_job_type(
3917 TestConnectJob::kMockAdditionalErrorStateJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213918
3919 EXPECT_EQ(
3920 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3921 kDefaultMaxSocketsPerGroup,
3922 CompletionOnceCallback(), NetLogWithSource()));
[email protected]fd2e53e2011-01-14 20:40:523923
Matt Menke9fa17d52019-03-25 19:12:263924 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123925}
3926
[email protected]8159a1c2012-06-07 00:00:103927TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033928 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433929 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033930
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213931 TestCompletionCallback preconnect_callback;
3932 EXPECT_EQ(ERR_IO_PENDING,
3933 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3934 preconnect_callback.callback(),
3935 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033936
Matt Menke9fa17d52019-03-25 19:12:263937 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3938 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3939 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3940 TestGroupId("a")));
3941 EXPECT_EQ(2u,
3942 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3943 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393944 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033945
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213946 EXPECT_EQ(
3947 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3948 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263949 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3950 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3951 TestGroupId("a")));
3952 EXPECT_EQ(2u,
3953 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3954 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393955 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033956
3957 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523958 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203959 EXPECT_EQ(
3960 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523961 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283962 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503963 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3964 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433965
3966 client_socket_factory_.SignalJob(0);
3967 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3968
Matt Menke9fa17d52019-03-25 19:12:263969 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3970 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3971 TestGroupId("a")));
3972 EXPECT_EQ(1u,
3973 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3974 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393975 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033976
3977 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523978 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433979 EXPECT_EQ(
3980 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523981 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283982 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503983 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3984 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433985 client_socket_factory_.SignalJob(0);
3986 EXPECT_THAT(callback2.WaitForResult(), IsOk());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213987 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033988
Matt Menke9fa17d52019-03-25 19:12:263989 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3990 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3991 TestGroupId("a")));
3992 EXPECT_EQ(0u,
3993 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3994 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393995 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103996
[email protected]2c2bef152010-10-13 00:55:033997 handle1.Reset();
3998 handle2.Reset();
3999
Matt Menke9fa17d52019-03-25 19:12:264000 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4001 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4002 TestGroupId("a")));
4003 EXPECT_EQ(0u,
4004 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4005 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394006 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034007
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214008 EXPECT_EQ(
4009 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4010 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264011 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4012 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4013 TestGroupId("a")));
4014 EXPECT_EQ(0u,
4015 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4016 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394017 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034018}
4019
4020TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
4021 CreatePool(4, 4);
4022 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4023
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214024 TestCompletionCallback preconnect_callback1;
4025 EXPECT_EQ(ERR_IO_PENDING,
4026 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4027 preconnect_callback1.callback(),
4028 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034029
Matt Menke9fa17d52019-03-25 19:12:264030 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4031 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4032 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4033 TestGroupId("a")));
4034 EXPECT_EQ(1u,
4035 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394036 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034037
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214038 TestCompletionCallback preconnect_callback2;
4039 EXPECT_EQ(ERR_IO_PENDING,
4040 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4041 preconnect_callback2.callback(),
4042 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264043 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4044 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4045 TestGroupId("a")));
4046 EXPECT_EQ(2u,
4047 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394048 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034049
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214050 TestCompletionCallback preconnect_callback3;
4051 EXPECT_EQ(ERR_IO_PENDING,
4052 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 3,
4053 preconnect_callback3.callback(),
4054 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264055 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4056 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4057 TestGroupId("a")));
4058 EXPECT_EQ(3u,
4059 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394060 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034061
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214062 EXPECT_EQ(
4063 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4064 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264065 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4066 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4067 TestGroupId("a")));
4068 EXPECT_EQ(3u,
4069 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394070 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034071}
4072
4073TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
4074 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434075 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:034076
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214077 TestCompletionCallback preconnect_callback;
4078 EXPECT_EQ(ERR_IO_PENDING,
4079 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4080 preconnect_callback.callback(),
4081 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034082
Matt Menke9fa17d52019-03-25 19:12:264083 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4084 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4085 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4086 TestGroupId("a")));
4087 EXPECT_EQ(1u,
4088 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394089 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034090
4091 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524092 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204093 EXPECT_EQ(
4094 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524095 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284096 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504097 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4098 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034099
Matt Menke9fa17d52019-03-25 19:12:264100 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4101 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4102 TestGroupId("a")));
4103 EXPECT_EQ(0u,
4104 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394105 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034106
Lily Chenecebf932018-11-02 17:15:434107 client_socket_factory_.SignalJobs();
4108 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214109 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
Lily Chenecebf932018-11-02 17:15:434110
Matt Menke9fa17d52019-03-25 19:12:264111 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4112 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4113 TestGroupId("a")));
4114 EXPECT_EQ(0u,
4115 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394116 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264117 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034118
[email protected]0dc88b32014-03-26 20:12:284119 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:484120 // starts, it has a connect start time.
4121 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:034122 handle1.Reset();
4123
Matt Menkec6b3edf72019-03-19 17:00:394124 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034125}
4126
[email protected]034df0f32013-01-07 23:17:484127// Checks that fully connected preconnect jobs have no connect times, and are
4128// marked as reused.
4129TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
4130 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4131 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214132
4133 EXPECT_EQ(
4134 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4135 CompletionOnceCallback(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484136
Matt Menke9fa17d52019-03-25 19:12:264137 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4138 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4139 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4140 TestGroupId("a")));
4141 EXPECT_EQ(0u,
4142 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394143 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484144
4145 ClientSocketHandle handle;
4146 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394147 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524148 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284149 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394150 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4151 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484152
4153 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394154 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484155
4156 TestLoadTimingInfoConnectedReused(handle);
4157 handle.Reset();
4158 TestLoadTimingInfoNotConnected(handle);
4159}
4160
[email protected]dcbe168a2010-12-02 03:14:464161// http://crbug.com/64940 regression test.
4162TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4163 const int kMaxTotalSockets = 3;
4164 const int kMaxSocketsPerGroup = 2;
4165 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434166 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464167
Matt Menkef6edce752019-03-19 17:21:564168 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464169 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4170
4171 // Set up one idle socket in "a".
4172 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524173 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204174 EXPECT_EQ(
4175 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524176 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284177 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504178 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4179 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264180 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4181 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4182 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4183 TestGroupId("a")));
4184 EXPECT_EQ(0u,
4185 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394186 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464187
Lily Chenecebf932018-11-02 17:15:434188 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014189 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264190 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4191 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4192 TestGroupId("a")));
4193 EXPECT_EQ(0u,
4194 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4195 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434196
[email protected]dcbe168a2010-12-02 03:14:464197 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394198 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464199
4200 // Set up two active sockets in "b".
4201 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524202 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204203 EXPECT_EQ(
4204 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524205 handle1.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284206 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504207 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4208 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204209 EXPECT_EQ(
4210 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524211 handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284212 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504213 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4214 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464215
Matt Menke9fa17d52019-03-25 19:12:264216 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4217 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4218 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4219 TestGroupId("b")));
4220 EXPECT_EQ(0u,
4221 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394222 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434223
4224 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014225 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4226 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394227 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264228 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4229 TestGroupId("b")));
4230 EXPECT_EQ(0u,
4231 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4232 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464233
4234 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4235 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4236 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4237 // sockets for "a", and "b" should still have 2 active sockets.
4238
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214239 EXPECT_EQ(
4240 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4241 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264242 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4243 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4244 TestGroupId("a")));
4245 EXPECT_EQ(0u,
4246 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394247 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264248 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4249 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4250 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4251 TestGroupId("b")));
4252 EXPECT_EQ(0u,
4253 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394254 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264255 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464256
4257 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4258 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4259 // "a" should result in closing 1 for "b".
4260 handle1.Reset();
4261 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394262 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264263 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464264
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214265 TestCompletionCallback preconnect_callback;
4266 EXPECT_EQ(ERR_IO_PENDING,
4267 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4268 preconnect_callback.callback(),
4269 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264270 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4271 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4272 TestGroupId("a")));
4273 EXPECT_EQ(1u,
4274 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394275 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264276 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4277 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4278 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4279 TestGroupId("b")));
4280 EXPECT_EQ(0u,
4281 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394282 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264283 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464284}
4285
[email protected]b7b8be42011-07-12 12:46:414286TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264287 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4288 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074289
4290 // Make the ConnectJob hang until it times out, shorten the timeout.
4291 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Peter Kastinge5a38ed2021-10-02 03:06:354292 connect_job_factory_->set_timeout_duration(base::Milliseconds(500));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214293 TestCompletionCallback preconnect_callback;
4294 EXPECT_EQ(ERR_IO_PENDING,
4295 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4296 preconnect_callback.callback(),
4297 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264298 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4299 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4300 TestGroupId("a")));
4301 EXPECT_EQ(1u,
4302 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394303 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074304
[email protected]b7b8be42011-07-12 12:46:414305 // Verify the backup timer doesn't create a backup job, by making
4306 // the backup job a pending job instead of a waiting job, so it
4307 // *would* complete if it were created.
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594308 base::RunLoop loop;
[email protected]a9fc8fc2011-05-10 02:41:074309 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454310 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Peter Kastinge5a38ed2021-10-02 03:06:354311 FROM_HERE, loop.QuitClosure(), base::Seconds(1));
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594312 loop.Run();
Matt Menke9fa17d52019-03-25 19:12:264313 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074314}
4315
[email protected]b7b8be42011-07-12 12:46:414316TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264317 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4318 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074319
4320 // Make the ConnectJob hang forever.
4321 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214322 TestCompletionCallback preconnect_callback;
4323 EXPECT_EQ(ERR_IO_PENDING,
4324 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4325 preconnect_callback.callback(),
4326 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264327 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4328 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4329 TestGroupId("a")));
4330 EXPECT_EQ(1u,
4331 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394332 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284333 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074334
4335 // Make the backup job be a pending job, so it completes normally.
4336 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4337 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524338 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504339 EXPECT_EQ(
4340 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524341 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284342 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4343 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4344 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414345 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264346 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4347 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4348 TestGroupId("a")));
4349 EXPECT_EQ(0u,
4350 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394351 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264352 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014353 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074354
4355 // The hung connect job should still be there, but everything else should be
4356 // complete.
Matt Menke9fa17d52019-03-25 19:12:264357 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4358 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4359 TestGroupId("a")));
4360 EXPECT_EQ(1u,
4361 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394362 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264363 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074364}
4365
[email protected]0dc88b32014-03-26 20:12:284366// Tests that a preconnect that starts out with unread data can still be used.
4367// http://crbug.com/334467
4368TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4369 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4370 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4371
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214372 EXPECT_EQ(
4373 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4374 CompletionOnceCallback(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284375
Matt Menke9fa17d52019-03-25 19:12:264376 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4377 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4378 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4379 TestGroupId("a")));
4380 EXPECT_EQ(0u,
4381 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394382 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284383
4384 // Fail future jobs to be sure that handle receives the preconnected socket
4385 // rather than closing it and making a new one.
4386 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4387 ClientSocketHandle handle;
4388 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394389 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524390 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284391 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394392 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4393 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284394
Matt Menke9fa17d52019-03-25 19:12:264395 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4396 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4397 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4398 TestGroupId("a")));
4399 EXPECT_EQ(0u,
4400 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394401 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264402 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284403
4404 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354405 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284406
4407 TestLoadTimingInfoConnectedReused(handle);
4408 handle.Reset();
4409
4410 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394411 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284412}
4413
Lily Chenecebf932018-11-02 17:15:434414TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4415 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4416 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4417
4418 ClientSocketHandle handle1;
4419 TestCompletionCallback callback1;
4420 EXPECT_EQ(
4421 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524422 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284423 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504424 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4425 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434426
Matt Menke9fa17d52019-03-25 19:12:264427 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4428 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4429 TestGroupId("a")));
4430 EXPECT_EQ(0u,
4431 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394432 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434433
Matt Menkec6b3edf72019-03-19 17:00:394434 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4435 &handle1));
Lily Chenecebf932018-11-02 17:15:434436}
4437
4438TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4439 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4440 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4441
4442 ClientSocketHandle handle1;
4443 TestCompletionCallback callback1;
4444 EXPECT_EQ(
4445 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524446 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284447 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504448 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4449 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434450
Matt Menke9fa17d52019-03-25 19:12:264451 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4452 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4453 TestGroupId("a")));
4454 EXPECT_EQ(0u,
4455 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394456 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434457
4458 ClientSocketHandle handle2;
4459 TestCompletionCallback callback2;
4460 EXPECT_EQ(
4461 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524462 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284463 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504464 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4465 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434466
Matt Menke9fa17d52019-03-25 19:12:264467 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4468 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4469 TestGroupId("a")));
4470 EXPECT_EQ(0u,
4471 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394472 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434473
Matt Menkec6b3edf72019-03-19 17:00:394474 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4475 &handle1));
4476 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4477 &handle2));
Lily Chenecebf932018-11-02 17:15:434478
4479 // One job completes. The other request should still have its job.
4480 client_socket_factory_.SignalJob(0);
4481 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4482
Matt Menke9fa17d52019-03-25 19:12:264483 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4484 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4485 TestGroupId("a")));
4486 EXPECT_EQ(0u,
4487 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4488 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394489 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434490
Matt Menkec6b3edf72019-03-19 17:00:394491 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4492 &handle2));
Lily Chenecebf932018-11-02 17:15:434493}
4494
4495TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4496 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4497 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4498
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214499 TestCompletionCallback preconnect_callback;
4500 EXPECT_EQ(ERR_IO_PENDING,
4501 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4502 preconnect_callback.callback(),
4503 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434504
Matt Menke9fa17d52019-03-25 19:12:264505 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4506 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4507 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4508 TestGroupId("a")));
4509 EXPECT_EQ(1u,
4510 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394511 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434512
4513 ClientSocketHandle handle1;
4514 TestCompletionCallback callback1;
4515 EXPECT_EQ(
4516 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524517 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284518 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504519 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4520 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434521
Matt Menke9fa17d52019-03-25 19:12:264522 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4523 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4524 TestGroupId("a")));
4525 EXPECT_EQ(0u,
4526 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394527 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434528
Matt Menkec6b3edf72019-03-19 17:00:394529 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4530 &handle1));
Lily Chenecebf932018-11-02 17:15:434531}
4532
4533TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4534 CreatePool(kDefaultMaxSockets, 1);
4535 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4536
4537 ClientSocketHandle handle1;
4538 TestCompletionCallback callback1;
4539 EXPECT_EQ(
4540 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524541 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284542 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504543 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4544 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434545
Matt Menke9fa17d52019-03-25 19:12:264546 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4547 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4548 TestGroupId("a")));
4549 EXPECT_EQ(0u,
4550 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394551 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434552
Matt Menkec6b3edf72019-03-19 17:00:394553 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4554 &handle1));
Lily Chenecebf932018-11-02 17:15:434555
4556 // Insert a higher priority request
4557 ClientSocketHandle handle2;
4558 TestCompletionCallback callback2;
4559 EXPECT_EQ(
4560 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524561 handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284562 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504563 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4564 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434565
Matt Menke9fa17d52019-03-25 19:12:264566 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4567 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4568 TestGroupId("a")));
4569 EXPECT_EQ(0u,
4570 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394571 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434572
4573 // The highest priority request should steal the job from the default priority
4574 // request.
Matt Menkec6b3edf72019-03-19 17:00:394575 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4576 &handle2));
4577 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4578 &handle1));
Lily Chenecebf932018-11-02 17:15:434579}
4580
4581TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4582 CreatePool(3, 3);
4583 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4584
4585 ClientSocketHandle handle_lowest;
4586 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284587 EXPECT_EQ(
4588 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524589 handle_lowest.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284590 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4591 callback_lowest.callback(),
4592 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4593 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434594
Matt Menke9fa17d52019-03-25 19:12:264595 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4596 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4597 TestGroupId("a")));
4598 EXPECT_EQ(0u,
4599 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394600 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434601
4602 ClientSocketHandle handle_highest;
4603 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284604 EXPECT_EQ(
4605 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524606 handle_highest.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284607 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4608 callback_highest.callback(),
4609 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4610 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434611
Matt Menke9fa17d52019-03-25 19:12:264612 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4613 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4614 TestGroupId("a")));
4615 EXPECT_EQ(0u,
4616 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394617 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434618
4619 ClientSocketHandle handle_low;
4620 TestCompletionCallback callback_low;
4621 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284622 handle_low.Init(
Anton Bikineev068d2912021-05-15 20:43:524623 TestGroupId("a"), params_, absl::nullopt, LOW, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284624 ClientSocketPool::RespectLimits::ENABLED,
4625 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4626 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434627
Matt Menke9fa17d52019-03-25 19:12:264628 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4629 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4630 TestGroupId("a")));
4631 EXPECT_EQ(0u,
4632 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394633 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434634
4635 ClientSocketHandle handle_lowest2;
4636 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284637 EXPECT_EQ(
4638 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524639 handle_lowest2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284640 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4641 callback_lowest2.callback(),
4642 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4643 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434644
Matt Menke9fa17d52019-03-25 19:12:264645 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4646 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4647 TestGroupId("a")));
4648 EXPECT_EQ(0u,
4649 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394650 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434651
4652 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394653 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4654 &handle_highest));
4655 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4656 &handle_low));
4657 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4658 &handle_lowest));
4659 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4660 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434661
4662 // Add another request with medium priority. It should steal the job from the
4663 // lowest priority request with a job.
4664 ClientSocketHandle handle_medium;
4665 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284666 EXPECT_EQ(
4667 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524668 handle_medium.Init(TestGroupId("a"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:284669 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4670 callback_medium.callback(),
4671 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4672 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434673
Matt Menke9fa17d52019-03-25 19:12:264674 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4675 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4676 TestGroupId("a")));
4677 EXPECT_EQ(0u,
4678 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394679 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4680 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4681 &handle_highest));
4682 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4683 &handle_medium));
4684 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4685 &handle_low));
4686 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4687 &handle_lowest));
4688 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4689 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434690}
4691
4692TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4693 CreatePool(kDefaultMaxSockets, 1);
4694 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4695
4696 ClientSocketHandle handle1;
4697 TestCompletionCallback callback1;
4698 EXPECT_EQ(
4699 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524700 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284701 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504702 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4703 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434704
Matt Menke9fa17d52019-03-25 19:12:264705 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4706 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4707 TestGroupId("a")));
4708 EXPECT_EQ(0u,
4709 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394710 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434711
4712 ClientSocketHandle handle2;
4713 TestCompletionCallback callback2;
4714 EXPECT_EQ(
4715 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524716 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284717 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504718 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4719 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434720
Matt Menke9fa17d52019-03-25 19:12:264721 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4722 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4723 TestGroupId("a")));
4724 EXPECT_EQ(0u,
4725 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394726 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434727
4728 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394729 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4730 &handle1));
4731 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4732 &handle2));
Lily Chenecebf932018-11-02 17:15:434733
4734 // Reprioritizing the second request places it above the first, and it steals
4735 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394736 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4737 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4738 &handle2));
4739 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4740 &handle1));
Lily Chenecebf932018-11-02 17:15:434741}
4742
4743TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4744 CreatePool(kDefaultMaxSockets, 1);
4745 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4746
4747 ClientSocketHandle handle1;
4748 TestCompletionCallback callback1;
4749 EXPECT_EQ(
4750 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524751 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284752 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504753 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4754 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434755
Matt Menke9fa17d52019-03-25 19:12:264756 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4757 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4758 TestGroupId("a")));
4759 EXPECT_EQ(0u,
4760 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394761 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434762
Matt Menkec6b3edf72019-03-19 17:00:394763 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4764 &handle1));
Lily Chenecebf932018-11-02 17:15:434765
4766 ClientSocketHandle handle2;
4767 TestCompletionCallback callback2;
4768 EXPECT_EQ(
4769 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524770 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284771 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504772 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4773 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434774
Matt Menke9fa17d52019-03-25 19:12:264775 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4776 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4777 TestGroupId("a")));
4778 EXPECT_EQ(0u,
4779 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394780 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434781
4782 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394783 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4784 &handle1));
4785 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4786 &handle2));
Lily Chenecebf932018-11-02 17:15:434787
4788 // The second request should get a job upon cancelling the first request.
4789 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264790 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4791 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4792 TestGroupId("a")));
4793 EXPECT_EQ(0u,
4794 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394795 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434796
Matt Menkec6b3edf72019-03-19 17:00:394797 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4798 &handle2));
Lily Chenecebf932018-11-02 17:15:434799}
4800
4801TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4802 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4803 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4804
4805 ClientSocketHandle handle1;
4806 TestCompletionCallback callback1;
4807 EXPECT_EQ(
4808 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524809 handle1.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284810 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504811 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4812 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434813
Matt Menke9fa17d52019-03-25 19:12:264814 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4815 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4816 TestGroupId("a")));
4817 EXPECT_EQ(0u,
4818 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394819 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434820
4821 ClientSocketHandle handle2;
4822 TestCompletionCallback callback2;
4823 EXPECT_EQ(
4824 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524825 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284826 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504827 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4828 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434829
Matt Menke9fa17d52019-03-25 19:12:264830 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4831 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4832 TestGroupId("a")));
4833 EXPECT_EQ(0u,
4834 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394835 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434836
Matt Menkec6b3edf72019-03-19 17:00:394837 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4838 &handle1));
4839 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4840 &handle2));
Lily Chenecebf932018-11-02 17:15:434841
4842 // The lower-priority job completes first. The higher-priority request should
4843 // get the socket, and the lower-priority request should get the remaining
4844 // job.
4845 client_socket_factory_.SignalJob(1);
4846 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264847 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4848 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4849 TestGroupId("a")));
4850 EXPECT_EQ(0u,
4851 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4852 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394853 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434854 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394855 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4856 &handle2));
Lily Chenecebf932018-11-02 17:15:434857}
4858
[email protected]043b68c82013-08-22 23:41:524859class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204860 public:
Matt Menke9fa17d52019-03-25 19:12:264861 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394862 const ClientSocketPool::GroupId& group_id)
4863 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524864 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204865 }
4866
Daniel Cheng4496d0822018-04-26 21:52:154867 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204868
Matt Menke9fa17d52019-03-25 19:12:264869 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504870 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034871 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524872 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284873 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4874 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204875 }
4876
Matt Menke9fa17d52019-03-25 19:12:264877 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504878 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034879 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524880 absl::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504881 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4882 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204883 }
4884
4885 bool ReleaseOneConnection() {
4886 if (!handle_.is_initialized() || !can_release_connection_) {
4887 return false;
4888 }
4889 handle_.socket()->Disconnect();
4890 handle_.Reset();
4891 return true;
4892 }
4893
4894 void set_can_release_connection(bool can_release_connection) {
4895 can_release_connection_ = can_release_connection;
4896 }
4897
4898 MOCK_METHOD0(CloseOneIdleConnection, bool());
4899
4900 private:
Keishi Hattori0e45c022021-11-27 09:25:524901 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]58e562f2013-04-22 17:32:204902 ClientSocketHandle handle_;
4903 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394904 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204905 bool can_release_connection_;
4906};
4907
[email protected]58e562f2013-04-22 17:32:204908// Tests the basic case of closing an idle socket in a higher layered pool when
4909// a new request is issued and the lower layer pool is stalled.
4910TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4911 CreatePool(1, 1);
4912 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4913
Matt Menkec6b3edf72019-03-19 17:00:394914 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014915 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204916 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4917 .WillOnce(Invoke(&mock_layered_pool,
4918 &MockLayeredPool::ReleaseOneConnection));
4919 ClientSocketHandle handle;
4920 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504921 EXPECT_EQ(
4922 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524923 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284924 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4925 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4926 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014927 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204928}
4929
Matt Menke833678642019-03-05 22:05:514930// Tests the case that trying to close an idle socket in a higher layered pool
4931// fails.
4932TEST_F(ClientSocketPoolBaseTest,
4933 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4934 CreatePool(1, 1);
4935 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4936
Matt Menkec6b3edf72019-03-19 17:00:394937 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514938 mock_layered_pool.set_can_release_connection(false);
4939 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4940 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4941 .WillOnce(Invoke(&mock_layered_pool,
4942 &MockLayeredPool::ReleaseOneConnection));
4943 ClientSocketHandle handle;
4944 TestCompletionCallback callback;
4945 EXPECT_EQ(
4946 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524947 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284948 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4949 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4950 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514951 base::RunLoop().RunUntilIdle();
4952 EXPECT_FALSE(callback.have_result());
4953}
4954
[email protected]58e562f2013-04-22 17:32:204955// Same as above, but the idle socket is in the same group as the stalled
4956// socket, and closes the only other request in its group when closing requests
4957// in higher layered pools. This generally shouldn't happen, but it may be
4958// possible if a higher level pool issues a request and the request is
4959// subsequently cancelled. Even if it's not possible, best not to crash.
4960TEST_F(ClientSocketPoolBaseTest,
4961 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4962 CreatePool(2, 2);
4963 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4964
4965 // Need a socket in another group for the pool to be stalled (If a group
4966 // has the maximum number of connections already, it's not stalled).
4967 ClientSocketHandle handle1;
4968 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524969 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284970 DEFAULT_PRIORITY, SocketTag(),
4971 ClientSocketPool::RespectLimits::ENABLED,
4972 callback1.callback(),
4973 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4974 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204975
Matt Menkec6b3edf72019-03-19 17:00:394976 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014977 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204978 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4979 .WillOnce(Invoke(&mock_layered_pool,
4980 &MockLayeredPool::ReleaseOneConnection));
4981 ClientSocketHandle handle;
4982 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284983 EXPECT_EQ(ERR_IO_PENDING,
4984 handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524985 TestGroupId("group2"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284986 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4987 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4988 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014989 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204990}
4991
4992// Tests the case when an idle socket can be closed when a new request is
4993// issued, and the new request belongs to a group that was previously stalled.
4994TEST_F(ClientSocketPoolBaseTest,
4995 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4996 CreatePool(2, 2);
4997 std::list<TestConnectJob::JobType> job_types;
4998 job_types.push_back(TestConnectJob::kMockJob);
4999 job_types.push_back(TestConnectJob::kMockJob);
5000 job_types.push_back(TestConnectJob::kMockJob);
5001 job_types.push_back(TestConnectJob::kMockJob);
5002 connect_job_factory_->set_job_types(&job_types);
5003
5004 ClientSocketHandle handle1;
5005 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:525006 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:285007 DEFAULT_PRIORITY, SocketTag(),
5008 ClientSocketPool::RespectLimits::ENABLED,
5009 callback1.callback(),
5010 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5011 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205012
Matt Menkec6b3edf72019-03-19 17:00:395013 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:015014 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205015 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
5016 .WillRepeatedly(Invoke(&mock_layered_pool,
5017 &MockLayeredPool::ReleaseOneConnection));
5018 mock_layered_pool.set_can_release_connection(false);
5019
5020 // The third request is made when the socket pool is in a stalled state.
5021 ClientSocketHandle handle3;
5022 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:285023 EXPECT_EQ(ERR_IO_PENDING,
5024 handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:525025 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285026 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5027 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5028 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205029
5030 base::RunLoop().RunUntilIdle();
5031 EXPECT_FALSE(callback3.have_result());
5032
5033 // The fourth request is made when the pool is no longer stalled. The third
5034 // request should be serviced first, since it was issued first and has the
5035 // same priority.
5036 mock_layered_pool.set_can_release_connection(true);
5037 ClientSocketHandle handle4;
5038 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:285039 EXPECT_EQ(ERR_IO_PENDING,
5040 handle4.Init(
Anton Bikineev068d2912021-05-15 20:43:525041 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285042 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5043 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5044 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015045 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205046 EXPECT_FALSE(callback4.have_result());
5047
5048 // Closing a handle should free up another socket slot.
5049 handle1.Reset();
robpercival214763f2016-07-01 23:27:015050 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205051}
5052
5053// Tests the case when an idle socket can be closed when a new request is
5054// issued, and the new request belongs to a group that was previously stalled.
5055//
5056// The two differences from the above test are that the stalled requests are not
5057// in the same group as the layered pool's request, and the the fourth request
5058// has a higher priority than the third one, so gets a socket first.
5059TEST_F(ClientSocketPoolBaseTest,
5060 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
5061 CreatePool(2, 2);
5062 std::list<TestConnectJob::JobType> job_types;
5063 job_types.push_back(TestConnectJob::kMockJob);
5064 job_types.push_back(TestConnectJob::kMockJob);
5065 job_types.push_back(TestConnectJob::kMockJob);
5066 job_types.push_back(TestConnectJob::kMockJob);
5067 connect_job_factory_->set_job_types(&job_types);
5068
5069 ClientSocketHandle handle1;
5070 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:525071 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:285072 DEFAULT_PRIORITY, SocketTag(),
5073 ClientSocketPool::RespectLimits::ENABLED,
5074 callback1.callback(),
5075 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5076 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205077
Matt Menkec6b3edf72019-03-19 17:00:395078 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:015079 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205080 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
5081 .WillRepeatedly(Invoke(&mock_layered_pool,
5082 &MockLayeredPool::ReleaseOneConnection));
5083 mock_layered_pool.set_can_release_connection(false);
5084
5085 // The third request is made when the socket pool is in a stalled state.
5086 ClientSocketHandle handle3;
5087 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:205088 EXPECT_EQ(
5089 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525090 handle3.Init(TestGroupId("group3"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:285091 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505092 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5093 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205094
5095 base::RunLoop().RunUntilIdle();
5096 EXPECT_FALSE(callback3.have_result());
5097
5098 // The fourth request is made when the pool is no longer stalled. This
5099 // request has a higher priority than the third request, so is serviced first.
5100 mock_layered_pool.set_can_release_connection(true);
5101 ClientSocketHandle handle4;
5102 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:205103 EXPECT_EQ(
5104 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525105 handle4.Init(TestGroupId("group3"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:285106 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505107 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5108 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015109 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205110 EXPECT_FALSE(callback3.have_result());
5111
5112 // Closing a handle should free up another socket slot.
5113 handle1.Reset();
robpercival214763f2016-07-01 23:27:015114 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205115}
5116
5117TEST_F(ClientSocketPoolBaseTest,
5118 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
5119 CreatePool(1, 1);
5120 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5121
Matt Menkec6b3edf72019-03-19 17:00:395122 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:015123 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205124 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
5125 .WillRepeatedly(Invoke(&mock_layered_pool1,
5126 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:395127 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:015128 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
5129 IsOk());
[email protected]58e562f2013-04-22 17:32:205130 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
5131 .WillRepeatedly(Invoke(&mock_layered_pool2,
5132 &MockLayeredPool::ReleaseOneConnection));
5133 ClientSocketHandle handle;
5134 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:505135 EXPECT_EQ(
5136 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525137 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285138 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5139 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5140 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015141 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205142}
5143
[email protected]b021ece62013-06-11 11:06:335144// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:155145// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
5146// socket instead of a request with the same priority that was issued earlier,
5147// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:335148TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:335149 CreatePool(1, 1);
5150
5151 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395152 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5153 TestGroupId("a"), MAXIMUM_PRIORITY,
5154 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265155 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335156
5157 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5158
mmenked3641e12016-01-28 16:06:155159 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395160 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155161 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265162 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335163
mmenked3641e12016-01-28 16:06:155164 // Issue a request that ignores the limits, so a new ConnectJob is
5165 // created.
5166 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395167 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155168 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265169 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335170
robpercival214763f2016-07-01 23:27:015171 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335172 EXPECT_FALSE(request(1)->have_result());
5173}
5174
[email protected]c55fabd2013-11-04 23:26:565175// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155176// issued for a request with RespectLimits::DISABLED is not cancelled when a
5177// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565178TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565179 CreatePool(1, 1);
5180
5181 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395182 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5183 TestGroupId("a"), MAXIMUM_PRIORITY,
5184 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265185 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565186
5187 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5188
mmenked3641e12016-01-28 16:06:155189 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395190 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155191 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265192 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565193
mmenked3641e12016-01-28 16:06:155194 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5195 // created.
5196 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395197 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155198 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265199 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335200
mmenked3641e12016-01-28 16:06:155201 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335202 // should not be cancelled.
5203 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265204 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335205
robpercival214763f2016-07-01 23:27:015206 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335207 EXPECT_FALSE(request(1)->have_result());
5208}
5209
Matt Menkeb57663b32019-03-01 17:17:105210TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5211 CreatePool(1, 1);
5212
5213 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5214
5215 ClientSocketHandle handle;
5216 TestCompletionCallback callback;
5217 EXPECT_EQ(
5218 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525219 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285220 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5221 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5222 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105223
Matt Menke9fa17d52019-03-25 19:12:265224 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105225
5226 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5227 EXPECT_FALSE(handle.is_initialized());
5228 EXPECT_FALSE(handle.socket());
5229
5230 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265231 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105232}
5233
5234class TestAuthHelper {
5235 public:
5236 TestAuthHelper() = default;
Peter Boström293b1342021-09-22 17:31:435237
5238 TestAuthHelper(const TestAuthHelper&) = delete;
5239 TestAuthHelper& operator=(const TestAuthHelper&) = delete;
5240
Matt Menkeb57663b32019-03-01 17:17:105241 ~TestAuthHelper() = default;
5242
Matt Menkec6b3edf72019-03-19 17:00:395243 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195244 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265245 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395246 RequestPriority priority = DEFAULT_PRIORITY,
5247 ClientSocketPool::RespectLimits respect_limits =
5248 ClientSocketPool::RespectLimits::ENABLED,
5249 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105250 EXPECT_EQ(ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525251 handle_.Init(group_id_in, params, absl::nullopt, priority,
Matt Menkef09e64c2019-04-23 22:16:285252 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105253 base::BindRepeating(&TestAuthHelper::AuthCallback,
5254 base::Unretained(this)),
5255 pool, NetLogWithSource()));
5256 }
5257
5258 void WaitForAuth() {
5259 run_loop_ = std::make_unique<base::RunLoop>();
5260 run_loop_->Run();
5261 run_loop_.reset();
5262 }
5263
5264 void WaitForAuthAndRestartSync() {
5265 restart_sync_ = true;
5266 WaitForAuth();
5267 restart_sync_ = false;
5268 }
5269
5270 void WaitForAuthAndResetHandleSync() {
5271 reset_handle_sync_ = true;
5272 WaitForAuth();
5273 reset_handle_sync_ = false;
5274 }
5275
5276 void RestartWithAuth() {
5277 DCHECK(restart_with_auth_callback_);
5278 std::move(restart_with_auth_callback_).Run();
5279 }
5280
5281 int WaitForResult() {
5282 int result = callback_.WaitForResult();
5283 // There shouldn't be any callback waiting to be invoked once the request is
5284 // complete.
5285 EXPECT_FALSE(restart_with_auth_callback_);
5286 // The socket should only be initialized on success.
5287 EXPECT_EQ(result == OK, handle_.is_initialized());
5288 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5289 return result;
5290 }
5291
5292 ClientSocketHandle* handle() { return &handle_; }
5293 int auth_count() const { return auth_count_; }
5294 int have_result() const { return callback_.have_result(); }
5295
5296 private:
5297 void AuthCallback(const HttpResponseInfo& response,
5298 HttpAuthController* auth_controller,
5299 base::OnceClosure restart_with_auth_callback) {
5300 EXPECT_FALSE(restart_with_auth_callback_);
5301 EXPECT_TRUE(restart_with_auth_callback);
5302
5303 // Once there's a result, this method shouldn't be invoked again.
5304 EXPECT_FALSE(callback_.have_result());
5305
5306 ++auth_count_;
5307 run_loop_->Quit();
5308 if (restart_sync_) {
5309 std::move(restart_with_auth_callback).Run();
5310 return;
5311 }
5312
5313 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5314
5315 if (reset_handle_sync_) {
5316 handle_.Reset();
5317 return;
5318 }
5319 }
5320
5321 std::unique_ptr<base::RunLoop> run_loop_;
5322 base::OnceClosure restart_with_auth_callback_;
5323
5324 bool restart_sync_ = false;
5325 bool reset_handle_sync_ = false;
5326
5327 ClientSocketHandle handle_;
5328 int auth_count_ = 0;
5329 TestCompletionCallback callback_;
Matt Menkeb57663b32019-03-01 17:17:105330};
5331
5332TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5333 CreatePool(1, 1);
5334 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5335
5336 TestAuthHelper auth_helper;
5337 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265338 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015339 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395340 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105341
5342 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265343 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015344 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395345 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105346
5347 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265348 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015349 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395350 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105351
5352 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5353 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265354 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5355 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395356 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105357 EXPECT_EQ(0, pool_->IdleSocketCount());
5358}
5359
5360TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5361 CreatePool(1, 1);
5362 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5363
5364 TestAuthHelper auth_helper;
5365 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265366 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015367 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395368 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105369
5370 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265371 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015372 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395373 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105374
5375 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5376 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265377 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5378 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395379 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105380 EXPECT_EQ(0, pool_->IdleSocketCount());
5381}
5382
5383TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5384 CreatePool(1, 1);
5385 connect_job_factory_->set_job_type(
5386 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5387
5388 TestAuthHelper auth_helper;
5389 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265390 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105391
5392 auth_helper.WaitForAuth();
5393 auth_helper.RestartWithAuth();
5394 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5395
5396 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265397 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105398 EXPECT_EQ(0, pool_->IdleSocketCount());
5399}
5400
5401TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5402 CreatePool(1, 1);
5403 connect_job_factory_->set_job_type(
5404 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5405
5406 TestAuthHelper auth_helper;
5407 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265408 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105409
5410 auth_helper.WaitForAuthAndRestartSync();
5411 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5412
5413 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265414 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105415 EXPECT_EQ(0, pool_->IdleSocketCount());
5416}
5417
5418TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5419 CreatePool(1, 1);
5420 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5421
5422 TestAuthHelper auth_helper;
5423 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265424 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105425
5426 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265427 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105428
5429 auth_helper.handle()->Reset();
5430
5431 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265432 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105433 EXPECT_EQ(0, pool_->IdleSocketCount());
5434 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5435 EXPECT_FALSE(auth_helper.handle()->socket());
5436}
5437
5438TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5439 CreatePool(1, 1);
5440 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5441
5442 TestAuthHelper auth_helper;
5443 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265444 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105445
5446 auth_helper.WaitForAuthAndResetHandleSync();
5447 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265448 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105449 EXPECT_EQ(0, pool_->IdleSocketCount());
5450 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5451 EXPECT_FALSE(auth_helper.handle()->socket());
5452}
5453
5454TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5455 CreatePool(1, 1);
5456 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5457
5458 TestAuthHelper auth_helper;
5459 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265460 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105461
5462 auth_helper.WaitForAuth();
5463
Matt Menke433de6d2020-03-04 00:24:115464 pool_->FlushWithError(ERR_FAILED, "Network changed");
Matt Menkeb57663b32019-03-01 17:17:105465 base::RunLoop().RunUntilIdle();
5466
5467 // When flushing the socket pool, bound sockets should delay returning the
5468 // error until completion.
5469 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265470 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105471 EXPECT_EQ(0, pool_->IdleSocketCount());
5472
5473 auth_helper.RestartWithAuth();
5474 // The callback should be called asynchronously.
5475 EXPECT_FALSE(auth_helper.have_result());
5476
5477 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265478 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105479 EXPECT_EQ(0, pool_->IdleSocketCount());
5480}
5481
5482TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5483 CreatePool(1, 1);
5484 connect_job_factory_->set_job_type(
5485 TestConnectJob::kMockAuthChallengeTwiceJob);
5486
5487 TestAuthHelper auth_helper;
5488 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265489 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015490 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395491 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105492
5493 auth_helper.WaitForAuth();
5494 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265495 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105496 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015497 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395498 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105499
5500 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265501 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015502 EXPECT_EQ(2, auth_helper.auth_count());
5503 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395504 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015505
Matt Menkeb57663b32019-03-01 17:17:105506 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265507 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105508 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015509 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395510 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105511
5512 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5513 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265514 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5515 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395516 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105517 EXPECT_EQ(0, pool_->IdleSocketCount());
5518}
5519
5520TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5521 CreatePool(1, 1);
5522 connect_job_factory_->set_job_type(
5523 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5524
5525 TestAuthHelper auth_helper;
5526 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265527 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105528
5529 auth_helper.WaitForAuth();
5530 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265531 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105532 EXPECT_EQ(1, auth_helper.auth_count());
5533
5534 auth_helper.WaitForAuth();
5535 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265536 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105537 EXPECT_EQ(2, auth_helper.auth_count());
5538
5539 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5540 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265541 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105542 EXPECT_EQ(0, pool_->IdleSocketCount());
5543}
5544
5545// Makes sure that when a bound request is destroyed, a new ConnectJob is
5546// created, if needed.
5547TEST_F(ClientSocketPoolBaseTest,
5548 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5549 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5550 connect_job_factory_->set_job_type(
5551 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5552
5553 // First request creates a ConnectJob.
5554 TestAuthHelper auth_helper1;
5555 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265556 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105557
5558 // A second request come in, but no new ConnectJob is needed, since the limit
5559 // has been reached.
5560 TestAuthHelper auth_helper2;
5561 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265562 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105563
5564 // Run until the auth callback for the first request is invoked.
5565 auth_helper1.WaitForAuth();
5566 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265567 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5568 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395569 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105570
5571 // Make connect jobs succeed, then cancel the first request, which should
5572 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5573 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5574 auth_helper1.handle()->Reset();
5575 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265576 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105577
5578 // The second ConnectJob should succeed.
5579 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5580 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265581 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105582}
5583
5584// Makes sure that when a bound request is destroyed, a new ConnectJob is
5585// created for another group, if needed.
5586TEST_F(ClientSocketPoolBaseTest,
5587 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5588 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5589 connect_job_factory_->set_job_type(
5590 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5591
5592 // First request creates a ConnectJob.
5593 TestAuthHelper auth_helper1;
5594 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265595 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105596
5597 // A second request come in, but no new ConnectJob is needed, since the limit
5598 // has been reached.
5599 TestAuthHelper auth_helper2;
5600 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395601 ClientSocketPool::RespectLimits::ENABLED,
5602 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265603 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5604 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105605
5606 // Run until the auth callback for the first request is invoked.
5607 auth_helper1.WaitForAuth();
5608 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265609 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5610 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395611 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265612 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5613 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395614 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105615
5616 // Make connect jobs succeed, then cancel the first request, which should
5617 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5618 // other group.
5619 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5620 auth_helper1.handle()->Reset();
5621 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265622 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5623 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105624
5625 // The second ConnectJob should succeed.
5626 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5627 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265628 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5629 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105630}
5631
5632// Test that once an auth challenge is bound, that's the request that gets all
5633// subsequent calls and the socket itself.
5634TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5635 CreatePool(1, 1);
5636 connect_job_factory_->set_job_type(
5637 TestConnectJob::kMockAuthChallengeTwiceJob);
5638
5639 // First request creates a ConnectJob.
5640 TestAuthHelper auth_helper1;
5641 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265642 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105643
5644 // A second, higher priority request is made.
5645 TestAuthHelper auth_helper2;
5646 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265647 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105648
5649 // Run until the auth callback for the second request is invoked.
5650 auth_helper2.WaitForAuth();
5651 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265652 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5653 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395654 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105655
5656 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5657 // ConnectJob.
5658 TestAuthHelper auth_helper3;
5659 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265660 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105661
5662 // Start a higher job that ignores limits, creating a hanging socket. It
5663 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5664 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5665 TestAuthHelper auth_helper4;
5666 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5667 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265668 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105669
5670 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5671 // again.
5672 auth_helper2.RestartWithAuth();
5673 auth_helper2.WaitForAuth();
5674 EXPECT_EQ(0, auth_helper1.auth_count());
5675 EXPECT_FALSE(auth_helper1.have_result());
5676 EXPECT_EQ(2, auth_helper2.auth_count());
5677 EXPECT_FALSE(auth_helper2.have_result());
5678 EXPECT_EQ(0, auth_helper3.auth_count());
5679 EXPECT_FALSE(auth_helper3.have_result());
5680 EXPECT_EQ(0, auth_helper4.auth_count());
5681 EXPECT_FALSE(auth_helper4.have_result());
5682
5683 // Advance auth again, and |auth_helper2| should get the socket.
5684 auth_helper2.RestartWithAuth();
5685 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5686 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5687 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265688 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5689 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105690 EXPECT_EQ(0, auth_helper1.auth_count());
5691 EXPECT_FALSE(auth_helper1.have_result());
5692 EXPECT_EQ(0, auth_helper3.auth_count());
5693 EXPECT_FALSE(auth_helper3.have_result());
5694 EXPECT_EQ(0, auth_helper4.auth_count());
5695 EXPECT_FALSE(auth_helper4.have_result());
5696
5697 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5698 // socket request should be able to claim it.
5699 auth_helper2.handle()->Reset();
5700 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5701 EXPECT_EQ(0, auth_helper1.auth_count());
5702 EXPECT_FALSE(auth_helper1.have_result());
5703 EXPECT_EQ(0, auth_helper3.auth_count());
5704 EXPECT_FALSE(auth_helper3.have_result());
5705 EXPECT_EQ(0, auth_helper4.auth_count());
5706}
5707
David Benjaminbac8dff2019-08-07 01:30:415708enum class RefreshType {
5709 kServer,
5710 kProxy,
5711};
5712
5713// Common base class to test RefreshGroup() when called from either
5714// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5715//
5716// Tests which test behavior specific to one or the other case should use
5717// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5718// when the pool's proxy matches.
5719class ClientSocketPoolBaseRefreshTest
5720 : public ClientSocketPoolBaseTest,
5721 public testing::WithParamInterface<RefreshType> {
5722 public:
5723 void CreatePoolForRefresh(int max_sockets,
5724 int max_sockets_per_group,
5725 bool enable_backup_connect_jobs = false) {
5726 switch (GetParam()) {
5727 case RefreshType::kServer:
5728 CreatePool(max_sockets, max_sockets_per_group,
5729 enable_backup_connect_jobs);
5730 break;
5731 case RefreshType::kProxy:
5732 CreatePoolWithIdleTimeouts(
5733 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5734 ClientSocketPool::used_idle_socket_timeout(),
5735 enable_backup_connect_jobs,
Eric Orth5ccc3f02021-09-23 00:01:575736 PacResultElementToProxyServer("HTTPS myproxy:70"));
David Benjaminbac8dff2019-08-07 01:30:415737 break;
5738 }
5739 }
5740
5741 static ClientSocketPool::GroupId GetGroupId() {
Eric Ortha2e7773212021-06-22 21:49:555742 return TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415743 }
5744
David Benjamin6dd7e882019-10-10 02:35:235745 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5746 // Note this GroupId will match GetGroupId() unless
5747 // kPartitionConnectionsByNetworkIsolationKey is enabled.
Matt Menke4807a9a2020-11-21 00:14:415748 const SchemefulSite kSite(GURL("https://b/"));
5749 const NetworkIsolationKey kNetworkIsolationKey(kSite, kSite);
Eric Ortha2e7773212021-06-22 21:49:555750 return TestGroupId("a", 443, url::kHttpsScheme,
David Benjamin6dd7e882019-10-10 02:35:235751 PrivacyMode::PRIVACY_MODE_DISABLED,
5752 kNetworkIsolationKey);
5753 }
5754
David Benjaminbac8dff2019-08-07 01:30:415755 void OnSSLConfigForServerChanged() {
5756 switch (GetParam()) {
5757 case RefreshType::kServer:
5758 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5759 break;
5760 case RefreshType::kProxy:
5761 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5762 break;
5763 }
5764 }
5765};
5766
5767INSTANTIATE_TEST_SUITE_P(RefreshType,
5768 ClientSocketPoolBaseRefreshTest,
5769 ::testing::Values(RefreshType::kServer,
5770 RefreshType::kProxy));
5771
5772TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5773 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5774 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245775
5776 // First job will be waiting until it gets aborted.
5777 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5778
5779 ClientSocketHandle handle;
5780 TestCompletionCallback callback;
5781 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525782 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285783 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5784 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5785 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245786 IsError(ERR_IO_PENDING));
5787
5788 // Switch connect job types, so creating a new ConnectJob will result in
5789 // success.
5790 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5791
David Benjaminbac8dff2019-08-07 01:30:415792 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245793 EXPECT_EQ(OK, callback.WaitForResult());
5794 ASSERT_TRUE(handle.socket());
5795 EXPECT_EQ(0, pool_->IdleSocketCount());
5796 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5797 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5798 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5799 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5800}
5801
David Benjaminbac8dff2019-08-07 01:30:415802TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235803 base::test::ScopedFeatureList feature_list;
5804 feature_list.InitAndEnableFeature(
5805 features::kPartitionConnectionsByNetworkIsolationKey);
5806
David Benjaminbac8dff2019-08-07 01:30:415807 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5808 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235809 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245810
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:215811 EXPECT_EQ(
5812 OK, pool_->RequestSockets(kGroupId, params_, absl::nullopt, 2,
5813 CompletionOnceCallback(), NetLogWithSource()));
5814
5815 EXPECT_EQ(
5816 OK, pool_->RequestSockets(kGroupIdInPartition, params_, absl::nullopt, 2,
5817 CompletionOnceCallback(), NetLogWithSource()));
Matt Menkebf3c767d2019-04-15 23:28:245818 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235819 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5820 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245821 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235822 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245823
David Benjaminbac8dff2019-08-07 01:30:415824 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245825 EXPECT_EQ(0, pool_->IdleSocketCount());
5826 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235827 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245828}
5829
5830TEST_F(ClientSocketPoolBaseTest,
5831 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5832 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415833 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555834 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415835 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555836 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245837
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:215838 EXPECT_EQ(
5839 OK, pool_->RequestSockets(kOtherGroupId, params_, absl::nullopt, 2,
5840 CompletionOnceCallback(), NetLogWithSource()));
Matt Menkebf3c767d2019-04-15 23:28:245841 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5842 EXPECT_EQ(2, pool_->IdleSocketCount());
5843 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5844
David Benjaminbac8dff2019-08-07 01:30:415845 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245846 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5847 EXPECT_EQ(2, pool_->IdleSocketCount());
5848 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5849}
5850
David Benjaminbac8dff2019-08-07 01:30:415851TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5852 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5853 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245854
5855 ClientSocketHandle handle;
5856 TestCompletionCallback callback;
5857 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525858 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285859 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5860 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5861 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245862 IsOk());
5863 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5864 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5865
David Benjaminbac8dff2019-08-07 01:30:415866 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245867
5868 handle.Reset();
5869 EXPECT_EQ(0, pool_->IdleSocketCount());
5870 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5871}
5872
5873TEST_F(ClientSocketPoolBaseTest,
5874 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5875 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415876 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555877 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415878 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555879 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245880
5881 ClientSocketHandle handle;
5882 TestCompletionCallback callback;
5883 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525884 handle.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285885 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5886 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5887 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245888 IsOk());
5889 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5890 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5891
David Benjaminbac8dff2019-08-07 01:30:415892 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245893
5894 handle.Reset();
5895 EXPECT_EQ(1, pool_->IdleSocketCount());
5896 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5897 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5898}
5899
David Benjaminbac8dff2019-08-07 01:30:415900TEST_P(ClientSocketPoolBaseRefreshTest,
5901 RefreshGroupReplacesBoundConnectJobOnConnect) {
5902 CreatePoolForRefresh(1, 1);
5903 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245904 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5905
5906 TestAuthHelper auth_helper;
5907 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5908 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5909 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5910
5911 auth_helper.WaitForAuth();
5912
5913 // This should update the generation, but not cancel the old ConnectJob - it's
5914 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415915 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245916
5917 // Providing auth credentials and restarting the request with them will cause
5918 // the ConnectJob to complete successfully, but the result will be discarded
5919 // because of the generation mismatch.
5920 auth_helper.RestartWithAuth();
5921
5922 // Despite using ConnectJobs that simulate a single challenge, a second
5923 // challenge will be seen, due to using a new ConnectJob.
5924 auth_helper.WaitForAuth();
5925 auth_helper.RestartWithAuth();
5926
5927 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5928 EXPECT_TRUE(auth_helper.handle()->socket());
5929 EXPECT_EQ(2, auth_helper.auth_count());
5930
5931 // When released, the socket will be returned to the socket pool, and
5932 // available for reuse.
5933 auth_helper.handle()->Reset();
5934 EXPECT_EQ(1, pool_->IdleSocketCount());
5935 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5936 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5937}
5938
David Benjaminbac8dff2019-08-07 01:30:415939TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5940 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5941 kUnusedIdleSocketTimeout,
5942 ClientSocketPool::used_idle_socket_timeout(),
5943 false /* no backup connect jobs */,
Eric Orth5ccc3f02021-09-23 00:01:575944 PacResultElementToProxyServer("HTTPS myproxy:70"));
David Benjaminbac8dff2019-08-07 01:30:415945
5946 const ClientSocketPool::GroupId kGroupId1 =
Eric Ortha2e7773212021-06-22 21:49:555947 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415948 const ClientSocketPool::GroupId kGroupId2 =
Eric Ortha2e7773212021-06-22 21:49:555949 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415950 const ClientSocketPool::GroupId kGroupId3 =
Eric Ortha2e7773212021-06-22 21:49:555951 TestGroupId("c", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415952
5953 // Make three sockets in three different groups. The third socket is released
5954 // to the pool as idle.
5955 ClientSocketHandle handle1, handle2, handle3;
5956 TestCompletionCallback callback;
5957 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525958 handle1.Init(kGroupId1, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415959 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5960 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5961 pool_.get(), NetLogWithSource()),
5962 IsOk());
5963 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525964 handle2.Init(kGroupId2, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415965 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5966 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5967 pool_.get(), NetLogWithSource()),
5968 IsOk());
5969 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525970 handle3.Init(kGroupId3, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415971 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5972 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5973 pool_.get(), NetLogWithSource()),
5974 IsOk());
5975 handle3.Reset();
5976 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5977 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5978 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5979 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5980 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5981 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5982
5983 // Changes to some other proxy do not affect the pool. The idle socket remains
5984 // alive and closing |handle2| makes the socket available for the pool.
5985 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5986
5987 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5988 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5989 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5990 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5991 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5992 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5993
5994 handle2.Reset();
5995 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5996 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5997
5998 // Changes to the matching proxy refreshes all groups.
5999 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
6000
6001 // Idle sockets are closed.
6002 EXPECT_EQ(0, pool_->IdleSocketCount());
6003 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
6004 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
6005
6006 // The active socket, however, continues to be active.
6007 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
6008 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
6009
6010 // Closing it does not make it available for the pool.
6011 handle1.Reset();
6012 EXPECT_EQ(0, pool_->IdleSocketCount());
6013 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
6014}
6015
6016TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
6017 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
6018
Eric Ortha2e7773212021-06-22 21:49:556019 const ClientSocketPool::GroupId kGroupId = TestGroupId(
6020 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_DISABLED);
6021 const ClientSocketPool::GroupId kGroupIdPrivacy = TestGroupId(
6022 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_ENABLED);
David Benjaminbac8dff2019-08-07 01:30:416023 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:556024 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:416025
6026 // Make a socket in each groups.
6027 ClientSocketHandle handle1, handle2, handle3;
6028 TestCompletionCallback callback;
6029 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526030 handle1.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416031 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6032 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6033 pool_.get(), NetLogWithSource()),
6034 IsOk());
6035 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526036 handle2.Init(kGroupIdPrivacy, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416037 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6038 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6039 pool_.get(), NetLogWithSource()),
6040 IsOk());
6041 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526042 handle3.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416043 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6044 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6045 pool_.get(), NetLogWithSource()),
6046 IsOk());
6047 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
6048 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
6049 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6050 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
6051 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6052 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
6053
6054 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
6055
6056 // Active sockets continue to be active.
6057 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
6058 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
6059 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6060 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
6061 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6062 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
6063
6064 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
6065 // are unusable.
6066 handle1.Reset();
6067 handle2.Reset();
6068 handle3.Reset();
6069 EXPECT_EQ(1, pool_->IdleSocketCount());
6070 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
6071 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6072 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6073 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
6074}
6075
[email protected]f6d1d6eb2009-06-24 20:16:096076} // namespace
6077
6078} // namespace net