blob: a64a4e2146958a42313a6f9bb8216a0fa24d576e [file] [log] [blame]
Avi Drissman64595482022-09-14 20:52:291// Copyright 2012 The Chromium Authors
[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"
Brianna Goldsteina7593fca2022-09-28 02:59:3233#include "net/base/network_anonymization_key.h"
Matt Menke166443c2019-05-24 18:45:5934#include "net/base/network_isolation_key.h"
Matt Menkebdf777802019-04-22 19:38:5935#include "net/base/privacy_mode.h"
Matt Menkeaafff542019-04-22 22:09:3636#include "net/base/proxy_server.h"
Eric Orth5ccc3f02021-09-23 00:01:5737#include "net/base/proxy_string_util.h"
[email protected]ac790b42009-12-02 04:31:3138#include "net/base/request_priority.h"
Matt Menke4807a9a2020-11-21 00:14:4139#include "net/base/schemeful_site.h"
[email protected]f6d1d6eb2009-06-24 20:16:0940#include "net/base/test_completion_callback.h"
dalykedd30d982019-12-16 15:31:1041#include "net/dns/public/resolve_error_info.h"
Ben Schwartz3ff4dc1e62021-04-27 21:15:2342#include "net/dns/public/secure_dns_policy.h"
[email protected]277d5942010-08-11 21:02:3543#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5144#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0745#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0046#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1947#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0048#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5649#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4650#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0951#include "net/socket/client_socket_factory.h"
52#include "net/socket/client_socket_handle.h"
Eric Ortha9b8be02021-06-29 23:09:0853#include "net/socket/connect_job_factory.h"
tfarina5dd13c22016-11-16 12:08:2654#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2855#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5456#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1757#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4458#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1059#include "net/socket/stream_socket.h"
Daniel Cheng5feb16f2022-02-28 06:52:0760#include "net/socket/transport_client_socket_pool.h"
Matt Menke9fa17d52019-03-25 19:12:2661#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5162#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0163#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4064#include "net/test/test_with_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2865#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3866#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4867#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0968#include "testing/gtest/include/gtest/gtest.h"
Anton Bikineev068d2912021-05-15 20:43:5269#include "third_party/abseil-cpp/absl/types/optional.h"
Eric Ortha2e7773212021-06-22 21:49:5570#include "url/scheme_host_port.h"
71#include "url/url_constants.h"
[email protected]f6d1d6eb2009-06-24 20:16:0972
robpercival214763f2016-07-01 23:27:0173using net::test::IsError;
74using net::test::IsOk;
75
[email protected]51fdc7c2012-04-10 19:19:4876using ::testing::Invoke;
77using ::testing::Return;
78
[email protected]f6d1d6eb2009-06-24 20:16:0979namespace net {
80
81namespace {
82
[email protected]211d21722009-07-22 15:48:5383const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2084const int kDefaultMaxSocketsPerGroup = 2;
Peter Kastinge5a38ed2021-10-02 03:06:3585constexpr base::TimeDelta kUnusedIdleSocketTimeout = base::Seconds(10);
[email protected]0b7648c2009-07-06 20:14:0186
Matt Menkebdf777802019-04-22 19:38:5987ClientSocketPool::GroupId TestGroupId(
Eric Ortha2e7773212021-06-22 21:49:5588 base::StringPiece host,
Matt Menkebdf777802019-04-22 19:38:5989 int port = 80,
Eric Ortha2e7773212021-06-22 21:49:5590 base::StringPiece scheme = url::kHttpScheme,
Matt Menke166443c2019-05-24 18:45:5991 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
Brianna Goldsteina7593fca2022-09-28 02:59:3292 NetworkAnonymizationKey network_anonymization_key =
93 NetworkAnonymizationKey()) {
Eric Ortha2e7773212021-06-22 21:49:5594 return ClientSocketPool::GroupId(url::SchemeHostPort(scheme, host, port),
Brianna Goldsteina7593fca2022-09-28 02:59:3295 privacy_mode, network_anonymization_key,
Ben Schwartz3ff4dc1e62021-04-27 21:15:2396 SecureDnsPolicy::kAllow);
Matt Menkec6b3edf72019-03-19 17:00:3997}
98
[email protected]034df0f32013-01-07 23:17:4899// Make sure |handle| sets load times correctly when it has been assigned a
100// reused socket.
101void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
102 LoadTimingInfo load_timing_info;
103 // Only pass true in as |is_reused|, as in general, HttpStream types should
104 // have stricter concepts of reuse than socket pools.
105 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
106
107 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19108 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48109
[email protected]b258e0792013-01-12 07:11:59110 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
111 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48112}
113
114// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33115// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48116// of a connection where |is_reused| is false may consider the connection
117// reused.
118void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
119 EXPECT_FALSE(handle.is_reused());
120
121 LoadTimingInfo load_timing_info;
122 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
123
124 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19125 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48126
[email protected]b258e0792013-01-12 07:11:59127 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
128 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
129 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48130
131 TestLoadTimingInfoConnectedReused(handle);
132}
133
134// Make sure |handle| sets load times correctly, in the case that it does not
135// currently have a socket.
136void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
137 // Should only be set to true once a socket is assigned, if at all.
138 EXPECT_FALSE(handle.is_reused());
139
140 LoadTimingInfo load_timing_info;
141 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
142
143 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19144 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48145
[email protected]b258e0792013-01-12 07:11:59146 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
147 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48148}
149
[email protected]3268023f2011-05-05 00:08:10150class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09151 public:
[email protected]034df0f32013-01-07 23:17:48152 explicit MockClientSocket(net::NetLog* net_log)
Tsuyoshi Horo2ec06e002022-06-09 01:38:59153 : net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)) {}
[email protected]f6d1d6eb2009-06-24 20:16:09154
Peter Boström407869b2021-10-07 04:42:48155 MockClientSocket(const MockClientSocket&) = delete;
156 MockClientSocket& operator=(const MockClientSocket&) = delete;
157
[email protected]0dc88b32014-03-26 20:12:28158 // Sets whether the socket has unread data. If true, the next call to Read()
159 // will return 1 byte and IsConnectedAndIdle() will return false.
160 void set_has_unread_data(bool has_unread_data) {
161 has_unread_data_ = has_unread_data;
162 }
163
[email protected]3f55aa12011-12-07 02:03:33164 // Socket implementation.
dchengb03027d2014-10-21 12:00:20165 int Read(IOBuffer* /* buf */,
166 int len,
Brad Lassey3a814172018-04-26 03:30:21167 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28168 if (has_unread_data_ && len > 0) {
169 has_unread_data_ = false;
170 was_used_to_convey_data_ = true;
171 return 1;
172 }
[email protected]e86df8dc2013-03-30 13:18:28173 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33174 }
[email protected]ab838892009-06-30 18:49:05175
[email protected]a2b2cfc2017-12-06 09:06:08176 int Write(
177 IOBuffer* /* buf */,
178 int len,
Brad Lassey3a814172018-04-26 03:30:21179 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08180 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01181 was_used_to_convey_data_ = true;
182 return len;
[email protected]ab838892009-06-30 18:49:05183 }
Avi Drissman13fc8932015-12-20 04:40:46184 int SetReceiveBufferSize(int32_t size) override { return OK; }
185 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05186
[email protected]dbf036f2011-12-06 23:33:24187 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21188 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24189 connected_ = true;
190 return OK;
191 }
[email protected]f6d1d6eb2009-06-24 20:16:09192
dchengb03027d2014-10-21 12:00:20193 void Disconnect() override { connected_ = false; }
194 bool IsConnected() const override { return connected_; }
195 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28196 return connected_ && !has_unread_data_;
197 }
[email protected]0b7648c2009-07-06 20:14:01198
dchengb03027d2014-10-21 12:00:20199 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16200 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09201 }
[email protected]f6d1d6eb2009-06-24 20:16:09202
dchengb03027d2014-10-21 12:00:20203 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35204 return ERR_UNEXPECTED;
205 }
206
tfarina428341112016-09-22 13:38:20207 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02208
dchengb03027d2014-10-21 12:00:20209 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37210 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20211 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
212 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
tbansalf82cc8e2015-10-14 20:05:49213 int64_t GetTotalReceivedBytes() const override {
214 NOTIMPLEMENTED();
215 return 0;
216 }
Paul Jensen0f49dec2017-12-12 23:39:58217 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45218
[email protected]f6d1d6eb2009-06-24 20:16:09219 private:
Tsuyoshi Horo2ec06e002022-06-09 01:38:59220 bool connected_ = false;
221 bool has_unread_data_ = false;
tfarina428341112016-09-22 13:38:20222 NetLogWithSource net_log_;
Tsuyoshi Horo2ec06e002022-06-09 01:38:59223 bool was_used_to_convey_data_ = false;
[email protected]f6d1d6eb2009-06-24 20:16:09224};
225
[email protected]5fc08e32009-07-15 17:09:57226class TestConnectJob;
227
[email protected]f6d1d6eb2009-06-24 20:16:09228class MockClientSocketFactory : public ClientSocketFactory {
229 public:
Tsuyoshi Horo2ec06e002022-06-09 01:38:59230 MockClientSocketFactory() = default;
[email protected]f6d1d6eb2009-06-24 20:16:09231
danakj655b66c2016-04-16 00:51:38232 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04233 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41234 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19235 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41236 NOTREACHED();
David Benjamin24725be2019-07-24 20:57:18237 return nullptr;
[email protected]98b0e582011-06-22 14:31:41238 }
239
Helen Lid5bb9222018-04-12 15:33:09240 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07241 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38242 std::unique_ptr<
243 SocketPerformanceWatcher> /* socket_performance_watcher */,
Eric Roman2bc77162020-09-16 18:30:45244 NetworkQualityEstimator* /* network_quality_estimator */,
[email protected]0a0b7682010-08-25 17:08:07245 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19246 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09247 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09248 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09249 }
250
danakj655b66c2016-04-16 00:51:38251 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
David Benjamin24725be2019-07-24 20:57:18252 SSLClientContext* context,
Matt Menke841fc412019-03-05 23:20:12253 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27254 const HostPortPair& host_and_port,
David Benjamin24725be2019-07-24 20:57:18255 const SSLConfig& ssl_config) override {
[email protected]f6d1d6eb2009-06-24 20:16:09256 NOTIMPLEMENTED();
David Benjamin24725be2019-07-24 20:57:18257 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09258 }
Matt Menkefd956922019-02-04 23:44:03259
[email protected]5fc08e32009-07-15 17:09:57260 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55261
[email protected]5fc08e32009-07-15 17:09:57262 void SignalJobs();
263
[email protected]03b7c8c2013-07-20 04:38:55264 void SignalJob(size_t job);
265
266 void SetJobLoadState(size_t job, LoadState load_state);
267
Matt Menke141b87f22019-01-30 02:43:03268 // Sets the HasConnectionEstablished value of the specified job to true,
269 // without invoking the callback.
270 void SetJobHasEstablishedConnection(size_t job);
271
[email protected]f6d1d6eb2009-06-24 20:16:09272 int allocation_count() const { return allocation_count_; }
273
[email protected]f6d1d6eb2009-06-24 20:16:09274 private:
Tsuyoshi Horo2ec06e002022-06-09 01:38:59275 int allocation_count_ = 0;
[email protected]5fc08e32009-07-15 17:09:57276 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09277};
278
[email protected]ab838892009-06-30 18:49:05279class TestConnectJob : public ConnectJob {
280 public:
281 enum JobType {
282 kMockJob,
283 kMockFailingJob,
284 kMockPendingJob,
285 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57286 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10287
288 // Certificate errors return a socket in addition to an error code.
289 kMockCertErrorJob,
290 kMockPendingCertErrorJob,
291
[email protected]e60e47a2010-07-14 03:37:18292 kMockAdditionalErrorStateJob,
293 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28294 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10295
296 kMockAuthChallengeOnceJob,
297 kMockAuthChallengeTwiceJob,
298 kMockAuthChallengeOnceFailingJob,
299 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05300 };
301
[email protected]994d4932010-07-12 17:55:13302 // The kMockPendingJob uses a slight delay before allowing the connect
303 // to complete.
304 static const int kPendingConnectDelay = 2;
305
[email protected]ab838892009-06-30 18:49:05306 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40307 RequestPriority request_priority,
308 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34309 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43310 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05311 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43312 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40313 : ConnectJob(request_priority,
314 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38315 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43316 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38317 delegate,
318 nullptr /* net_log */,
319 NetLogSourceType::TRANSPORT_CONNECT_JOB,
320 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58321 job_type_(job_type),
Tsuyoshi Horo2ec06e002022-06-09 01:38:59322 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05323
Peter Boström407869b2021-10-07 04:42:48324 TestConnectJob(const TestConnectJob&) = delete;
325 TestConnectJob& operator=(const TestConnectJob&) = delete;
326
[email protected]974ebd62009-08-03 23:14:34327 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13328 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34329 }
330
[email protected]03b7c8c2013-07-20 04:38:55331 void set_load_state(LoadState load_state) { load_state_ = load_state; }
332
Matt Menke141b87f22019-01-30 02:43:03333 void set_has_established_connection() {
334 DCHECK(!has_established_connection_);
335 has_established_connection_ = true;
336 }
337
[email protected]03b7c8c2013-07-20 04:38:55338 // From ConnectJob:
339
dchengb03027d2014-10-21 12:00:20340 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21341
Matt Menke141b87f22019-01-30 02:43:03342 bool HasEstablishedConnection() const override {
343 return has_established_connection_;
344 }
345
dalykedd30d982019-12-16 15:31:10346 ResolveErrorInfo GetResolveErrorInfo() const override {
347 return ResolveErrorInfo(OK);
348 }
349
Matt Menke6f84d1f12019-04-11 19:26:47350 bool IsSSLError() const override { return store_additional_error_state_; }
351
352 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
353 if (store_additional_error_state_)
354 return base::MakeRefCounted<SSLCertRequestInfo>();
355 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18356 }
357
[email protected]974ebd62009-08-03 23:14:34358 private:
[email protected]03b7c8c2013-07-20 04:38:55359 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05360
dchengb03027d2014-10-21 12:00:20361 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05362 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35363 client_socket_factory_->CreateTransportClientSocket(
Eric Roman2bc77162020-09-16 18:30:45364 ignored, nullptr, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05365 switch (job_type_) {
366 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13367 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10368 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05369 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13370 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10371 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05372 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57373 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47374
375 // Depending on execution timings, posting a delayed task can result
376 // in the task getting executed the at the earliest possible
377 // opportunity or only after returning once from the message loop and
378 // then a second call into the message loop. In order to make behavior
379 // more deterministic, we change the default delay to 2ms. This should
380 // always require us to wait for the second call into the message loop.
381 //
382 // N.B. The correct fix for this and similar timing problems is to
383 // abstract time for the purpose of unittests. Unfortunately, we have
384 // a lot of third-party components that directly call the various
385 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45386 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05387 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49388 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
389 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10390 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35391 base::Milliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05392 return ERR_IO_PENDING;
393 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57394 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45395 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05396 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49397 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
398 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10399 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35400 base::Milliseconds(2));
[email protected]ab838892009-06-30 18:49:05401 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57402 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55403 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57404 client_socket_factory_->WaitForSignal(this);
405 waiting_success_ = true;
406 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10407 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13408 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10409 true /* cert_error */);
410 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13411 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45412 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13413 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49414 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
415 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10416 true /* async */, true /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35417 base::Milliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13418 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18419 case kMockAdditionalErrorStateJob:
420 store_additional_error_state_ = true;
421 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10422 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18423 case kMockPendingAdditionalErrorStateJob:
424 set_load_state(LOAD_STATE_CONNECTING);
425 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45426 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18427 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49428 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
429 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10430 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35431 base::Milliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18432 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28433 case kMockUnreadDataJob: {
434 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10435 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28436 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
437 return ret;
438 }
Matt Menkeb57663b32019-03-01 17:17:10439 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01440 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10441 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
442 return ERR_IO_PENDING;
443 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01444 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10445 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
446 return ERR_IO_PENDING;
447 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01448 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10449 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
450 return ERR_IO_PENDING;
451 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01452 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10453 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
454 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05455 default:
456 NOTREACHED();
Anton Bikineev068d2912021-05-15 20:43:52457 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05458 return ERR_FAILED;
459 }
460 }
461
Lily Chen02ef29a2018-11-30 16:31:43462 void ChangePriorityInternal(RequestPriority priority) override {}
463
Matt Menkeb57663b32019-03-01 17:17:10464 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13465 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03466 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05467 if (succeed) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19468 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52469 absl::nullopt);
Bence Békybdbb0e72018-08-07 21:42:59470 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10471 } else if (cert_error) {
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);
Matt Menkeb57663b32019-03-01 17:17:10474 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40475 } else {
[email protected]e772db3f2010-07-12 18:11:13476 result = ERR_CONNECTION_FAILED;
Anton Bikineev068d2912021-05-15 20:43:52477 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05478 }
[email protected]2ab05b52009-07-01 23:57:58479
480 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30481 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05482 return result;
483 }
484
Matt Menkeb57663b32019-03-01 17:17:10485 void DoAdvanceAuthChallenge(int remaining_challenges,
486 bool succeed_after_last_challenge) {
487 base::ThreadTaskRunnerHandle::Get()->PostTask(
488 FROM_HERE,
489 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
490 weak_factory_.GetWeakPtr(), remaining_challenges,
491 succeed_after_last_challenge));
492 }
493
494 void InvokeNextProxyAuthCallback(int remaining_challenges,
495 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01496 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10497 if (remaining_challenges == 0) {
498 DoConnect(succeed_after_last_challenge, true /* was_async */,
499 false /* cert_error */);
500 return;
501 }
502
503 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
504 // The auth tests here are just focused on ConnectJob bookkeeping.
505 HttpResponseInfo info;
506 NotifyDelegateOfProxyAuth(
507 info, nullptr /* http_auth_controller */,
508 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
509 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
510 succeed_after_last_challenge));
511 }
512
[email protected]5fc08e32009-07-15 17:09:57513 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05514 const JobType job_type_;
Keishi Hattori0e45c022021-11-27 09:25:52515 const raw_ptr<MockClientSocketFactory> client_socket_factory_;
Tsuyoshi Horo2ec06e002022-06-09 01:38:59516 LoadState load_state_ = LOAD_STATE_IDLE;
517 bool has_established_connection_ = false;
518 bool store_additional_error_state_ = false;
[email protected]ab838892009-06-30 18:49:05519
Jeremy Romand54000b22019-07-08 18:40:16520 base::WeakPtrFactory<TestConnectJob> weak_factory_{this};
[email protected]ab838892009-06-30 18:49:05521};
522
Eric Ortha9b8be02021-06-29 23:09:08523class TestConnectJobFactory : public ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05524 public:
Eric Ortha9b8be02021-06-29 23:09:08525 explicit TestConnectJobFactory(MockClientSocketFactory* client_socket_factory)
526 : client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05527
Peter Boström293b1342021-09-22 17:31:43528 TestConnectJobFactory(const TestConnectJobFactory&) = delete;
529 TestConnectJobFactory& operator=(const TestConnectJobFactory&) = delete;
530
Chris Watkins7a41d3552017-12-01 02:13:27531 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05532
533 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
534
[email protected]51fdc7c2012-04-10 19:19:48535 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
536 job_types_ = job_types;
537 CHECK(!job_types_->empty());
538 }
539
[email protected]974ebd62009-08-03 23:14:34540 void set_timeout_duration(base::TimeDelta timeout_duration) {
541 timeout_duration_ = timeout_duration;
542 }
543
[email protected]3f55aa12011-12-07 02:03:33544 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55545
Eric Ortha9b8be02021-06-29 23:09:08546 std::unique_ptr<ConnectJob> CreateConnectJob(
Eric Orthc98a3e62021-07-02 17:46:37547 Endpoint endpoint,
Eric Ortha9b8be02021-06-29 23:09:08548 const ProxyServer& proxy_server,
Anton Bikineev068d2912021-05-15 20:43:52549 const absl::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Eric Ortha9b8be02021-06-29 23:09:08550 const SSLConfig* ssl_config_for_origin,
551 const SSLConfig* ssl_config_for_proxy,
552 bool force_tunnel,
553 PrivacyMode privacy_mode,
554 const OnHostResolutionCallback& resolution_callback,
Matt Menke16f5c2e52019-03-25 21:50:40555 RequestPriority request_priority,
556 SocketTag socket_tag,
Eric Ortha9b8be02021-06-29 23:09:08557 const NetworkIsolationKey& network_isolation_key,
558 SecureDnsPolicy secure_dns_policy,
559 const CommonConnectJobParams* common_connect_job_params,
mostynbba063d6032014-10-09 11:01:13560 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48561 EXPECT_TRUE(!job_types_ || !job_types_->empty());
562 TestConnectJob::JobType job_type = job_type_;
563 if (job_types_ && !job_types_->empty()) {
564 job_type = job_types_->front();
565 job_types_->pop_front();
566 }
Matt Menkea6f99ad2019-03-08 02:26:43567 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40568 job_type, request_priority, socket_tag, timeout_duration_,
Eric Ortha9b8be02021-06-29 23:09:08569 common_connect_job_params, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05570 }
571
572 private:
Eric Ortha9b8be02021-06-29 23:09:08573 TestConnectJob::JobType job_type_ = TestConnectJob::kMockJob;
Keishi Hattori0e45c022021-11-27 09:25:52574 raw_ptr<std::list<TestConnectJob::JobType>> job_types_ = nullptr;
[email protected]974ebd62009-08-03 23:14:34575 base::TimeDelta timeout_duration_;
Keishi Hattori0e45c022021-11-27 09:25:52576 const raw_ptr<MockClientSocketFactory> client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05577};
578
[email protected]a937a06d2009-08-19 21:19:24579} // namespace
580
[email protected]a937a06d2009-08-19 21:19:24581namespace {
582
[email protected]5fc08e32009-07-15 17:09:57583void MockClientSocketFactory::SignalJobs() {
Tsuyoshi Horo17ef47d02022-06-30 10:58:27584 for (auto* waiting_job : waiting_jobs_) {
585 waiting_job->Signal();
[email protected]5fc08e32009-07-15 17:09:57586 }
587 waiting_jobs_.clear();
588}
589
[email protected]03b7c8c2013-07-20 04:38:55590void MockClientSocketFactory::SignalJob(size_t job) {
591 ASSERT_LT(job, waiting_jobs_.size());
592 waiting_jobs_[job]->Signal();
593 waiting_jobs_.erase(waiting_jobs_.begin() + job);
594}
595
596void MockClientSocketFactory::SetJobLoadState(size_t job,
597 LoadState load_state) {
598 ASSERT_LT(job, waiting_jobs_.size());
599 waiting_jobs_[job]->set_load_state(load_state);
600}
601
Matt Menke141b87f22019-01-30 02:43:03602void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
603 ASSERT_LT(job, waiting_jobs_.size());
604 waiting_jobs_[job]->set_has_established_connection();
605}
606
Gabriel Charette694c3c332019-08-19 14:53:05607class ClientSocketPoolBaseTest : public TestWithTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09608 protected:
Alex Clarke0def2092018-12-10 12:01:45609 ClientSocketPoolBaseTest()
Gabriel Charette694c3c332019-08-19 14:53:05610 : TestWithTaskEnvironment(
611 base::test::TaskEnvironment::TimeSource::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03612 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54613 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40614 TransportClientSocketPool::connect_backup_jobs_enabled();
615 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54616 }
[email protected]2431756e2010-09-29 20:26:13617
dcheng67be2b1f2014-10-27 21:47:29618 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40619 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54620 connect_backup_jobs_enabled_);
621 }
[email protected]c9d6a1d2009-07-14 16:15:20622
Matt Menke9fa17d52019-03-25 19:12:26623 void CreatePool(int max_sockets,
624 int max_sockets_per_group,
625 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59626 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
627 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26628 ClientSocketPool::used_idle_socket_timeout(),
629 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16630 }
631
David Benjaminbac8dff2019-08-07 01:30:41632 void CreatePoolWithIdleTimeouts(
633 int max_sockets,
634 int max_sockets_per_group,
635 base::TimeDelta unused_idle_socket_timeout,
636 base::TimeDelta used_idle_socket_timeout,
637 bool enable_backup_connect_jobs = false,
638 ProxyServer proxy_server = ProxyServer::Direct()) {
[email protected]c9d6a1d2009-07-14 16:15:20639 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26640 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
Eric Ortha9b8be02021-06-29 23:09:08641 std::make_unique<TestConnectJobFactory>(&client_socket_factory_);
Matt Menke9fa17d52019-03-25 19:12:26642 connect_job_factory_ = connect_job_factory.get();
643 pool_ = TransportClientSocketPool::CreateForTesting(
644 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
Eric Ortha9b8be02021-06-29 23:09:08645 used_idle_socket_timeout, proxy_server, /*is_for_websockets=*/false,
646 &common_connect_job_params_, std::move(connect_job_factory),
Matt Menke9fa17d52019-03-25 19:12:26647 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20648 }
[email protected]f6d1d6eb2009-06-24 20:16:09649
mmenked3641e12016-01-28 16:06:15650 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39651 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33652 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15653 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39654 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15655 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33656 }
657
Matt Menkec6b3edf72019-03-19 17:00:39658 int StartRequest(const ClientSocketPool::GroupId& group_id,
659 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15660 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39661 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09662 }
663
[email protected]2431756e2010-09-29 20:26:13664 int GetOrderOfRequest(size_t index) const {
665 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09666 }
667
[email protected]2431756e2010-09-29 20:26:13668 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
669 return test_base_.ReleaseOneConnection(keep_alive);
670 }
671
672 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
673 test_base_.ReleaseAllConnections(keep_alive);
674 }
675
Matt Menke433de6d2020-03-04 00:24:11676 // Expects a single NetLogEventType::SOCKET_POOL_CLOSING_SOCKET in |net_log_|.
677 // It should be logged for the provided source and have the indicated reason.
678 void ExpectSocketClosedWithReason(NetLogSource expected_source,
679 const char* expected_reason) {
Matt Reichhoff0049a0b72021-10-20 20:44:26680 auto entries = net_log_observer_.GetEntriesForSourceWithType(
Matt Menke433de6d2020-03-04 00:24:11681 expected_source, NetLogEventType::SOCKET_POOL_CLOSING_SOCKET,
682 NetLogEventPhase::NONE);
683 ASSERT_EQ(1u, entries.size());
684 ASSERT_TRUE(entries[0].HasParams());
685 ASSERT_TRUE(entries[0].params.is_dict());
Matt Menkeca721da2022-06-01 04:47:29686 const std::string* reason =
687 entries[0].params.GetDict().FindString("reason");
Matt Menke433de6d2020-03-04 00:24:11688 ASSERT_TRUE(reason);
689 EXPECT_EQ(expected_reason, *reason);
690 }
691
[email protected]2431756e2010-09-29 20:26:13692 TestSocketRequest* request(int i) { return test_base_.request(i); }
693 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38694 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42695 return test_base_.requests();
696 }
rdsmith29dbad12017-02-17 02:22:18697 // Only counts the requests that get sockets asynchronously;
698 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13699 size_t completion_count() const { return test_base_.completion_count(); }
700
Eric Ortha9b8be02021-06-29 23:09:08701 const CommonConnectJobParams common_connect_job_params_{
702 nullptr /* client_socket_factory */,
703 nullptr /* host_resolver */,
704 nullptr /* http_auth_cache */,
705 nullptr /* http_auth_handler_factory */,
706 nullptr /* spdy_session_pool */,
707 nullptr /* quic_supported_versions */,
708 nullptr /* quic_stream_factory */,
709 nullptr /* proxy_delegate */,
710 nullptr /* http_user_agent_settings */,
711 nullptr /* ssl_client_context */,
712 nullptr /* socket_performance_watcher_factory */,
713 nullptr /* network_quality_estimator */,
Matt Reichhoff36a1fd62021-10-12 22:52:20714 NetLog::Get(),
Eric Ortha9b8be02021-06-29 23:09:08715 nullptr /* websocket_endpoint_lock_manager */};
[email protected]636b8252011-04-08 19:56:54716 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09717 MockClientSocketFactory client_socket_factory_;
Keishi Hattori0e45c022021-11-27 09:25:52718 raw_ptr<TestConnectJobFactory> connect_job_factory_;
Matt Reichhoff0049a0b72021-10-20 20:44:26719 RecordingNetLogObserver net_log_observer_;
Matt Menke9fa17d52019-03-25 19:12:26720 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19721 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26722 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13723 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09724};
725
[email protected]5fc08e32009-07-15 17:09:57726TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53727 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20728
[email protected]6ecf2b92011-12-15 01:14:52729 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06730 ClientSocketHandle handle;
Matt Reichhoff0049a0b72021-10-20 20:44:26731 NetLogWithSource net_log_with_source =
732 NetLogWithSource::Make(NetLogSourceType::NONE);
733
[email protected]034df0f32013-01-07 23:17:48734 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53735
Matt Menkef09e64c2019-04-23 22:16:28736 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:52737 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28738 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
739 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:26740 pool_.get(), net_log_with_source));
[email protected]f6d1d6eb2009-06-24 20:16:09741 EXPECT_TRUE(handle.is_initialized());
742 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48743 TestLoadTimingInfoConnectedNotReused(handle);
744
[email protected]f6d1d6eb2009-06-24 20:16:09745 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48746 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30747
Matt Reichhoff0049a0b72021-10-20 20:44:26748 auto entries =
749 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:40750
Matt Menke9fa17d52019-03-25 19:12:26751 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53752 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26753 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00754 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26755 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
756 EXPECT_TRUE(LogContainsEvent(
757 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
758 NetLogEventPhase::NONE));
759 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00760 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
761 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26762 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09763}
764
[email protected]ab838892009-06-30 18:49:05765TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53766 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20767
[email protected]ab838892009-06-30 18:49:05768 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Reichhoff0049a0b72021-10-20 20:44:26769 NetLogWithSource net_log_with_source =
770 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]9e743cd2010-03-16 07:03:53771
[email protected]2431756e2010-09-29 20:26:13772 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52773 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18774 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13775 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51776 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50777 EXPECT_EQ(
778 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:52779 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28780 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
781 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:26782 pool_.get(), net_log_with_source));
[email protected]2431756e2010-09-29 20:26:13783 EXPECT_FALSE(handle.socket());
784 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51785 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48786 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30787
Matt Reichhoff0049a0b72021-10-20 20:44:26788 auto entries =
789 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:40790
Matt Menke9fa17d52019-03-25 19:12:26791 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17792 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26793 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00794 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26795 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
796 EXPECT_TRUE(LogContainsEvent(
797 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
798 NetLogEventPhase::NONE));
799 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09800}
801
Matt Menke433de6d2020-03-04 00:24:11802// Test releasing an open socket into the socket pool, telling the socket pool
803// to close the socket.
804TEST_F(ClientSocketPoolBaseTest, ReleaseAndCloseConnection) {
805 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
806
807 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
808 ASSERT_TRUE(request(0)->handle()->socket());
809 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
810 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
811
812 EXPECT_EQ(0, pool_->IdleSocketCount());
813 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
814
815 ExpectSocketClosedWithReason(
816 source, TransportClientSocketPool::kClosedConnectionReturnedToPool);
817}
818
819TEST_F(ClientSocketPoolBaseTest, SocketWithUnreadDataReturnedToPool) {
820 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
821 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
822
823 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
824 ASSERT_TRUE(request(0)->handle()->socket());
825 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
826 EXPECT_TRUE(request(0)->handle()->socket()->IsConnected());
827 EXPECT_FALSE(request(0)->handle()->socket()->IsConnectedAndIdle());
828 ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE);
829
830 EXPECT_EQ(0, pool_->IdleSocketCount());
831 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
832
833 ExpectSocketClosedWithReason(
834 source, TransportClientSocketPool::kDataReceivedUnexpectedly);
835}
836
Matt Menkef6edce752019-03-19 17:21:56837// Make sure different groups do not share sockets.
838TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59839 base::test::ScopedFeatureList feature_list;
840 feature_list.InitAndEnableFeature(
841 features::kPartitionConnectionsByNetworkIsolationKey);
842
Matt Menkef6edce752019-03-19 17:21:56843 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
844
845 const HostPortPair kHostPortPairs[] = {
846 {"a", 80},
847 {"a", 443},
848 {"b", 80},
849 };
850
Eric Ortha2e7773212021-06-22 21:49:55851 const char* const kSchemes[] = {
852 url::kHttpScheme,
853 url::kHttpsScheme,
Matt Menkef6edce752019-03-19 17:21:56854 };
855
Matt Menkebdf777802019-04-22 19:38:59856 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
857 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56858
Matt Menke4807a9a2020-11-21 00:14:41859 const SchemefulSite kSiteA(GURL("http://a.test/"));
860 const SchemefulSite kSiteB(GURL("http://b.test/"));
Brianna Goldsteina7593fca2022-09-28 02:59:32861 const NetworkAnonymizationKey kNetworkAnonymizationKeys[] = {
862 NetworkAnonymizationKey(kSiteA, kSiteA, /*is_cross_site=*/false),
863 NetworkAnonymizationKey(kSiteB, kSiteB, /*is_cross_site=*/false),
Matt Menke166443c2019-05-24 18:45:59864 };
865
Ben Schwartz3ff4dc1e62021-04-27 21:15:23866 const SecureDnsPolicy kSecureDnsPolicys[] = {SecureDnsPolicy::kAllow,
867 SecureDnsPolicy::kDisable};
dalyk5f48a132019-10-14 15:20:19868
Matt Menkef6edce752019-03-19 17:21:56869 int total_idle_sockets = 0;
870
871 // Walk through each GroupId, making sure that requesting a socket for one
872 // group does not return a previously connected socket for another group.
873 for (const auto& host_port_pair : kHostPortPairs) {
874 SCOPED_TRACE(host_port_pair.ToString());
Eric Ortha2e7773212021-06-22 21:49:55875 for (const char* scheme : kSchemes) {
876 SCOPED_TRACE(scheme);
Matt Menkef6edce752019-03-19 17:21:56877 for (const auto& privacy_mode : kPrivacyModes) {
878 SCOPED_TRACE(privacy_mode);
Brianna Goldsteina7593fca2022-09-28 02:59:32879 for (const auto& network_anonymization_key :
880 kNetworkAnonymizationKeys) {
881 SCOPED_TRACE(network_anonymization_key.ToDebugString());
Ben Schwartz3ff4dc1e62021-04-27 21:15:23882 for (const auto& secure_dns_policy : kSecureDnsPolicys) {
883 SCOPED_TRACE(static_cast<int>(secure_dns_policy));
Matt Menkef6edce752019-03-19 17:21:56884
dalyk5f48a132019-10-14 15:20:19885 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56886
dalyk5f48a132019-10-14 15:20:19887 ClientSocketPool::GroupId group_id(
Eric Ortha2e7773212021-06-22 21:49:55888 url::SchemeHostPort(scheme, host_port_pair.host(),
889 host_port_pair.port()),
Brianna Goldsteina7593fca2022-09-28 02:59:32890 privacy_mode, network_anonymization_key, secure_dns_policy);
Matt Menkef6edce752019-03-19 17:21:56891
dalyk5f48a132019-10-14 15:20:19892 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56893
dalyk5f48a132019-10-14 15:20:19894 TestCompletionCallback callback;
895 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56896
dalyk5f48a132019-10-14 15:20:19897 // Since the group is empty, requesting a socket should not complete
898 // synchronously.
Anton Bikineev068d2912021-05-15 20:43:52899 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19900 DEFAULT_PRIORITY, SocketTag(),
901 ClientSocketPool::RespectLimits::ENABLED,
902 callback.callback(),
903 ClientSocketPool::ProxyAuthCallback(),
904 pool_.get(), NetLogWithSource()),
905 IsError(ERR_IO_PENDING));
906 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
907 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56908
dalyk5f48a132019-10-14 15:20:19909 EXPECT_THAT(callback.WaitForResult(), IsOk());
910 EXPECT_TRUE(handle.socket());
911 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
912 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56913
dalyk5f48a132019-10-14 15:20:19914 // Return socket to pool.
915 handle.Reset();
916 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56917
dalyk5f48a132019-10-14 15:20:19918 // Requesting a socket again should return the same socket as
919 // before, so should complete synchronously.
Anton Bikineev068d2912021-05-15 20:43:52920 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19921 DEFAULT_PRIORITY, SocketTag(),
922 ClientSocketPool::RespectLimits::ENABLED,
923 callback.callback(),
924 ClientSocketPool::ProxyAuthCallback(),
925 pool_.get(), NetLogWithSource()),
926 IsOk());
927 EXPECT_TRUE(handle.socket());
928 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56929
dalyk5f48a132019-10-14 15:20:19930 // Return socket to pool again.
931 handle.Reset();
932 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56933
dalyk5f48a132019-10-14 15:20:19934 ++total_idle_sockets;
935 }
Matt Menke166443c2019-05-24 18:45:59936 }
Matt Menkef6edce752019-03-19 17:21:56937 }
938 }
939 }
940}
941
[email protected]211d21722009-07-22 15:48:53942TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
943 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
944
[email protected]9e743cd2010-03-16 07:03:53945 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30946
Matt Menkec6b3edf72019-03-19 17:00:39947 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
948 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
949 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
950 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53951
[email protected]2431756e2010-09-29 20:26:13952 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53953 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13954 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53955
Matt Menkec6b3edf72019-03-19 17:00:39956 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
957 IsError(ERR_IO_PENDING));
958 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
959 IsError(ERR_IO_PENDING));
960 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
961 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53962
[email protected]2431756e2010-09-29 20:26:13963 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53964
[email protected]2431756e2010-09-29 20:26:13965 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53966 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13967 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53968
969 EXPECT_EQ(1, GetOrderOfRequest(1));
970 EXPECT_EQ(2, GetOrderOfRequest(2));
971 EXPECT_EQ(3, GetOrderOfRequest(3));
972 EXPECT_EQ(4, GetOrderOfRequest(4));
973 EXPECT_EQ(5, GetOrderOfRequest(5));
974 EXPECT_EQ(6, GetOrderOfRequest(6));
975 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17976
977 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13978 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53979}
980
981TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
982 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
983
[email protected]9e743cd2010-03-16 07:03:53984 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30985
[email protected]211d21722009-07-22 15:48:53986 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39987 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
988 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
989 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
990 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53991
[email protected]2431756e2010-09-29 20:26:13992 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53993 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13994 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53995
996 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:39997 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
998 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53999
[email protected]2431756e2010-09-29 20:26:131000 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531001
[email protected]2431756e2010-09-29 20:26:131002 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531003 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131004 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531005
1006 EXPECT_EQ(1, GetOrderOfRequest(1));
1007 EXPECT_EQ(2, GetOrderOfRequest(2));
1008 EXPECT_EQ(3, GetOrderOfRequest(3));
1009 EXPECT_EQ(4, GetOrderOfRequest(4));
1010 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:171011
1012 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131013 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531014}
1015
1016TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
1017 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1018
Matt Menkec6b3edf72019-03-19 17:00:391019 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
1020 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
1021 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1022 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:531023
[email protected]2431756e2010-09-29 20:26:131024 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531025 client_socket_factory_.allocation_count());
1026
Matt Menkec6b3edf72019-03-19 17:00:391027 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
1028 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1029 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531030
[email protected]2431756e2010-09-29 20:26:131031 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531032
[email protected]2431756e2010-09-29 20:26:131033 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531034
1035 // First 4 requests don't have to wait, and finish in order.
1036 EXPECT_EQ(1, GetOrderOfRequest(1));
1037 EXPECT_EQ(2, GetOrderOfRequest(2));
1038 EXPECT_EQ(3, GetOrderOfRequest(3));
1039 EXPECT_EQ(4, GetOrderOfRequest(4));
1040
Matt Menkec6b3edf72019-03-19 17:00:391041 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1042 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531043 EXPECT_EQ(7, GetOrderOfRequest(5));
1044 EXPECT_EQ(6, GetOrderOfRequest(6));
1045 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171046
1047 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131048 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531049}
1050
rdsmith29dbad12017-02-17 02:22:181051// Test reprioritizing a request before completion doesn't interfere with
1052// its completion.
1053TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1054 CreatePool(kDefaultMaxSockets, 1);
1055
Matt Menkec6b3edf72019-03-19 17:00:391056 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1057 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181058 EXPECT_TRUE(request(0)->handle()->socket());
1059 EXPECT_FALSE(request(1)->handle()->socket());
1060
Lily Chenecebf932018-11-02 17:15:431061 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181062
1063 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1064
1065 EXPECT_TRUE(request(1)->handle()->socket());
1066}
1067
1068// Reprioritize a request up past another one and make sure that changes the
1069// completion order.
1070TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1071 CreatePool(kDefaultMaxSockets, 1);
1072
Matt Menkec6b3edf72019-03-19 17:00:391073 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1074 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1075 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181076 EXPECT_TRUE(request(0)->handle()->socket());
1077 EXPECT_FALSE(request(1)->handle()->socket());
1078 EXPECT_FALSE(request(2)->handle()->socket());
1079
1080 request(2)->handle()->SetPriority(HIGHEST);
1081
1082 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1083
1084 EXPECT_EQ(1, GetOrderOfRequest(1));
1085 EXPECT_EQ(3, GetOrderOfRequest(2));
1086 EXPECT_EQ(2, GetOrderOfRequest(3));
1087}
1088
1089// Reprioritize a request without changing relative priorities and check
1090// that the order doesn't change.
1091TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1092 CreatePool(kDefaultMaxSockets, 1);
1093
Matt Menkec6b3edf72019-03-19 17:00:391094 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1095 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1096 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181097 EXPECT_TRUE(request(0)->handle()->socket());
1098 EXPECT_FALSE(request(1)->handle()->socket());
1099 EXPECT_FALSE(request(2)->handle()->socket());
1100
1101 request(2)->handle()->SetPriority(MEDIUM);
1102
1103 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1104
1105 EXPECT_EQ(1, GetOrderOfRequest(1));
1106 EXPECT_EQ(2, GetOrderOfRequest(2));
1107 EXPECT_EQ(3, GetOrderOfRequest(3));
1108}
1109
1110// Reprioritize a request past down another one and make sure that changes the
1111// completion order.
1112TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1113 CreatePool(kDefaultMaxSockets, 1);
1114
Matt Menkec6b3edf72019-03-19 17:00:391115 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1116 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1117 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181118 EXPECT_TRUE(request(0)->handle()->socket());
1119 EXPECT_FALSE(request(1)->handle()->socket());
1120 EXPECT_FALSE(request(2)->handle()->socket());
1121
1122 request(1)->handle()->SetPriority(LOW);
1123
1124 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1125
1126 EXPECT_EQ(1, GetOrderOfRequest(1));
1127 EXPECT_EQ(3, GetOrderOfRequest(2));
1128 EXPECT_EQ(2, GetOrderOfRequest(3));
1129}
1130
1131// Reprioritize a request to the same level as another and confirm it is
1132// put after the old request.
1133TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1134 CreatePool(kDefaultMaxSockets, 1);
1135
Matt Menkec6b3edf72019-03-19 17:00:391136 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1137 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1138 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181139 EXPECT_TRUE(request(0)->handle()->socket());
1140 EXPECT_FALSE(request(1)->handle()->socket());
1141 EXPECT_FALSE(request(2)->handle()->socket());
1142
1143 request(1)->handle()->SetPriority(MEDIUM);
1144
1145 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1146
1147 EXPECT_EQ(1, GetOrderOfRequest(1));
1148 EXPECT_EQ(3, GetOrderOfRequest(2));
1149 EXPECT_EQ(2, GetOrderOfRequest(3));
1150}
1151
[email protected]211d21722009-07-22 15:48:531152TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1153 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1154
Matt Menkec6b3edf72019-03-19 17:00:391155 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1156 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1157 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1158 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531159
[email protected]2431756e2010-09-29 20:26:131160 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531161 client_socket_factory_.allocation_count());
1162
Matt Menkec6b3edf72019-03-19 17:00:391163 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1164 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1165 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531166
[email protected]2431756e2010-09-29 20:26:131167 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531168
[email protected]2431756e2010-09-29 20:26:131169 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531170 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131171 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531172
1173 // First 4 requests don't have to wait, and finish in order.
1174 EXPECT_EQ(1, GetOrderOfRequest(1));
1175 EXPECT_EQ(2, GetOrderOfRequest(2));
1176 EXPECT_EQ(3, GetOrderOfRequest(3));
1177 EXPECT_EQ(4, GetOrderOfRequest(4));
1178
1179 // Request ("b", 7) has the highest priority, but we can't make new socket for
1180 // group "b", because it has reached the per-group limit. Then we make
1181 // socket for ("c", 6), because it has higher priority than ("a", 4),
1182 // and we still can't make a socket for group "b".
1183 EXPECT_EQ(5, GetOrderOfRequest(5));
1184 EXPECT_EQ(6, GetOrderOfRequest(6));
1185 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171186
1187 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131188 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531189}
1190
1191// Make sure that we count connecting sockets against the total limit.
1192TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1193 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1194
Matt Menkec6b3edf72019-03-19 17:00:391195 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1196 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1197 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531198
1199 // Create one asynchronous request.
1200 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391201 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1202 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531203
[email protected]6b175382009-10-13 06:47:471204 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1205 // actually become pending until 2ms after they have been created. In order
1206 // to flush all tasks, we need to wait so that we know there are no
1207 // soon-to-be-pending tasks waiting.
Peter Kastinge5a38ed2021-10-02 03:06:351208 FastForwardBy(base::Milliseconds(10));
[email protected]6b175382009-10-13 06:47:471209
[email protected]211d21722009-07-22 15:48:531210 // The next synchronous request should wait for its turn.
1211 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391212 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1213 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531214
[email protected]2431756e2010-09-29 20:26:131215 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531216
[email protected]2431756e2010-09-29 20:26:131217 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531218 client_socket_factory_.allocation_count());
1219
1220 EXPECT_EQ(1, GetOrderOfRequest(1));
1221 EXPECT_EQ(2, GetOrderOfRequest(2));
1222 EXPECT_EQ(3, GetOrderOfRequest(3));
1223 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171224 EXPECT_EQ(5, GetOrderOfRequest(5));
1225
1226 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131227 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531228}
1229
[email protected]6427fe22010-04-16 22:27:411230TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1231 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1232 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1233
Matt Menkec6b3edf72019-03-19 17:00:391234 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1235 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1236 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1237 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411238
1239 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1240
1241 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1242
Matt Menkec6b3edf72019-03-19 17:00:391243 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1244 IsError(ERR_IO_PENDING));
1245 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1246 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411247
1248 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1249
[email protected]2431756e2010-09-29 20:26:131250 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411251 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131252 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411253 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131254 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1255 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411256 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1257}
1258
[email protected]d7027bb2010-05-10 18:58:541259TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1260 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1261 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1262
[email protected]6ecf2b92011-12-15 01:14:521263 TestCompletionCallback callback;
Peter Kastinge20797db2022-08-18 19:44:141264 ClientSocketHandle stalled_handle;
1265 EXPECT_EQ(ERR_IO_PENDING,
1266 stalled_handle.Init(
1267 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
1268 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1269 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1270 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541271
1272 ClientSocketHandle handles[4];
Tsuyoshi Horo17ef47d02022-06-30 10:58:271273 for (auto& handle : handles) {
1274 EXPECT_EQ(
1275 ERR_IO_PENDING,
1276 handle.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
1277 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1278 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1279 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541280 }
1281
1282 // One will be stalled, cancel all the handles now.
1283 // This should hit the OnAvailableSocketSlot() code where we previously had
1284 // stalled groups, but no longer have any.
Tsuyoshi Horo17ef47d02022-06-30 10:58:271285 for (auto& handle : handles)
1286 handle.Reset();
[email protected]d7027bb2010-05-10 18:58:541287}
1288
[email protected]eb5a99382010-07-11 03:18:261289TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541290 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1291 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1292
[email protected]eb5a99382010-07-11 03:18:261293 {
1294 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521295 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261296 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Eric Ortha2e7773212021-06-22 21:49:551297 EXPECT_EQ(OK, handles[i].Init(TestGroupId("a" + base::NumberToString(i)),
1298 params_, absl::nullopt, DEFAULT_PRIORITY,
1299 SocketTag(),
1300 ClientSocketPool::RespectLimits::ENABLED,
1301 callbacks[i].callback(),
1302 ClientSocketPool::ProxyAuthCallback(),
1303 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261304 }
1305
1306 // Force a stalled group.
1307 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521308 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201309 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391310 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521311 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281312 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1313 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1314 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261315
1316 // Cancel the stalled request.
1317 stalled_handle.Reset();
1318
1319 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1320 EXPECT_EQ(0, pool_->IdleSocketCount());
1321
1322 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541323 }
1324
[email protected]43a21b82010-06-10 21:30:541325 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1326 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261327}
[email protected]43a21b82010-06-10 21:30:541328
[email protected]eb5a99382010-07-11 03:18:261329TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1330 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1331 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1332
1333 {
1334 ClientSocketHandle handles[kDefaultMaxSockets];
1335 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521336 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201337 EXPECT_EQ(ERR_IO_PENDING,
Eric Ortha2e7773212021-06-22 21:49:551338 handles[i].Init(
1339 TestGroupId("a" + base::NumberToString(i)), params_,
1340 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1341 ClientSocketPool::RespectLimits::ENABLED,
1342 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1343 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261344 }
1345
1346 // Force a stalled group.
1347 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1348 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521349 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201350 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391351 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521352 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281353 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1354 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1355 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261356
1357 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261358 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1359 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1360 TestGroupId("foo")));
1361 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1362 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261363
1364 // Cancel the stalled request.
1365 handles[0].Reset();
1366
[email protected]eb5a99382010-07-11 03:18:261367 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261368 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1369 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1370 TestGroupId("foo")));
1371 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1372 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261373
1374 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011375 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261376
1377 EXPECT_EQ(kDefaultMaxSockets + 1,
1378 client_socket_factory_.allocation_count());
1379 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261380 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1381 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1382 TestGroupId("foo")));
1383 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1384 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261385
1386 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541387 }
1388
[email protected]eb5a99382010-07-11 03:18:261389 EXPECT_EQ(1, pool_->IdleSocketCount());
1390}
[email protected]43a21b82010-06-10 21:30:541391
[email protected]eb5a99382010-07-11 03:18:261392TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1393 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1394 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541395
[email protected]eb5a99382010-07-11 03:18:261396 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521397 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261398 {
[email protected]51fdc7c2012-04-10 19:19:481399 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261400 ClientSocketHandle handles[kDefaultMaxSockets];
1401 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:391402 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281403 OK, handles[i].Init(
Eric Ortha2e7773212021-06-22 21:49:551404 TestGroupId(base::StringPrintf("take-2-%d", i)), params_,
Anton Bikineev068d2912021-05-15 20:43:521405 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:281406 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1407 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1408 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261409 }
1410
1411 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1412 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481413 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261414
1415 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201416 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391417 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521418 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281419 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1420 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1421 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481422 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261423
1424 // Dropping out of scope will close all handles and return them to idle.
1425 }
[email protected]43a21b82010-06-10 21:30:541426
1427 // But if we wait for it, the released idle sockets will be closed in
1428 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011429 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261430
1431 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1432 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541433}
1434
1435// Regression test for http://crbug.com/40952.
1436TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261437 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1438 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541439 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1440
1441 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1442 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521443 TestCompletionCallback callback;
Eric Ortha2e7773212021-06-22 21:49:551444 EXPECT_EQ(
1445 OK,
1446 handle.Init(TestGroupId("a" + base::NumberToString(i)), params_,
1447 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1448 ClientSocketPool::RespectLimits::ENABLED,
1449 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1450 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541451 }
1452
1453 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281454 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541455
1456 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1457 // reuse a socket.
1458 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1459 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521460 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541461
Eric Ortha2e7773212021-06-22 21:49:551462 // "a0" is special here, since it should be the first entry in the sorted map,
[email protected]43a21b82010-06-10 21:30:541463 // which is the one which we would close an idle socket for. We shouldn't
1464 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391465 EXPECT_EQ(OK, handle.Init(
Eric Ortha2e7773212021-06-22 21:49:551466 TestGroupId("a0"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281467 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391468 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1469 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541470
1471 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1472 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1473}
1474
[email protected]ab838892009-06-30 18:49:051475TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531476 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091477
Matt Menkec6b3edf72019-03-19 17:00:391478 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1479 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1480 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1481 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1482 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1483 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1484 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1485 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091486
[email protected]2431756e2010-09-29 20:26:131487 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201488 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1489 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131490 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1491 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091492
[email protected]c9d6a1d2009-07-14 16:15:201493 EXPECT_EQ(1, GetOrderOfRequest(1));
1494 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031495 EXPECT_EQ(8, GetOrderOfRequest(3));
1496 EXPECT_EQ(6, GetOrderOfRequest(4));
1497 EXPECT_EQ(4, GetOrderOfRequest(5));
1498 EXPECT_EQ(3, GetOrderOfRequest(6));
1499 EXPECT_EQ(5, GetOrderOfRequest(7));
1500 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171501
1502 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131503 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091504}
1505
[email protected]ab838892009-06-30 18:49:051506TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531507 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091508
Matt Menkec6b3edf72019-03-19 17:00:391509 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1510 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1511 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1512 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1513 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1514 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1515 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091516
[email protected]2431756e2010-09-29 20:26:131517 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091518
[email protected]2431756e2010-09-29 20:26:131519 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011520 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201521
[email protected]2431756e2010-09-29 20:26:131522 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201523 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131524 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1525 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091526}
1527
Matt Menke7eb405e2019-04-25 20:48:211528TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1529 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1530
1531 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1532 ClientSocketHandle handle;
1533 TestCompletionCallback callback;
1534 EXPECT_EQ(
1535 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521536 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke7eb405e2019-04-25 20:48:211537 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1538 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1539 pool_.get(), NetLogWithSource()));
1540
1541 EXPECT_THAT(callback.WaitForResult(), IsOk());
1542 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1543 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1544 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1545 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1546
1547 handle.ResetAndCloseSocket();
1548 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1549}
1550
Matt Menke99251ea42019-04-25 22:59:021551// This test will start up a socket request and then call Reset() on the handle.
1552// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211553TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531554 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201555
[email protected]ab838892009-06-30 18:49:051556 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131557 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521558 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501559 EXPECT_EQ(
1560 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521561 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281562 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1563 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1564 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131565 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211566 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1567 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1568}
1569
Matt Menke99251ea42019-04-25 22:59:021570// This test will start up a socket request and then call ResetAndCloseSocket()
1571// on the handle. The pending ConnectJob or connected socket should be
1572// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211573TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1574 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1575
Matt Menke99251ea42019-04-25 22:59:021576 // When true, the socket connects before it's canceled.
1577 for (bool cancel_when_callback_pending : {false, true}) {
1578 if (cancel_when_callback_pending) {
1579 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1580 } else {
1581 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1582 }
1583 ClientSocketHandle handle;
1584 TestCompletionCallback callback;
1585 EXPECT_EQ(
1586 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521587 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021588 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1589 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1590 pool_.get(), NetLogWithSource()));
1591 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1592 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1593
1594 if (cancel_when_callback_pending) {
1595 client_socket_factory_.SignalJobs();
1596 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1597 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1598 }
1599
1600 handle.ResetAndCloseSocket();
1601 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1602 }
Matt Menke7eb405e2019-04-25 20:48:211603}
1604
1605TEST_F(ClientSocketPoolBaseTest,
1606 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1607 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1608
Matt Menke99251ea42019-04-25 22:59:021609 // When true, the sockets connect before they're canceled.
1610 for (bool cancel_when_callback_pending : {false, true}) {
1611 if (cancel_when_callback_pending) {
1612 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1613 } else {
1614 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1615 }
Matt Menke7eb405e2019-04-25 20:48:211616
Matt Menke99251ea42019-04-25 22:59:021617 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1618 TestCompletionCallback callback;
1619 // Make |kDefaultMaxSockets + 1| socket requests.
1620 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1621 std::unique_ptr<ClientSocketHandle> handle =
1622 std::make_unique<ClientSocketHandle>();
1623 EXPECT_EQ(ERR_IO_PENDING,
1624 handle->Init(
Anton Bikineev068d2912021-05-15 20:43:521625 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021626 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1627 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1628 pool_.get(), NetLogWithSource()));
1629 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211630 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021631 EXPECT_EQ(
1632 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1633 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1634 }
1635
1636 if (cancel_when_callback_pending) {
1637 client_socket_factory_.SignalJobs();
1638 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1639 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1640 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1641 }
1642
1643 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1644 // or close a socket, since there are more requests than ConnectJobs or
1645 // sockets.
1646 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1647 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1648 if (cancel_when_callback_pending) {
1649 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1650 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1651 } else {
1652 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211653 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1654 }
Matt Menke99251ea42019-04-25 22:59:021655
1656 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1657 // or close a socket.
1658 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1659 handles[i]->ResetAndCloseSocket();
1660 if (i > 0) {
1661 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1662 if (cancel_when_callback_pending) {
1663 EXPECT_EQ(i,
1664 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1665 } else {
1666 EXPECT_EQ(static_cast<size_t>(i),
1667 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1668 }
1669 } else {
1670 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1671 }
1672 }
Matt Menke7eb405e2019-04-25 20:48:211673 }
[email protected]f6d1d6eb2009-06-24 20:16:091674}
1675
[email protected]ab838892009-06-30 18:49:051676TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531677 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201678
[email protected]ab838892009-06-30 18:49:051679 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061680 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521681 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091682
Matt Menke28ac03e2019-02-25 22:25:501683 EXPECT_EQ(
1684 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521685 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281686 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1687 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1688 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091689
1690 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211691 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1692 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091693
Matt Menke7eb405e2019-04-25 20:48:211694 // This will create a second ConnectJob, since the other ConnectJob was
1695 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521696 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501697 EXPECT_EQ(
1698 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521699 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281700 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501701 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1702 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091703
Matt Menke7eb405e2019-04-25 20:48:211704 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1705 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1706
robpercival214763f2016-07-01 23:27:011707 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091708 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211709 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1710 // One ConnectJob completed, and its socket is now assigned to |handle|.
1711 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1712 // The other ConnectJob should have either completed, or still be connecting.
1713 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1714 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091715
1716 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211717 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1718 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1719 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1720 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091721}
1722
[email protected]ab838892009-06-30 18:49:051723TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531724 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091725
Matt Menkec6b3edf72019-03-19 17:00:391726 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1727 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1728 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1729 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1730 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1731 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1732 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091733
1734 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201735 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131736 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1737 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091738
[email protected]2431756e2010-09-29 20:26:131739 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091740
[email protected]c9d6a1d2009-07-14 16:15:201741 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1742 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131743 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1744 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091745
[email protected]c9d6a1d2009-07-14 16:15:201746 EXPECT_EQ(1, GetOrderOfRequest(1));
1747 EXPECT_EQ(2, GetOrderOfRequest(2));
1748 EXPECT_EQ(5, GetOrderOfRequest(3));
1749 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131750 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1751 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201752 EXPECT_EQ(4, GetOrderOfRequest(6));
1753 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171754
1755 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131756 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091757}
1758
mmenke33d24423d2015-05-19 19:41:091759// Function to be used as a callback on socket request completion. It first
1760// disconnects the successfully connected socket from the first request, and
1761// then reuses the ClientSocketHandle to request another socket.
1762//
1763// |nested_callback| is called with the result of the second socket request.
1764void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261765 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091766 TestConnectJobFactory* test_connect_job_factory,
1767 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411768 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091769 int first_request_result) {
robpercival214763f2016-07-01 23:27:011770 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091771
1772 test_connect_job_factory->set_job_type(next_job_type);
1773
1774 // Don't allow reuse of the socket. Disconnect it and then release it.
1775 if (handle->socket())
1776 handle->socket()->Disconnect();
1777 handle->Reset();
1778
mmenke33d24423d2015-05-19 19:41:091779 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501780 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031781 TestGroupId("a"),
Anton Bikineev068d2912021-05-15 20:43:521782 ClientSocketPool::SocketParams::CreateForHttpForTesting(), absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:281783 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031784 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1785 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091786 if (rv != ERR_IO_PENDING) {
1787 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411788 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091789 } else {
1790 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521791 }
mmenke33d24423d2015-05-19 19:41:091792}
[email protected]f6d1d6eb2009-06-24 20:16:091793
mmenke33d24423d2015-05-19 19:41:091794// Tests the case where a second socket is requested in a completion callback,
1795// and the second socket connects asynchronously. Reuses the same
1796// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581797TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531798 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201799
[email protected]0b7648c2009-07-06 20:14:011800 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061801 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091802 TestCompletionCallback second_result_callback;
1803 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521804 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541805 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501806 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1807 connect_job_factory_, TestConnectJob::kMockPendingJob,
1808 &second_result_callback),
1809 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011810 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091811
robpercival214763f2016-07-01 23:27:011812 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581813}
[email protected]f6d1d6eb2009-06-24 20:16:091814
mmenke33d24423d2015-05-19 19:41:091815// Tests the case where a second socket is requested in a completion callback,
1816// and the second socket connects synchronously. Reuses the same
1817// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581818TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531819 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201820
[email protected]0b7648c2009-07-06 20:14:011821 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061822 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091823 TestCompletionCallback second_result_callback;
1824 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521825 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541826 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501827 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1828 connect_job_factory_, TestConnectJob::kMockPendingJob,
1829 &second_result_callback),
1830 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011831 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581832
robpercival214763f2016-07-01 23:27:011833 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091834}
1835
1836// Make sure that pending requests get serviced after active requests get
1837// cancelled.
[email protected]ab838892009-06-30 18:49:051838TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531839 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201840
[email protected]0b7648c2009-07-06 20:14:011841 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091842
Matt Menkec6b3edf72019-03-19 17:00:391843 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1844 IsError(ERR_IO_PENDING));
1845 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1846 IsError(ERR_IO_PENDING));
1847 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1848 IsError(ERR_IO_PENDING));
1849 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1850 IsError(ERR_IO_PENDING));
1851 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1852 IsError(ERR_IO_PENDING));
1853 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1854 IsError(ERR_IO_PENDING));
1855 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1856 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091857
[email protected]c9d6a1d2009-07-14 16:15:201858 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1859 // Let's cancel them.
1860 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131861 ASSERT_FALSE(request(i)->handle()->is_initialized());
1862 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091863 }
1864
[email protected]f6d1d6eb2009-06-24 20:16:091865 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131866 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011867 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131868 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091869 }
1870
[email protected]2431756e2010-09-29 20:26:131871 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1872 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091873}
1874
1875// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051876TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531877 const size_t kMaxSockets = 5;
1878 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201879
[email protected]0b7648c2009-07-06 20:14:011880 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091881
[email protected]211d21722009-07-22 15:48:531882 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1883 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091884
1885 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531886 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391887 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1888 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091889
[email protected]211d21722009-07-22 15:48:531890 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011891 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091892}
1893
mmenke9d72fe42017-05-18 22:36:071894// Make sure that pending requests that complete synchronously get serviced
1895// after active requests fail. See https://crbug.com/723748
1896TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1897 const size_t kNumberOfRequests = 10;
1898 const size_t kMaxSockets = 1;
1899 CreatePool(kMaxSockets, kMaxSockets);
1900
1901 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1902
Matt Menkec6b3edf72019-03-19 17:00:391903 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1904 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071905
1906 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1907
1908 // Queue up all the other requests
1909 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391910 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1911 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071912
1913 // Make sure all requests fail, instead of hanging.
1914 for (size_t i = 0; i < kNumberOfRequests; ++i)
1915 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1916}
1917
[email protected]5fc08e32009-07-15 17:09:571918TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531919 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571920
1921 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1922
[email protected]2431756e2010-09-29 20:26:131923 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521924 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501925 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521926 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501927 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1928 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011929 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571930
1931 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131932 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571933
Anton Bikineev068d2912021-05-15 20:43:521934 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281935 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501936 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1937 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011938 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1939 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571940
[email protected]2431756e2010-09-29 20:26:131941 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481942 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571943 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1944}
1945
xunjieli26619e72016-11-23 19:39:551946TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
Matt Menke433de6d2020-03-04 00:24:111947 const char kReason[] = "Really nifty reason";
1948
xunjieli26619e72016-11-23 19:39:551949 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1950 ClientSocketHandle handle;
1951 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261952 int rv =
1953 handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
1954 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1955 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1956 NetLogWithSource::Make(NetLogSourceType::NONE));
xunjieli26619e72016-11-23 19:39:551957 EXPECT_THAT(rv, IsOk());
Matt Menke433de6d2020-03-04 00:24:111958 ASSERT_TRUE(handle.socket());
1959 NetLogSource source = handle.socket()->NetLog().source();
xunjieli26619e72016-11-23 19:39:551960 handle.Reset();
1961 EXPECT_EQ(1, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111962 pool_->CloseIdleSockets(kReason);
1963 ExpectSocketClosedWithReason(source, kReason);
xunjieli26619e72016-11-23 19:39:551964}
1965
xunjieli92feb332017-03-03 17:19:231966TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231967 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1968 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261969 NetLogWithSource net_log_with_source =
1970 NetLogWithSource::Make(NetLogSourceType::NONE);
xunjieli92feb332017-03-03 17:19:231971 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501972 int rv = handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:521973 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501974 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261975 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231976 EXPECT_THAT(rv, IsOk());
1977 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:521978 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281979 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501980 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261981 pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231982 ClientSocketHandle handle3;
Anton Bikineev068d2912021-05-15 20:43:521983 rv = handle3.Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281984 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501985 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261986 pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231987 EXPECT_THAT(rv, IsOk());
1988 handle1.Reset();
1989 handle2.Reset();
1990 handle3.Reset();
1991 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111992 pool_->CloseIdleSocketsInGroup(TestGroupId("a"), "Very good reason");
xunjieli92feb332017-03-03 17:19:231993 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231994}
1995
xunjieli26619e72016-11-23 19:39:551996TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551997 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1998 ClientSocketHandle handle;
1999 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262000 NetLogWithSource net_log_with_source =
2001 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502002 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522003 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502004 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262005 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
xunjieli26619e72016-11-23 19:39:552006 EXPECT_THAT(rv, IsOk());
2007 StreamSocket* socket = handle.socket();
Matt Menke433de6d2020-03-04 00:24:112008 ASSERT_TRUE(socket);
xunjieli26619e72016-11-23 19:39:552009 handle.Reset();
2010 EXPECT_EQ(1, pool_->IdleSocketCount());
2011
2012 // Disconnect socket now to make the socket unusable.
Matt Menke433de6d2020-03-04 00:24:112013 NetLogSource source = socket->NetLog().source();
xunjieli26619e72016-11-23 19:39:552014 socket->Disconnect();
2015 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:522016 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282017 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502018 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262019 pool_.get(), net_log_with_source);
xunjieli26619e72016-11-23 19:39:552020 EXPECT_THAT(rv, IsOk());
2021 EXPECT_FALSE(handle2.is_reused());
Matt Menke433de6d2020-03-04 00:24:112022
2023 // This is admittedly not an accurate error in this case, but normally code
2024 // doesn't secretly keep a raw pointers to sockets returned to the socket pool
2025 // and close them out of band, so discovering an idle socket was closed when
2026 // trying to reuse it normally means it was closed by the remote side.
2027 ExpectSocketClosedWithReason(
2028 source, TransportClientSocketPool::kRemoteSideClosedConnection);
xunjieli26619e72016-11-23 19:39:552029}
2030
[email protected]2b7523d2009-07-29 20:29:232031// Regression test for http://crbug.com/17985.
2032TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
2033 const int kMaxSockets = 3;
2034 const int kMaxSocketsPerGroup = 2;
2035 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
2036
[email protected]ac790b42009-12-02 04:31:312037 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:232038
Matt Menkec6b3edf72019-03-19 17:00:392039 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2040 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232041
2042 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:392043 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2044 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232045
2046 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:392047 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232048
2049 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:392050 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2051 IsError(ERR_IO_PENDING));
2052 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2053 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232054
Matt Menkec6b3edf72019-03-19 17:00:392055 // Release the first two sockets from TestGroupId("a"). Because this is a
2056 // keepalive, the first release will unblock the pending request for
2057 // TestGroupId("a"). The second release will unblock a request for "c",
2058 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:132059 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
2060 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:232061
2062 // Closing idle sockets should not get us into trouble, but in the bug
2063 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:392064 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke433de6d2020-03-04 00:24:112065 pool_->CloseIdleSockets("Very good reason");
[email protected]eb5a99382010-07-11 03:18:262066
[email protected]2da659e2013-05-23 20:51:342067 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282068 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232069}
2070
[email protected]4d3b05d2010-01-27 21:27:292071TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532072 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572073
2074 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132075 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522076 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262077 NetLogWithSource net_log_with_source =
2078 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502079 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522080 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502081 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262082 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012083 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392084 EXPECT_EQ(LOAD_STATE_CONNECTING,
2085 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482086 TestLoadTimingInfoNotConnected(handle);
2087
robpercival214763f2016-07-01 23:27:012088 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132089 EXPECT_TRUE(handle.is_initialized());
2090 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482091 TestLoadTimingInfoConnectedNotReused(handle);
2092
[email protected]2431756e2010-09-29 20:26:132093 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482094 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302095
Matt Reichhoff0049a0b72021-10-20 20:44:262096 auto entries =
2097 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:402098
Matt Menke9fa17d52019-03-25 19:12:262099 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172100 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262101 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002102 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262103 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2104 EXPECT_TRUE(LogContainsEvent(
2105 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2106 NetLogEventPhase::NONE));
2107 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002108 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2109 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262110 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572111}
2112
[email protected]4d3b05d2010-01-27 21:27:292113TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572114 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532115 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572116
2117 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132118 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522119 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262120 NetLogWithSource net_log_with_source =
2121 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]e60e47a2010-07-14 03:37:182122 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132123 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512124 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502125 EXPECT_EQ(
2126 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522127 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282128 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2129 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262130 pool_.get(), net_log_with_source));
Matt Menkec6b3edf72019-03-19 17:00:392131 EXPECT_EQ(LOAD_STATE_CONNECTING,
2132 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012133 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132134 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512135 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302136
Matt Reichhoff0049a0b72021-10-20 20:44:262137 auto entries =
2138 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:402139
Matt Menke9fa17d52019-03-25 19:12:262140 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172141 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262142 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002143 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262144 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2145 EXPECT_TRUE(LogContainsEvent(
2146 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2147 NetLogEventPhase::NONE));
2148 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572149}
2150
mmenke6be122f2015-03-09 22:22:472151// Check that an async ConnectJob failure does not result in creation of a new
2152// ConnectJob when there's another pending request also waiting on its own
2153// ConnectJob. See http://crbug.com/463960.
2154TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2155 CreatePool(2, 2);
2156 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2157
Matt Menkec6b3edf72019-03-19 17:00:392158 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2159 IsError(ERR_IO_PENDING));
2160 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2161 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472162
robpercival214763f2016-07-01 23:27:012163 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2164 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472165
2166 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2167}
2168
[email protected]4d3b05d2010-01-27 21:27:292169TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102170 // TODO(eroman): Add back the log expectations! Removed them because the
2171 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532172 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572173
2174 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132175 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522176 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132177 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522178 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572179
Matt Menke28ac03e2019-02-25 22:25:502180 EXPECT_EQ(
2181 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522182 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282183 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2184 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2185 pool_.get(), NetLogWithSource()));
Matt Reichhoff0049a0b72021-10-20 20:44:262186 RecordingNetLogObserver log2;
tfarina428341112016-09-22 13:38:202187 EXPECT_EQ(
2188 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522189 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282190 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502191 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2192 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572193
[email protected]2431756e2010-09-29 20:26:132194 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572195
[email protected]fd7b7c92009-08-20 19:38:302196
2197 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302198
robpercival214763f2016-07-01 23:27:012199 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132200 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302201
2202 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532203 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572204}
2205
[email protected]4d3b05d2010-01-27 21:27:292206TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342207 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2208
[email protected]17a0c6c2009-08-04 00:07:042209 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2210
Matt Menkec6b3edf72019-03-19 17:00:392211 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2212 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2213 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2214 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342215
Raul Tambre8335a6d2019-02-21 16:57:432216 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262217 static_cast<int>(
2218 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132219 (*requests())[2]->handle()->Reset();
2220 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432221 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262222 static_cast<int>(
2223 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342224
[email protected]2431756e2010-09-29 20:26:132225 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432226 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262227 static_cast<int>(
2228 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342229
[email protected]2431756e2010-09-29 20:26:132230 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432231 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262232 static_cast<int>(
2233 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342234}
2235
[email protected]5fc08e32009-07-15 17:09:572236// When requests and ConnectJobs are not coupled, the request will get serviced
2237// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292238TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532239 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572240
2241 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322242 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572243
[email protected]2431756e2010-09-29 20:26:132244 std::vector<TestSocketRequest*> request_order;
2245 size_t completion_count; // unused
2246 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502247 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522248 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502249 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2250 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012251 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2252 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572253
2254 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2255 // without a job.
2256 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2257
[email protected]2431756e2010-09-29 20:26:132258 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502259 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522260 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502261 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2262 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012263 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132264 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502265 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522266 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502267 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2268 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012269 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572270
2271 // Both Requests 2 and 3 are pending. We release socket 1 which should
2272 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332273 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342274 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282275 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332276 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012277 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332278 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572279
2280 // Signal job 2, which should service request 3.
2281
2282 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012283 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572284
Raul Tambre8335a6d2019-02-21 16:57:432285 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132286 EXPECT_EQ(&req1, request_order[0]);
2287 EXPECT_EQ(&req2, request_order[1]);
2288 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392289 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572290}
2291
2292// The requests are not coupled to the jobs. So, the requests should finish in
2293// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292294TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532295 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572296 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322297 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572298
[email protected]2431756e2010-09-29 20:26:132299 std::vector<TestSocketRequest*> request_order;
2300 size_t completion_count; // unused
2301 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502302 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522303 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502304 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2305 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012306 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572307
[email protected]2431756e2010-09-29 20:26:132308 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502309 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522310 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502311 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2312 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012313 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572314
2315 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322316 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572317
[email protected]2431756e2010-09-29 20:26:132318 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502319 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522320 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502321 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2322 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012323 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572324
robpercival214763f2016-07-01 23:27:012325 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2326 EXPECT_THAT(req2.WaitForResult(), IsOk());
2327 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572328
Raul Tambre8335a6d2019-02-21 16:57:432329 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132330 EXPECT_EQ(&req1, request_order[0]);
2331 EXPECT_EQ(&req2, request_order[1]);
2332 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572333}
2334
[email protected]03b7c8c2013-07-20 04:38:552335// Test GetLoadState in the case there's only one socket request.
2336TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532337 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552338 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572339
[email protected]2431756e2010-09-29 20:26:132340 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522341 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502342 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522343 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502344 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2345 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012346 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552347 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572348
[email protected]03b7c8c2013-07-20 04:38:552349 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2350 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2351
2352 // No point in completing the connection, since ClientSocketHandles only
2353 // expect the LoadState to be checked while connecting.
2354}
2355
2356// Test GetLoadState in the case there are two socket requests.
2357TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2358 CreatePool(2, 2);
2359 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2360
2361 ClientSocketHandle handle;
2362 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502363 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522364 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502365 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2366 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012367 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002368 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2369
2370 ClientSocketHandle handle2;
2371 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522372 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282373 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502374 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2375 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012376 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002377 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2378
Matt Menke4b69f932019-03-04 16:20:012379 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002380 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2381 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2382
Matt Menke4b69f932019-03-04 16:20:012383 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002384 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2385
Matt Menke4b69f932019-03-04 16:20:012386 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002387 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002388 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012389
2390 // Update the state of the second job.
2391 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2392
2393 // Only the state of the second request should have changed.
2394 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2395 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2396
2397 // Second job connects and the first request gets the socket. The
2398 // second handle switches to the state of the remaining ConnectJob.
2399 client_socket_factory_.SignalJob(1);
2400 EXPECT_THAT(callback.WaitForResult(), IsOk());
2401 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552402}
2403
2404// Test GetLoadState in the case the per-group limit is reached.
2405TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2406 CreatePool(2, 1);
2407 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2408
2409 ClientSocketHandle handle;
2410 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502411 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522412 TestGroupId("a"), params_, absl::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502413 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2414 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012415 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552416 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2417
2418 // Request another socket from the same pool, buth with a higher priority.
2419 // The first request should now be stalled at the socket group limit.
2420 ClientSocketHandle handle2;
2421 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522422 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:282423 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502424 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2425 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012426 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552427 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2428 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2429
2430 // The first handle should remain stalled as the other socket goes through
2431 // the connect process.
2432
2433 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2434 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2435 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2436
2437 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012438 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552439 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2440
2441 // Closing the second socket should cause the stalled handle to finally get a
2442 // ConnectJob.
2443 handle2.socket()->Disconnect();
2444 handle2.Reset();
2445 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2446}
2447
2448// Test GetLoadState in the case the per-pool limit is reached.
2449TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2450 CreatePool(2, 2);
2451 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2452
2453 ClientSocketHandle handle;
2454 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502455 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522456 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502457 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2458 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012459 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552460
2461 // Request for socket from another pool.
2462 ClientSocketHandle handle2;
2463 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522464 rv = handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282465 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502466 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2467 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012468 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552469
2470 // Request another socket from the first pool. Request should stall at the
2471 // socket pool limit.
2472 ClientSocketHandle handle3;
2473 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522474 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282475 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502476 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2477 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012478 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552479
2480 // The third handle should remain stalled as the other sockets in its group
2481 // goes through the connect process.
2482
2483 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2484 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2485
2486 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2487 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2488 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2489
2490 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012491 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552492 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2493
2494 // Closing a socket should allow the stalled handle to finally get a new
2495 // ConnectJob.
2496 handle.socket()->Disconnect();
2497 handle.Reset();
2498 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572499}
2500
Matt Menkeb57663b32019-03-01 17:17:102501TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132502 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102503 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132504
[email protected]2431756e2010-09-29 20:26:132505 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522506 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502507 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102508 ERR_CERT_COMMON_NAME_INVALID,
Anton Bikineev068d2912021-05-15 20:43:522509 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282510 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2511 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2512 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132513 EXPECT_TRUE(handle.is_initialized());
2514 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132515}
2516
Matt Menkeb57663b32019-03-01 17:17:102517TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132518 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2519
Matt Menkeb57663b32019-03-01 17:17:102520 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132521 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522522 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502523 EXPECT_EQ(
2524 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522525 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282526 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2527 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2528 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392529 EXPECT_EQ(LOAD_STATE_CONNECTING,
2530 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102531 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132532 EXPECT_TRUE(handle.is_initialized());
2533 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132534}
2535
[email protected]e60e47a2010-07-14 03:37:182536TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2537 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2538 connect_job_factory_->set_job_type(
2539 TestConnectJob::kMockAdditionalErrorStateJob);
2540
[email protected]2431756e2010-09-29 20:26:132541 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522542 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502543 EXPECT_EQ(
2544 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:522545 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282546 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2547 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2548 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132549 EXPECT_FALSE(handle.is_initialized());
2550 EXPECT_FALSE(handle.socket());
2551 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512552 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182553}
2554
2555TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2556 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2557
2558 connect_job_factory_->set_job_type(
2559 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132560 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522561 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502562 EXPECT_EQ(
2563 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522564 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282565 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2566 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2567 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392568 EXPECT_EQ(LOAD_STATE_CONNECTING,
2569 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012570 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132571 EXPECT_FALSE(handle.is_initialized());
2572 EXPECT_FALSE(handle.socket());
2573 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512574 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182575}
2576
martijn003cd612016-05-19 22:24:382577// Make sure we can reuse sockets.
2578TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412579 CreatePoolWithIdleTimeouts(
2580 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032581 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352582 base::Days(1)); // Don't time out used sockets.
[email protected]e7b1c6d2c2012-05-05 00:54:032583
2584 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2585
2586 ClientSocketHandle handle;
2587 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502588 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522589 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502590 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2591 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012592 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392593 EXPECT_EQ(LOAD_STATE_CONNECTING,
2594 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012595 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032596
2597 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352598 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382599 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482600 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032601 handle.Reset();
2602
2603 // Should now have one idle socket.
2604 ASSERT_EQ(1, pool_->IdleSocketCount());
2605
2606 // Request a new socket. This should reuse the old socket and complete
2607 // synchronously.
Matt Reichhoff0049a0b72021-10-20 20:44:262608 NetLogWithSource net_log_with_source =
2609 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502610 rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522611 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502612 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262613 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012614 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032615 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482616 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032617
Matt Menke9fa17d52019-03-25 19:12:262618 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392619 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262620 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032621
Matt Reichhoff0049a0b72021-10-20 20:44:262622 auto entries =
2623 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
Matt Menke9fa17d52019-03-25 19:12:262624 EXPECT_TRUE(LogContainsEvent(
2625 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2626 NetLogEventPhase::NONE));
2627 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032628 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262629 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032630}
2631
martijn003cd612016-05-19 22:24:382632// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172633TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032634 CreatePoolWithIdleTimeouts(
2635 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2636 base::TimeDelta(), // Time out unused sockets immediately
2637 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412638
2639 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2640
2641 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2642
2643 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522644 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502645 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522646 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502647 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2648 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012649 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392650 EXPECT_EQ(LOAD_STATE_CONNECTING,
2651 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412652
2653 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522654 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522655 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282656 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502657 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2658 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012659 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392660 EXPECT_EQ(LOAD_STATE_CONNECTING,
2661 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412662
2663 // Cancel one of the requests. Wait for the other, which will get the first
2664 // job. Release the socket. Run the loop again to make sure the second
2665 // socket is sitting idle and the first one is released (since ReleaseSocket()
2666 // just posts a DoReleaseSocket() task).
2667
2668 handle.Reset();
robpercival214763f2016-07-01 23:27:012669 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menke433de6d2020-03-04 00:24:112670 // Get the NetLogSource for the socket, so the time out reason can be checked
2671 // at the end of the test.
2672 NetLogSource net_log_source2 = handle2.socket()->NetLog().source();
[email protected]64770b7d2011-11-16 04:30:412673 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352674 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382675 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412676 handle2.Reset();
2677
[email protected]e7b1c6d2c2012-05-05 00:54:032678 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2679 // actually become pending until 2ms after they have been created. In order
2680 // to flush all tasks, we need to wait so that we know there are no
2681 // soon-to-be-pending tasks waiting.
Peter Kastinge5a38ed2021-10-02 03:06:352682 FastForwardBy(base::Milliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412683
[email protected]e7b1c6d2c2012-05-05 00:54:032684 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412685 ASSERT_EQ(2, pool_->IdleSocketCount());
2686
2687 // Request a new socket. This should cleanup the unused and timed out ones.
2688 // A new socket will be created rather than reusing the idle one.
Matt Reichhoff0049a0b72021-10-20 20:44:262689 NetLogWithSource net_log_with_source =
2690 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]6ecf2b92011-12-15 01:14:522691 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522692 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282693 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502694 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262695 pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012696 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2697 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412698 EXPECT_FALSE(handle.is_reused());
2699
[email protected]e7b1c6d2c2012-05-05 00:54:032700 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262701 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392702 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262703 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412704
Matt Reichhoff0049a0b72021-10-20 20:44:262705 auto entries =
2706 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]64770b7d2011-11-16 04:30:412707 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002708 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
Matt Menke433de6d2020-03-04 00:24:112709 ExpectSocketClosedWithReason(
2710 net_log_source2, TransportClientSocketPool::kIdleTimeLimitExpired);
[email protected]64770b7d2011-11-16 04:30:412711}
2712
[email protected]2041cf342010-02-19 03:15:592713// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162714// because of multiple releasing disconnected sockets.
2715TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2716 CreatePoolWithIdleTimeouts(
2717 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2718 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352719 base::Days(1)); // Don't time out used sockets.
[email protected]4f2abec2010-02-03 18:10:162720
2721 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2722
2723 // Startup 4 connect jobs. Two of them will be pending.
2724
[email protected]2431756e2010-09-29 20:26:132725 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522726 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502727 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522728 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502729 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2730 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012731 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162732
[email protected]2431756e2010-09-29 20:26:132733 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522734 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522735 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282736 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502737 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2738 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012739 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162740
[email protected]2431756e2010-09-29 20:26:132741 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522742 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522743 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282744 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502745 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2746 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012747 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162748
[email protected]2431756e2010-09-29 20:26:132749 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522750 TestCompletionCallback callback4;
Anton Bikineev068d2912021-05-15 20:43:522751 rv = handle4.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282752 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502753 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2754 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012755 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162756
2757 // Release two disconnected sockets.
2758
[email protected]2431756e2010-09-29 20:26:132759 handle.socket()->Disconnect();
2760 handle.Reset();
2761 handle2.socket()->Disconnect();
2762 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162763
robpercival214763f2016-07-01 23:27:012764 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132765 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012766 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132767 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162768}
2769
[email protected]d7027bb2010-05-10 18:58:542770// Regression test for http://crbug.com/42267.
2771// When DoReleaseSocket() is processed for one socket, it is blocked because the
2772// other stalled groups all have releasing sockets, so no progress can be made.
2773TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2774 CreatePoolWithIdleTimeouts(
2775 4 /* socket limit */, 4 /* socket limit per group */,
2776 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352777 base::Days(1)); // Don't time out used sockets.
[email protected]d7027bb2010-05-10 18:58:542778
2779 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2780
2781 // Max out the socket limit with 2 per group.
2782
[email protected]2431756e2010-09-29 20:26:132783 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522784 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132785 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522786 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542787
2788 for (int i = 0; i < 2; ++i) {
Anton Bikineev068d2912021-05-15 20:43:522789 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282790 LOWEST, SocketTag(),
2791 ClientSocketPool::RespectLimits::ENABLED,
2792 callback_a[i].callback(),
2793 ClientSocketPool::ProxyAuthCallback(),
2794 pool_.get(), NetLogWithSource()));
Anton Bikineev068d2912021-05-15 20:43:522795 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282796 LOWEST, SocketTag(),
2797 ClientSocketPool::RespectLimits::ENABLED,
2798 callback_b[i].callback(),
2799 ClientSocketPool::ProxyAuthCallback(),
2800 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542801 }
[email protected]b89f7e42010-05-20 20:37:002802
[email protected]d7027bb2010-05-10 18:58:542803 // Make 4 pending requests, 2 per group.
2804
2805 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282806 EXPECT_EQ(
2807 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522808 handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282809 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2810 callback_a[i].callback(),
2811 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2812 NetLogWithSource()));
2813 EXPECT_EQ(
2814 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522815 handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282816 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2817 callback_b[i].callback(),
2818 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2819 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542820 }
2821
2822 // Release b's socket first. The order is important, because in
2823 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2824 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2825 // first, which has a releasing socket, so it refuses to start up another
2826 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132827 handle_b[0].socket()->Disconnect();
2828 handle_b[0].Reset();
2829 handle_a[0].socket()->Disconnect();
2830 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542831
2832 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282833 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542834
[email protected]2431756e2010-09-29 20:26:132835 handle_b[1].socket()->Disconnect();
2836 handle_b[1].Reset();
2837 handle_a[1].socket()->Disconnect();
2838 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542839
2840 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012841 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2842 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542843 }
2844}
2845
[email protected]fd4fe0b2010-02-08 23:02:152846TEST_F(ClientSocketPoolBaseTest,
2847 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2848 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2849
2850 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2851
Matt Menkec6b3edf72019-03-19 17:00:392852 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2853 IsError(ERR_IO_PENDING));
2854 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2855 IsError(ERR_IO_PENDING));
2856 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2857 IsError(ERR_IO_PENDING));
2858 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2859 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152860
robpercival214763f2016-07-01 23:27:012861 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2862 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132863 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152864
2865 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132866 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012867 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152868
[email protected]2431756e2010-09-29 20:26:132869 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012870 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132871 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152872
2873 EXPECT_EQ(1, GetOrderOfRequest(1));
2874 EXPECT_EQ(2, GetOrderOfRequest(2));
2875 EXPECT_EQ(3, GetOrderOfRequest(3));
2876 EXPECT_EQ(4, GetOrderOfRequest(4));
2877
2878 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132879 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152880}
2881
[email protected]6ecf2b92011-12-15 01:14:522882class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042883 public:
Matt Menke9fa17d52019-03-25 19:12:262884 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132885 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182886 bool reset_releasing_handle)
2887 : pool_(pool),
2888 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042889 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522890
Chris Watkins7a41d3552017-12-01 02:13:272891 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042892
2893 ClientSocketHandle* handle() { return &handle_; }
2894
Bence Béky8ddc2492018-06-13 01:02:042895 CompletionOnceCallback callback() {
2896 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2897 base::Unretained(this));
2898 }
[email protected]4f1e4982010-03-02 18:31:042899
2900 private:
[email protected]6ecf2b92011-12-15 01:14:522901 void OnComplete(int result) {
2902 SetResult(result);
2903 if (reset_releasing_handle_)
2904 handle_.Reset();
2905
Matt Menkec6b3edf72019-03-19 17:00:392906 EXPECT_EQ(
2907 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032908 handle2_.Init(
2909 TestGroupId("a"),
2910 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:522911 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032912 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2913 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522914 }
2915
Keishi Hattori0e45c022021-11-27 09:25:522916 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]e60e47a2010-07-14 03:37:182917 int expected_result_;
2918 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042919 ClientSocketHandle handle_;
2920 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042921};
2922
[email protected]e60e47a2010-07-14 03:37:182923
2924TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2925 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2926
Matt Menkec6b3edf72019-03-19 17:00:392927 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2928 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2929 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182930
[email protected]2431756e2010-09-29 20:26:132931 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182932 client_socket_factory_.allocation_count());
2933
2934 connect_job_factory_->set_job_type(
2935 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2936 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282937 EXPECT_EQ(ERR_IO_PENDING,
2938 req.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522939 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282940 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2941 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2942 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182943 // The next job should complete synchronously
2944 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2945
robpercival214763f2016-07-01 23:27:012946 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182947 EXPECT_FALSE(req.handle()->is_initialized());
2948 EXPECT_FALSE(req.handle()->socket());
2949 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512950 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182951}
2952
[email protected]b6501d3d2010-06-03 23:53:342953// http://crbug.com/44724 regression test.
2954// We start releasing the pool when we flush on network change. When that
2955// happens, the only active references are in the ClientSocketHandles. When a
2956// ConnectJob completes and calls back into the last ClientSocketHandle, that
2957// callback can release the last reference and delete the pool. After the
2958// callback finishes, we go back to the stack frame within the now-deleted pool.
2959// Executing any code that refers to members of the now-deleted pool can cause
2960// crashes.
2961TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2962 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2963 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2964
2965 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522966 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502967 EXPECT_EQ(
2968 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522969 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282970 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2971 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2972 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342973
Matt Menke433de6d2020-03-04 00:24:112974 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]b6501d3d2010-06-03 23:53:342975
2976 // We'll call back into this now.
2977 callback.WaitForResult();
2978}
2979
[email protected]a7e38572010-06-07 18:22:242980TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2981 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2982 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2983
2984 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522985 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502986 EXPECT_EQ(
2987 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522988 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282989 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2990 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2991 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012992 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242993 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:112994 NetLogSource source = handle.socket()->NetLog().source();
[email protected]a7e38572010-06-07 18:22:242995
Matt Menke433de6d2020-03-04 00:24:112996 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]a7e38572010-06-07 18:22:242997
2998 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282999 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:243000
Matt Menke28ac03e2019-02-25 22:25:503001 EXPECT_EQ(
3002 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523003 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283004 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3005 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3006 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013007 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243008 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113009
3010 ExpectSocketClosedWithReason(
3011 source, TransportClientSocketPool::kSocketGenerationOutOfDate);
[email protected]a7e38572010-06-07 18:22:243012}
3013
[email protected]6ecf2b92011-12-15 01:14:523014class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:143015 public:
Matt Menke9fa17d52019-03-25 19:12:263016 ConnectWithinCallback(
3017 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:193018 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:263019 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:393020 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:143021
Peter Boström293b1342021-09-22 17:31:433022 ConnectWithinCallback(const ConnectWithinCallback&) = delete;
3023 ConnectWithinCallback& operator=(const ConnectWithinCallback&) = delete;
3024
Chris Watkins7a41d3552017-12-01 02:13:273025 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:143026
3027 int WaitForNestedResult() {
3028 return nested_callback_.WaitForResult();
3029 }
3030
Bence Béky8ddc2492018-06-13 01:02:043031 CompletionOnceCallback callback() {
3032 return base::BindOnce(&ConnectWithinCallback::OnComplete,
3033 base::Unretained(this));
3034 }
[email protected]6ecf2b92011-12-15 01:14:523035
[email protected]06f92462010-08-31 19:24:143036 private:
[email protected]6ecf2b92011-12-15 01:14:523037 void OnComplete(int result) {
3038 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:283039 EXPECT_EQ(
3040 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523041 handle_.Init(group_id_, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283042 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3043 nested_callback_.callback(),
3044 ClientSocketPool::ProxyAuthCallback(), pool_,
3045 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:523046 }
3047
Matt Menkec6b3edf72019-03-19 17:00:393048 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:193049 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Keishi Hattori0e45c022021-11-27 09:25:523050 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]06f92462010-08-31 19:24:143051 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:523052 TestCompletionCallback nested_callback_;
[email protected]06f92462010-08-31 19:24:143053};
3054
3055TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
3056 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3057
3058 // First job will be waiting until it gets aborted.
3059 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3060
3061 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:393062 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:503063 EXPECT_EQ(
3064 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523065 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283066 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3067 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3068 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:143069
3070 // Second job will be started during the first callback, and will
3071 // asynchronously complete with OK.
3072 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menke433de6d2020-03-04 00:24:113073 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
robpercival214763f2016-07-01 23:27:013074 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
3075 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:143076}
3077
Matt Menke141b87f22019-01-30 02:43:033078TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:263079 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3080 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033081
3082 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3083 ClientSocketHandle handle;
3084 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503085 EXPECT_EQ(
3086 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523087 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283088 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3089 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3090 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033091 // The backup timer fires but doesn't start a new ConnectJob while resolving
3092 // the hostname.
3093 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
Peter Kastinge5a38ed2021-10-02 03:06:353094 FastForwardBy(
3095 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033096 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3097
3098 // Once the ConnectJob has finished resolving the hostname, the backup timer
3099 // will create a ConnectJob when it fires.
3100 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
Peter Kastinge5a38ed2021-10-02 03:06:353101 FastForwardBy(
3102 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs));
Matt Menke141b87f22019-01-30 02:43:033103 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3104}
3105
3106// Test that no backup socket is created when a ConnectJob connects before it
3107// completes.
3108TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263109 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3110 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033111
3112 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3113 ClientSocketHandle handle;
3114 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503115 EXPECT_EQ(
3116 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523117 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283118 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3119 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3120 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033121 // The backup timer fires but doesn't start a new ConnectJob while resolving
3122 // the hostname.
3123 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
Peter Kastinge5a38ed2021-10-02 03:06:353124 FastForwardBy(
3125 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033126 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3127
3128 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3129 client_socket_factory_.SetJobHasEstablishedConnection(0);
Peter Kastinge5a38ed2021-10-02 03:06:353130 FastForwardBy(
3131 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033132 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3133}
3134
[email protected]25eea382010-07-10 23:55:263135// Cancel a pending socket request while we're at max sockets,
3136// and verify that the backup socket firing doesn't cause a crash.
3137TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3138 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263139 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3140 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263141
[email protected]4baaf9d2010-08-31 15:15:443142 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3143 // timer.
[email protected]25eea382010-07-10 23:55:263144 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3145 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523146 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503147 EXPECT_EQ(
3148 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523149 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283150 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3151 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3152 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263153
3154 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3155 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3156 ClientSocketHandle handles[kDefaultMaxSockets];
3157 for (int i = 1; i < kDefaultMaxSockets; ++i) {
Anton Bikineev068d2912021-05-15 20:43:523158 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283159 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203160 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503161 callback.callback(),
3162 ClientSocketPool::ProxyAuthCallback(),
3163 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263164 }
3165
fdoray5eeb7642016-06-22 16:11:283166 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263167
3168 // Cancel the pending request.
3169 handle.Reset();
3170
3171 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353172 FastForwardBy(
3173 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263174
[email protected]25eea382010-07-10 23:55:263175 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3176}
3177
[email protected]3f00be82010-09-27 19:50:023178TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263179 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3180 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443181
3182 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3183 // timer.
3184 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3185 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523186 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503187 EXPECT_EQ(
3188 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523189 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283190 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3191 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3192 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263193 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3194 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3195 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3196 TestGroupId("bar")));
3197 EXPECT_EQ(
3198 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443199
3200 // Cancel the socket request. This should cancel the backup timer. Wait for
3201 // the backup time to see if it indeed got canceled.
3202 handle.Reset();
3203 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353204 FastForwardBy(
3205 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263206 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3207 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443208}
3209
[email protected]3f00be82010-09-27 19:50:023210TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263211 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3212 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023213
3214 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3215 // timer.
3216 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3217 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523218 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503219 EXPECT_EQ(
3220 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523221 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283222 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3223 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3224 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023225 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3226 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523227 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203228 EXPECT_EQ(
3229 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523230 handle2.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283231 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503232 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3233 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263234 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3235 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023236
3237 // Cancel request 1 and then complete request 2. With the requests finished,
3238 // the backup timer should be cancelled.
3239 handle.Reset();
robpercival214763f2016-07-01 23:27:013240 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023241 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353242 FastForwardBy(
3243 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023244}
3245
[email protected]eb5a99382010-07-11 03:18:263246// Test delayed socket binding for the case where we have two connects,
3247// and while one is waiting on a connect, the other frees up.
3248// The socket waiting on a connect should switch immediately to the freed
3249// up socket.
3250TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3251 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3252 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3253
3254 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523255 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503256 EXPECT_EQ(
3257 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523258 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283259 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503260 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3261 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013262 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263263
3264 // No idle sockets, no pending jobs.
3265 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263266 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263267
3268 // Create a second socket to the same host, but this one will wait.
3269 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3270 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503271 EXPECT_EQ(
3272 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523273 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283274 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503275 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3276 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263277 // No idle sockets, and one connecting job.
3278 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263279 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263280
3281 // Return the first handle to the pool. This will initiate the delayed
3282 // binding.
3283 handle1.Reset();
3284
fdoray5eeb7642016-06-22 16:11:283285 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263286
3287 // Still no idle sockets, still one pending connect job.
3288 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263289 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263290
3291 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013292 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263293
3294 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263295 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263296
3297 // Finally, signal the waiting Connect.
3298 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263299 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263300
fdoray5eeb7642016-06-22 16:11:283301 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263302}
3303
3304// Test delayed socket binding when a group is at capacity and one
3305// of the group's sockets frees up.
3306TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3307 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3308 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3309
3310 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523311 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503312 EXPECT_EQ(
3313 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523314 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283315 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503316 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3317 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013318 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263319
3320 // No idle sockets, no pending jobs.
3321 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263322 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263323
3324 // Create a second socket to the same host, but this one will wait.
3325 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3326 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503327 EXPECT_EQ(
3328 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523329 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283330 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503331 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3332 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263333 // No idle sockets, and one connecting job.
3334 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263335 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263336
3337 // Return the first handle to the pool. This will initiate the delayed
3338 // binding.
3339 handle1.Reset();
3340
fdoray5eeb7642016-06-22 16:11:283341 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263342
3343 // Still no idle sockets, still one pending connect job.
3344 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263345 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263346
3347 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013348 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263349
3350 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263351 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263352
3353 // Finally, signal the waiting Connect.
3354 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263355 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263356
fdoray5eeb7642016-06-22 16:11:283357 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263358}
3359
3360// Test out the case where we have one socket connected, one
3361// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513362// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263363// should complete, by taking the first socket's idle socket.
3364TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3365 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3366 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3367
3368 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523369 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503370 EXPECT_EQ(
3371 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523372 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283373 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503374 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3375 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013376 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263377
3378 // No idle sockets, no pending jobs.
3379 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263380 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263381
3382 // Create a second socket to the same host, but this one will wait.
3383 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3384 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503385 EXPECT_EQ(
3386 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523387 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283388 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503389 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3390 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263391 // No idle sockets, and one connecting job.
3392 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263393 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263394
3395 // Return the first handle to the pool. This will initiate the delayed
3396 // binding.
3397 handle1.Reset();
3398
fdoray5eeb7642016-06-22 16:11:283399 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263400
3401 // Still no idle sockets, still one pending connect job.
3402 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263403 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263404
3405 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013406 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263407
3408 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263409 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263410
3411 // Finally, signal the waiting Connect.
3412 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263413 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263414
fdoray5eeb7642016-06-22 16:11:283415 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263416}
3417
[email protected]2abfe90a2010-08-25 17:49:513418// Cover the case where on an available socket slot, we have one pending
3419// request that completes synchronously, thereby making the Group empty.
3420TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3421 const int kUnlimitedSockets = 100;
3422 const int kOneSocketPerGroup = 1;
3423 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3424
3425 // Make the first request asynchronous fail.
3426 // This will free up a socket slot later.
3427 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3428
3429 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523430 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203431 EXPECT_EQ(
3432 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523433 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283434 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503435 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3436 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263437 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513438
3439 // Make the second request synchronously fail. This should make the Group
3440 // empty.
3441 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3442 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523443 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513444 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3445 // when created.
tfarina428341112016-09-22 13:38:203446 EXPECT_EQ(
3447 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523448 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283449 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503450 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3451 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513452
Matt Menke9fa17d52019-03-25 19:12:263453 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513454
robpercival214763f2016-07-01 23:27:013455 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3456 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263457 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513458}
3459
[email protected]e1b54dc2010-10-06 21:27:223460TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3461 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3462
3463 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3464
3465 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523466 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203467 EXPECT_EQ(
3468 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523469 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283470 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503471 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3472 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223473
3474 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523475 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203476 EXPECT_EQ(
3477 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523478 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283479 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503480 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3481 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223482 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523483 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203484 EXPECT_EQ(
3485 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523486 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283487 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503488 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3489 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223490
robpercival214763f2016-07-01 23:27:013491 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3492 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3493 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223494
3495 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353496 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383497 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353498 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383499 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223500
3501 handle1.Reset();
3502 handle2.Reset();
3503 handle3.Reset();
3504
Matt Menkec6b3edf72019-03-19 17:00:393505 EXPECT_EQ(OK, handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:523506 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283507 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393508 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3509 pool_.get(), NetLogWithSource()));
3510 EXPECT_EQ(OK, handle2.Init(
Anton Bikineev068d2912021-05-15 20:43:523511 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283512 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393513 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3514 pool_.get(), NetLogWithSource()));
3515 EXPECT_EQ(OK, handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:523516 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283517 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393518 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3519 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223520
3521 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3522 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3523 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3524}
3525
[email protected]2c2bef152010-10-13 00:55:033526TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3527 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3528 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3529
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213530 TestCompletionCallback preconnect_callback;
3531 EXPECT_EQ(ERR_IO_PENDING,
3532 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3533 preconnect_callback.callback(),
3534 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033535
Matt Menke9fa17d52019-03-25 19:12:263536 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3537 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3538 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3539 TestGroupId("a")));
3540 EXPECT_EQ(2u,
3541 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393542 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033543
3544 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523545 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203546 EXPECT_EQ(
3547 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523548 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283549 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503550 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3551 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033552
3553 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523554 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203555 EXPECT_EQ(
3556 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523557 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283558 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503559 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3560 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033561
Matt Menke9fa17d52019-03-25 19:12:263562 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3563 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3564 TestGroupId("a")));
3565 EXPECT_EQ(0u,
3566 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393567 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033568
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213569 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
robpercival214763f2016-07-01 23:27:013570 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3571 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033572 handle1.Reset();
3573 handle2.Reset();
3574
Matt Menke9fa17d52019-03-25 19:12:263575 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3576 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3577 TestGroupId("a")));
3578 EXPECT_EQ(0u,
3579 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393580 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033581}
3582
3583TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3584 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3585 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3586
3587 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523588 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203589 EXPECT_EQ(
3590 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523591 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283592 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503593 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3594 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033595
Matt Menke9fa17d52019-03-25 19:12:263596 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3597 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3598 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3599 TestGroupId("a")));
3600 EXPECT_EQ(0u,
3601 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393602 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033603
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213604 TestCompletionCallback preconnect_callback;
3605 EXPECT_EQ(ERR_IO_PENDING,
3606 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3607 preconnect_callback.callback(),
3608 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033609
Matt Menke9fa17d52019-03-25 19:12:263610 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3611 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3612 TestGroupId("a")));
3613 EXPECT_EQ(1u,
3614 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393615 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033616
3617 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523618 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203619 EXPECT_EQ(
3620 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523621 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283622 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503623 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3624 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033625
Matt Menke9fa17d52019-03-25 19:12:263626 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3627 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3628 TestGroupId("a")));
3629 EXPECT_EQ(0u,
3630 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393631 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033632
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213633 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
robpercival214763f2016-07-01 23:27:013634 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3635 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033636 handle1.Reset();
3637 handle2.Reset();
3638
Matt Menke9fa17d52019-03-25 19:12:263639 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3640 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3641 TestGroupId("a")));
3642 EXPECT_EQ(0u,
3643 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393644 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033645}
3646
3647TEST_F(ClientSocketPoolBaseTest,
3648 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3649 CreatePool(4, 4);
3650 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3651
3652 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523653 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203654 EXPECT_EQ(
3655 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523656 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283657 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503658 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3659 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033660
3661 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523662 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203663 EXPECT_EQ(
3664 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523665 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283666 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503667 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3668 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033669
3670 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523671 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203672 EXPECT_EQ(
3673 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523674 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283675 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503676 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3677 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033678
Matt Menke9fa17d52019-03-25 19:12:263679 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3680 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3681 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3682 TestGroupId("a")));
3683 EXPECT_EQ(0u,
3684 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393685 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033686
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213687 EXPECT_EQ(
3688 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3689 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033690
Matt Menke9fa17d52019-03-25 19:12:263691 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3692 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3693 TestGroupId("a")));
3694 EXPECT_EQ(0u,
3695 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393696 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033697
robpercival214763f2016-07-01 23:27:013698 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3699 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3700 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033701 handle1.Reset();
3702 handle2.Reset();
3703 handle3.Reset();
3704
Matt Menke9fa17d52019-03-25 19:12:263705 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3706 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3707 TestGroupId("a")));
3708 EXPECT_EQ(0u,
3709 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393710 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033711}
3712
3713TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3714 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3715 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3716
Matt Menke9fa17d52019-03-25 19:12:263717 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033718
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213719 TestCompletionCallback preconnect_callback;
3720 EXPECT_EQ(ERR_IO_PENDING,
3721 pool_->RequestSockets(
3722 TestGroupId("a"), params_, absl::nullopt, kDefaultMaxSockets,
3723 preconnect_callback.callback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033724
Matt Menke9fa17d52019-03-25 19:12:263725 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433726 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393727 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263728 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3729 EXPECT_EQ(
3730 kDefaultMaxSockets,
3731 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3732 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433733 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263734 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3735 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033736
Matt Menke9fa17d52019-03-25 19:12:263737 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033738
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213739 EXPECT_EQ(OK,
3740 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
3741 kDefaultMaxSockets, CompletionOnceCallback(),
3742 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033743
Matt Menke9fa17d52019-03-25 19:12:263744 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213745
3746 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033747}
3748
3749TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3750 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3751 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3752
Matt Menke9fa17d52019-03-25 19:12:263753 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033754
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213755 TestCompletionCallback preconnect_callback1;
3756 EXPECT_EQ(ERR_IO_PENDING,
3757 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3758 kDefaultMaxSockets - 1,
3759 preconnect_callback1.callback(),
3760 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033761
Matt Menke9fa17d52019-03-25 19:12:263762 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433763 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393764 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263765 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3766 EXPECT_EQ(
3767 kDefaultMaxSockets - 1,
3768 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3769 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433770 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263771 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3772 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483773 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033774
Matt Menke9fa17d52019-03-25 19:12:263775 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033776
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213777 TestCompletionCallback preconnect_callback2;
3778 EXPECT_EQ(ERR_IO_PENDING,
3779 pool_->RequestSockets(
3780 TestGroupId("b"), params_, absl::nullopt, kDefaultMaxSockets,
3781 preconnect_callback2.callback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033782
Matt Menke9fa17d52019-03-25 19:12:263783 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3784 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483785 EXPECT_FALSE(pool_->IsStalled());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213786
3787 EXPECT_THAT(preconnect_callback1.WaitForResult(), IsOk());
3788 EXPECT_THAT(preconnect_callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033789}
3790
3791TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3792 CreatePool(4, 4);
3793 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3794
3795 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523796 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203797 EXPECT_EQ(
3798 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523799 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283800 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503801 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3802 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013803 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033804 handle1.Reset();
3805
Matt Menke9fa17d52019-03-25 19:12:263806 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3807 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3808 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3809 TestGroupId("a")));
3810 EXPECT_EQ(0u,
3811 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393812 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033813
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213814 TestCompletionCallback preconnect_callback;
3815 EXPECT_EQ(ERR_IO_PENDING,
3816 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3817 preconnect_callback.callback(),
3818 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033819
Matt Menke9fa17d52019-03-25 19:12:263820 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3821 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3822 TestGroupId("a")));
3823 EXPECT_EQ(1u,
3824 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393825 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213826
3827 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033828}
3829
3830TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3831 CreatePool(4, 4);
3832 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3833
3834 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523835 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203836 EXPECT_EQ(
3837 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523838 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283839 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503840 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3841 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013842 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033843
Matt Menke9fa17d52019-03-25 19:12:263844 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3845 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3846 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3847 TestGroupId("a")));
3848 EXPECT_EQ(0u,
3849 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393850 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263851 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033852
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213853 TestCompletionCallback preconnect_callback;
3854 EXPECT_EQ(ERR_IO_PENDING,
3855 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3856 preconnect_callback.callback(),
3857 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033858
Matt Menke9fa17d52019-03-25 19:12:263859 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3860 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3861 TestGroupId("a")));
3862 EXPECT_EQ(1u,
3863 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393864 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263865 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213866
3867 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033868}
3869
3870TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3871 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3872 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3873
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213874 EXPECT_EQ(
3875 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3876 kDefaultMaxSocketsPerGroup,
3877 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033878
Matt Menke9fa17d52019-03-25 19:12:263879 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3880 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3881 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3882 TestGroupId("a")));
3883 EXPECT_EQ(0u,
3884 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433885 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393886 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033887
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213888 EXPECT_EQ(
3889 OK, pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
3890 kDefaultMaxSocketsPerGroup,
3891 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033892
Matt Menke9fa17d52019-03-25 19:12:263893 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3894 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3895 TestGroupId("b")));
3896 EXPECT_EQ(0u,
3897 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433898 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393899 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033900}
3901
[email protected]3c819f522010-12-02 02:03:123902TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3903 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3904 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3905
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213906 EXPECT_EQ(
3907 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3908 kDefaultMaxSocketsPerGroup,
3909 CompletionOnceCallback(), NetLogWithSource()));
[email protected]3c819f522010-12-02 02:03:123910
Matt Menke9fa17d52019-03-25 19:12:263911 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523912
3913 connect_job_factory_->set_job_type(
3914 TestConnectJob::kMockAdditionalErrorStateJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213915
3916 EXPECT_EQ(
3917 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3918 kDefaultMaxSocketsPerGroup,
3919 CompletionOnceCallback(), NetLogWithSource()));
[email protected]fd2e53e2011-01-14 20:40:523920
Matt Menke9fa17d52019-03-25 19:12:263921 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123922}
3923
[email protected]8159a1c2012-06-07 00:00:103924TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033925 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433926 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033927
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213928 TestCompletionCallback preconnect_callback;
3929 EXPECT_EQ(ERR_IO_PENDING,
3930 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3931 preconnect_callback.callback(),
3932 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033933
Matt Menke9fa17d52019-03-25 19:12:263934 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3935 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3936 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3937 TestGroupId("a")));
3938 EXPECT_EQ(2u,
3939 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3940 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393941 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033942
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213943 EXPECT_EQ(
3944 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3945 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263946 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3947 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3948 TestGroupId("a")));
3949 EXPECT_EQ(2u,
3950 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3951 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393952 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033953
3954 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523955 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203956 EXPECT_EQ(
3957 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523958 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283959 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503960 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3961 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433962
3963 client_socket_factory_.SignalJob(0);
3964 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3965
Matt Menke9fa17d52019-03-25 19:12:263966 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3967 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3968 TestGroupId("a")));
3969 EXPECT_EQ(1u,
3970 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3971 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393972 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033973
3974 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523975 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433976 EXPECT_EQ(
3977 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523978 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283979 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503980 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3981 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433982 client_socket_factory_.SignalJob(0);
3983 EXPECT_THAT(callback2.WaitForResult(), IsOk());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213984 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033985
Matt Menke9fa17d52019-03-25 19:12:263986 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3987 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3988 TestGroupId("a")));
3989 EXPECT_EQ(0u,
3990 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3991 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393992 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103993
[email protected]2c2bef152010-10-13 00:55:033994 handle1.Reset();
3995 handle2.Reset();
3996
Matt Menke9fa17d52019-03-25 19:12:263997 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3998 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3999 TestGroupId("a")));
4000 EXPECT_EQ(0u,
4001 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4002 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394003 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034004
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214005 EXPECT_EQ(
4006 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4007 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264008 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4009 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4010 TestGroupId("a")));
4011 EXPECT_EQ(0u,
4012 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4013 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394014 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034015}
4016
4017TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
4018 CreatePool(4, 4);
4019 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4020
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214021 TestCompletionCallback preconnect_callback1;
4022 EXPECT_EQ(ERR_IO_PENDING,
4023 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4024 preconnect_callback1.callback(),
4025 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034026
Matt Menke9fa17d52019-03-25 19:12:264027 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4028 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4029 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4030 TestGroupId("a")));
4031 EXPECT_EQ(1u,
4032 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394033 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034034
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214035 TestCompletionCallback preconnect_callback2;
4036 EXPECT_EQ(ERR_IO_PENDING,
4037 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4038 preconnect_callback2.callback(),
4039 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264040 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4041 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4042 TestGroupId("a")));
4043 EXPECT_EQ(2u,
4044 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394045 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034046
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214047 TestCompletionCallback preconnect_callback3;
4048 EXPECT_EQ(ERR_IO_PENDING,
4049 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 3,
4050 preconnect_callback3.callback(),
4051 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264052 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4053 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4054 TestGroupId("a")));
4055 EXPECT_EQ(3u,
4056 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394057 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034058
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214059 EXPECT_EQ(
4060 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4061 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264062 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4063 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4064 TestGroupId("a")));
4065 EXPECT_EQ(3u,
4066 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394067 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034068}
4069
4070TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
4071 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434072 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:034073
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214074 TestCompletionCallback preconnect_callback;
4075 EXPECT_EQ(ERR_IO_PENDING,
4076 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4077 preconnect_callback.callback(),
4078 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034079
Matt Menke9fa17d52019-03-25 19:12:264080 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4081 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4082 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4083 TestGroupId("a")));
4084 EXPECT_EQ(1u,
4085 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394086 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034087
4088 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524089 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204090 EXPECT_EQ(
4091 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524092 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284093 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504094 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4095 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034096
Matt Menke9fa17d52019-03-25 19:12:264097 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4098 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4099 TestGroupId("a")));
4100 EXPECT_EQ(0u,
4101 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394102 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034103
Lily Chenecebf932018-11-02 17:15:434104 client_socket_factory_.SignalJobs();
4105 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214106 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
Lily Chenecebf932018-11-02 17:15:434107
Matt Menke9fa17d52019-03-25 19:12:264108 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4109 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4110 TestGroupId("a")));
4111 EXPECT_EQ(0u,
4112 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394113 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264114 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034115
[email protected]0dc88b32014-03-26 20:12:284116 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:484117 // starts, it has a connect start time.
4118 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:034119 handle1.Reset();
4120
Matt Menkec6b3edf72019-03-19 17:00:394121 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034122}
4123
[email protected]034df0f32013-01-07 23:17:484124// Checks that fully connected preconnect jobs have no connect times, and are
4125// marked as reused.
4126TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
4127 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4128 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214129
4130 EXPECT_EQ(
4131 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4132 CompletionOnceCallback(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484133
Matt Menke9fa17d52019-03-25 19:12:264134 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4135 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4136 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4137 TestGroupId("a")));
4138 EXPECT_EQ(0u,
4139 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394140 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484141
4142 ClientSocketHandle handle;
4143 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394144 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524145 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284146 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394147 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4148 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484149
4150 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394151 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484152
4153 TestLoadTimingInfoConnectedReused(handle);
4154 handle.Reset();
4155 TestLoadTimingInfoNotConnected(handle);
4156}
4157
[email protected]dcbe168a2010-12-02 03:14:464158// http://crbug.com/64940 regression test.
4159TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4160 const int kMaxTotalSockets = 3;
4161 const int kMaxSocketsPerGroup = 2;
4162 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434163 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464164
Matt Menkef6edce752019-03-19 17:21:564165 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464166 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4167
4168 // Set up one idle socket in "a".
4169 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524170 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204171 EXPECT_EQ(
4172 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524173 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284174 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504175 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4176 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264177 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4178 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4179 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4180 TestGroupId("a")));
4181 EXPECT_EQ(0u,
4182 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394183 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464184
Lily Chenecebf932018-11-02 17:15:434185 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014186 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264187 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4188 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4189 TestGroupId("a")));
4190 EXPECT_EQ(0u,
4191 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4192 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434193
[email protected]dcbe168a2010-12-02 03:14:464194 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394195 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464196
4197 // Set up two active sockets in "b".
4198 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524199 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204200 EXPECT_EQ(
4201 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524202 handle1.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284203 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504204 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4205 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204206 EXPECT_EQ(
4207 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524208 handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284209 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504210 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4211 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464212
Matt Menke9fa17d52019-03-25 19:12:264213 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4214 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4215 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4216 TestGroupId("b")));
4217 EXPECT_EQ(0u,
4218 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394219 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434220
4221 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014222 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4223 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394224 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264225 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4226 TestGroupId("b")));
4227 EXPECT_EQ(0u,
4228 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4229 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464230
4231 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4232 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4233 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4234 // sockets for "a", and "b" should still have 2 active sockets.
4235
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214236 EXPECT_EQ(
4237 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4238 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264239 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4240 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4241 TestGroupId("a")));
4242 EXPECT_EQ(0u,
4243 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394244 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264245 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4246 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4247 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4248 TestGroupId("b")));
4249 EXPECT_EQ(0u,
4250 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394251 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264252 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464253
4254 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4255 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4256 // "a" should result in closing 1 for "b".
4257 handle1.Reset();
4258 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394259 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264260 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464261
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214262 TestCompletionCallback preconnect_callback;
4263 EXPECT_EQ(ERR_IO_PENDING,
4264 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4265 preconnect_callback.callback(),
4266 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264267 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4268 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4269 TestGroupId("a")));
4270 EXPECT_EQ(1u,
4271 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394272 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264273 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4274 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4275 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4276 TestGroupId("b")));
4277 EXPECT_EQ(0u,
4278 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394279 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264280 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464281}
4282
[email protected]b7b8be42011-07-12 12:46:414283TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264284 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4285 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074286
4287 // Make the ConnectJob hang until it times out, shorten the timeout.
4288 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Peter Kastinge5a38ed2021-10-02 03:06:354289 connect_job_factory_->set_timeout_duration(base::Milliseconds(500));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214290 TestCompletionCallback preconnect_callback;
4291 EXPECT_EQ(ERR_IO_PENDING,
4292 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4293 preconnect_callback.callback(),
4294 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264295 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4296 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4297 TestGroupId("a")));
4298 EXPECT_EQ(1u,
4299 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394300 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074301
[email protected]b7b8be42011-07-12 12:46:414302 // Verify the backup timer doesn't create a backup job, by making
4303 // the backup job a pending job instead of a waiting job, so it
4304 // *would* complete if it were created.
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594305 base::RunLoop loop;
[email protected]a9fc8fc2011-05-10 02:41:074306 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454307 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Peter Kastinge5a38ed2021-10-02 03:06:354308 FROM_HERE, loop.QuitClosure(), base::Seconds(1));
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594309 loop.Run();
Matt Menke9fa17d52019-03-25 19:12:264310 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074311}
4312
[email protected]b7b8be42011-07-12 12:46:414313TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264314 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4315 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074316
4317 // Make the ConnectJob hang forever.
4318 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214319 TestCompletionCallback preconnect_callback;
4320 EXPECT_EQ(ERR_IO_PENDING,
4321 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4322 preconnect_callback.callback(),
4323 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264324 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4325 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4326 TestGroupId("a")));
4327 EXPECT_EQ(1u,
4328 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394329 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284330 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074331
4332 // Make the backup job be a pending job, so it completes normally.
4333 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4334 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524335 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504336 EXPECT_EQ(
4337 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524338 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284339 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4340 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4341 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414342 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264343 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4344 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4345 TestGroupId("a")));
4346 EXPECT_EQ(0u,
4347 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394348 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264349 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014350 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074351
4352 // The hung connect job should still be there, but everything else should be
4353 // complete.
Matt Menke9fa17d52019-03-25 19:12:264354 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4355 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4356 TestGroupId("a")));
4357 EXPECT_EQ(1u,
4358 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394359 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264360 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074361}
4362
[email protected]0dc88b32014-03-26 20:12:284363// Tests that a preconnect that starts out with unread data can still be used.
4364// http://crbug.com/334467
4365TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4366 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4367 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4368
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214369 EXPECT_EQ(
4370 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4371 CompletionOnceCallback(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284372
Matt Menke9fa17d52019-03-25 19:12:264373 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4374 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4375 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4376 TestGroupId("a")));
4377 EXPECT_EQ(0u,
4378 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394379 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284380
4381 // Fail future jobs to be sure that handle receives the preconnected socket
4382 // rather than closing it and making a new one.
4383 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4384 ClientSocketHandle handle;
4385 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394386 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524387 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284388 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394389 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4390 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284391
Matt Menke9fa17d52019-03-25 19:12:264392 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4393 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4394 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4395 TestGroupId("a")));
4396 EXPECT_EQ(0u,
4397 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394398 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264399 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284400
4401 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354402 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284403
4404 TestLoadTimingInfoConnectedReused(handle);
4405 handle.Reset();
4406
4407 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394408 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284409}
4410
Lily Chenecebf932018-11-02 17:15:434411TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4412 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4413 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4414
4415 ClientSocketHandle handle1;
4416 TestCompletionCallback callback1;
4417 EXPECT_EQ(
4418 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524419 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284420 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504421 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4422 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434423
Matt Menke9fa17d52019-03-25 19:12:264424 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4425 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4426 TestGroupId("a")));
4427 EXPECT_EQ(0u,
4428 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394429 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434430
Matt Menkec6b3edf72019-03-19 17:00:394431 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4432 &handle1));
Lily Chenecebf932018-11-02 17:15:434433}
4434
4435TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4436 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4437 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4438
4439 ClientSocketHandle handle1;
4440 TestCompletionCallback callback1;
4441 EXPECT_EQ(
4442 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524443 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284444 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504445 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4446 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434447
Matt Menke9fa17d52019-03-25 19:12:264448 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4449 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4450 TestGroupId("a")));
4451 EXPECT_EQ(0u,
4452 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394453 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434454
4455 ClientSocketHandle handle2;
4456 TestCompletionCallback callback2;
4457 EXPECT_EQ(
4458 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524459 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284460 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504461 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4462 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434463
Matt Menke9fa17d52019-03-25 19:12:264464 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4465 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4466 TestGroupId("a")));
4467 EXPECT_EQ(0u,
4468 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394469 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434470
Matt Menkec6b3edf72019-03-19 17:00:394471 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4472 &handle1));
4473 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4474 &handle2));
Lily Chenecebf932018-11-02 17:15:434475
4476 // One job completes. The other request should still have its job.
4477 client_socket_factory_.SignalJob(0);
4478 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4479
Matt Menke9fa17d52019-03-25 19:12:264480 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4481 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4482 TestGroupId("a")));
4483 EXPECT_EQ(0u,
4484 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4485 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394486 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434487
Matt Menkec6b3edf72019-03-19 17:00:394488 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4489 &handle2));
Lily Chenecebf932018-11-02 17:15:434490}
4491
4492TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4493 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4494 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4495
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214496 TestCompletionCallback preconnect_callback;
4497 EXPECT_EQ(ERR_IO_PENDING,
4498 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4499 preconnect_callback.callback(),
4500 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434501
Matt Menke9fa17d52019-03-25 19:12:264502 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4503 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4504 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4505 TestGroupId("a")));
4506 EXPECT_EQ(1u,
4507 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394508 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434509
4510 ClientSocketHandle handle1;
4511 TestCompletionCallback callback1;
4512 EXPECT_EQ(
4513 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524514 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284515 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504516 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4517 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434518
Matt Menke9fa17d52019-03-25 19:12:264519 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4520 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4521 TestGroupId("a")));
4522 EXPECT_EQ(0u,
4523 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394524 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434525
Matt Menkec6b3edf72019-03-19 17:00:394526 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4527 &handle1));
Lily Chenecebf932018-11-02 17:15:434528}
4529
4530TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4531 CreatePool(kDefaultMaxSockets, 1);
4532 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4533
4534 ClientSocketHandle handle1;
4535 TestCompletionCallback callback1;
4536 EXPECT_EQ(
4537 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524538 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284539 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504540 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4541 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434542
Matt Menke9fa17d52019-03-25 19:12:264543 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4544 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4545 TestGroupId("a")));
4546 EXPECT_EQ(0u,
4547 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394548 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434549
Matt Menkec6b3edf72019-03-19 17:00:394550 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4551 &handle1));
Lily Chenecebf932018-11-02 17:15:434552
4553 // Insert a higher priority request
4554 ClientSocketHandle handle2;
4555 TestCompletionCallback callback2;
4556 EXPECT_EQ(
4557 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524558 handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284559 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504560 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4561 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434562
Matt Menke9fa17d52019-03-25 19:12:264563 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4564 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4565 TestGroupId("a")));
4566 EXPECT_EQ(0u,
4567 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394568 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434569
4570 // The highest priority request should steal the job from the default priority
4571 // request.
Matt Menkec6b3edf72019-03-19 17:00:394572 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4573 &handle2));
4574 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4575 &handle1));
Lily Chenecebf932018-11-02 17:15:434576}
4577
4578TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4579 CreatePool(3, 3);
4580 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4581
4582 ClientSocketHandle handle_lowest;
4583 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284584 EXPECT_EQ(
4585 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524586 handle_lowest.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284587 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4588 callback_lowest.callback(),
4589 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4590 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434591
Matt Menke9fa17d52019-03-25 19:12:264592 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4593 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4594 TestGroupId("a")));
4595 EXPECT_EQ(0u,
4596 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394597 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434598
4599 ClientSocketHandle handle_highest;
4600 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284601 EXPECT_EQ(
4602 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524603 handle_highest.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284604 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4605 callback_highest.callback(),
4606 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4607 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434608
Matt Menke9fa17d52019-03-25 19:12:264609 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4610 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4611 TestGroupId("a")));
4612 EXPECT_EQ(0u,
4613 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394614 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434615
4616 ClientSocketHandle handle_low;
4617 TestCompletionCallback callback_low;
4618 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284619 handle_low.Init(
Anton Bikineev068d2912021-05-15 20:43:524620 TestGroupId("a"), params_, absl::nullopt, LOW, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284621 ClientSocketPool::RespectLimits::ENABLED,
4622 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4623 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434624
Matt Menke9fa17d52019-03-25 19:12:264625 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4626 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4627 TestGroupId("a")));
4628 EXPECT_EQ(0u,
4629 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394630 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434631
4632 ClientSocketHandle handle_lowest2;
4633 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284634 EXPECT_EQ(
4635 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524636 handle_lowest2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284637 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4638 callback_lowest2.callback(),
4639 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4640 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434641
Matt Menke9fa17d52019-03-25 19:12:264642 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4643 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4644 TestGroupId("a")));
4645 EXPECT_EQ(0u,
4646 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394647 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434648
4649 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394650 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4651 &handle_highest));
4652 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4653 &handle_low));
4654 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4655 &handle_lowest));
4656 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4657 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434658
4659 // Add another request with medium priority. It should steal the job from the
4660 // lowest priority request with a job.
4661 ClientSocketHandle handle_medium;
4662 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284663 EXPECT_EQ(
4664 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524665 handle_medium.Init(TestGroupId("a"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:284666 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4667 callback_medium.callback(),
4668 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4669 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434670
Matt Menke9fa17d52019-03-25 19:12:264671 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4672 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4673 TestGroupId("a")));
4674 EXPECT_EQ(0u,
4675 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394676 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4677 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4678 &handle_highest));
4679 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4680 &handle_medium));
4681 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4682 &handle_low));
4683 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4684 &handle_lowest));
4685 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4686 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434687}
4688
4689TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4690 CreatePool(kDefaultMaxSockets, 1);
4691 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4692
4693 ClientSocketHandle handle1;
4694 TestCompletionCallback callback1;
4695 EXPECT_EQ(
4696 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524697 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284698 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504699 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4700 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434701
Matt Menke9fa17d52019-03-25 19:12:264702 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4703 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4704 TestGroupId("a")));
4705 EXPECT_EQ(0u,
4706 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394707 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434708
4709 ClientSocketHandle handle2;
4710 TestCompletionCallback callback2;
4711 EXPECT_EQ(
4712 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524713 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284714 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504715 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4716 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434717
Matt Menke9fa17d52019-03-25 19:12:264718 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4719 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4720 TestGroupId("a")));
4721 EXPECT_EQ(0u,
4722 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394723 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434724
4725 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394726 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4727 &handle1));
4728 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4729 &handle2));
Lily Chenecebf932018-11-02 17:15:434730
4731 // Reprioritizing the second request places it above the first, and it steals
4732 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394733 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4734 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4735 &handle2));
4736 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4737 &handle1));
Lily Chenecebf932018-11-02 17:15:434738}
4739
4740TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4741 CreatePool(kDefaultMaxSockets, 1);
4742 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4743
4744 ClientSocketHandle handle1;
4745 TestCompletionCallback callback1;
4746 EXPECT_EQ(
4747 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524748 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284749 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504750 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4751 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434752
Matt Menke9fa17d52019-03-25 19:12:264753 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4754 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4755 TestGroupId("a")));
4756 EXPECT_EQ(0u,
4757 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394758 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434759
Matt Menkec6b3edf72019-03-19 17:00:394760 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4761 &handle1));
Lily Chenecebf932018-11-02 17:15:434762
4763 ClientSocketHandle handle2;
4764 TestCompletionCallback callback2;
4765 EXPECT_EQ(
4766 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524767 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284768 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504769 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4770 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434771
Matt Menke9fa17d52019-03-25 19:12:264772 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4773 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4774 TestGroupId("a")));
4775 EXPECT_EQ(0u,
4776 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394777 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434778
4779 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394780 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4781 &handle1));
4782 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4783 &handle2));
Lily Chenecebf932018-11-02 17:15:434784
4785 // The second request should get a job upon cancelling the first request.
4786 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264787 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4788 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4789 TestGroupId("a")));
4790 EXPECT_EQ(0u,
4791 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394792 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434793
Matt Menkec6b3edf72019-03-19 17:00:394794 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4795 &handle2));
Lily Chenecebf932018-11-02 17:15:434796}
4797
4798TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4799 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4800 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4801
4802 ClientSocketHandle handle1;
4803 TestCompletionCallback callback1;
4804 EXPECT_EQ(
4805 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524806 handle1.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284807 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504808 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4809 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434810
Matt Menke9fa17d52019-03-25 19:12:264811 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4812 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4813 TestGroupId("a")));
4814 EXPECT_EQ(0u,
4815 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394816 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434817
4818 ClientSocketHandle handle2;
4819 TestCompletionCallback callback2;
4820 EXPECT_EQ(
4821 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524822 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284823 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504824 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4825 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434826
Matt Menke9fa17d52019-03-25 19:12:264827 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4828 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4829 TestGroupId("a")));
4830 EXPECT_EQ(0u,
4831 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394832 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434833
Matt Menkec6b3edf72019-03-19 17:00:394834 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4835 &handle1));
4836 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4837 &handle2));
Lily Chenecebf932018-11-02 17:15:434838
4839 // The lower-priority job completes first. The higher-priority request should
4840 // get the socket, and the lower-priority request should get the remaining
4841 // job.
4842 client_socket_factory_.SignalJob(1);
4843 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264844 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4845 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4846 TestGroupId("a")));
4847 EXPECT_EQ(0u,
4848 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4849 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394850 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434851 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394852 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4853 &handle2));
Lily Chenecebf932018-11-02 17:15:434854}
4855
[email protected]043b68c82013-08-22 23:41:524856class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204857 public:
Matt Menke9fa17d52019-03-25 19:12:264858 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394859 const ClientSocketPool::GroupId& group_id)
Tsuyoshi Horo2ec06e002022-06-09 01:38:594860 : pool_(pool), group_id_(group_id) {
[email protected]043b68c82013-08-22 23:41:524861 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204862 }
4863
Daniel Cheng4496d0822018-04-26 21:52:154864 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204865
Matt Menke9fa17d52019-03-25 19:12:264866 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504867 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034868 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524869 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284870 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4871 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204872 }
4873
Matt Menke9fa17d52019-03-25 19:12:264874 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504875 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034876 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524877 absl::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504878 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4879 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204880 }
4881
4882 bool ReleaseOneConnection() {
4883 if (!handle_.is_initialized() || !can_release_connection_) {
4884 return false;
4885 }
4886 handle_.socket()->Disconnect();
4887 handle_.Reset();
4888 return true;
4889 }
4890
4891 void set_can_release_connection(bool can_release_connection) {
4892 can_release_connection_ = can_release_connection;
4893 }
4894
4895 MOCK_METHOD0(CloseOneIdleConnection, bool());
4896
4897 private:
Keishi Hattori0e45c022021-11-27 09:25:524898 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]58e562f2013-04-22 17:32:204899 ClientSocketHandle handle_;
4900 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394901 const ClientSocketPool::GroupId group_id_;
Tsuyoshi Horo2ec06e002022-06-09 01:38:594902 bool can_release_connection_ = true;
[email protected]58e562f2013-04-22 17:32:204903};
4904
[email protected]58e562f2013-04-22 17:32:204905// Tests the basic case of closing an idle socket in a higher layered pool when
4906// a new request is issued and the lower layer pool is stalled.
4907TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4908 CreatePool(1, 1);
4909 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4910
Matt Menkec6b3edf72019-03-19 17:00:394911 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014912 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204913 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4914 .WillOnce(Invoke(&mock_layered_pool,
4915 &MockLayeredPool::ReleaseOneConnection));
4916 ClientSocketHandle handle;
4917 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504918 EXPECT_EQ(
4919 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524920 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284921 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4922 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4923 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014924 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204925}
4926
Matt Menke833678642019-03-05 22:05:514927// Tests the case that trying to close an idle socket in a higher layered pool
4928// fails.
4929TEST_F(ClientSocketPoolBaseTest,
4930 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4931 CreatePool(1, 1);
4932 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4933
Matt Menkec6b3edf72019-03-19 17:00:394934 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514935 mock_layered_pool.set_can_release_connection(false);
4936 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4937 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4938 .WillOnce(Invoke(&mock_layered_pool,
4939 &MockLayeredPool::ReleaseOneConnection));
4940 ClientSocketHandle handle;
4941 TestCompletionCallback callback;
4942 EXPECT_EQ(
4943 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524944 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284945 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4946 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4947 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514948 base::RunLoop().RunUntilIdle();
4949 EXPECT_FALSE(callback.have_result());
4950}
4951
[email protected]58e562f2013-04-22 17:32:204952// Same as above, but the idle socket is in the same group as the stalled
4953// socket, and closes the only other request in its group when closing requests
4954// in higher layered pools. This generally shouldn't happen, but it may be
4955// possible if a higher level pool issues a request and the request is
4956// subsequently cancelled. Even if it's not possible, best not to crash.
4957TEST_F(ClientSocketPoolBaseTest,
4958 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4959 CreatePool(2, 2);
4960 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4961
4962 // Need a socket in another group for the pool to be stalled (If a group
4963 // has the maximum number of connections already, it's not stalled).
4964 ClientSocketHandle handle1;
4965 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524966 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284967 DEFAULT_PRIORITY, SocketTag(),
4968 ClientSocketPool::RespectLimits::ENABLED,
4969 callback1.callback(),
4970 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4971 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204972
Matt Menkec6b3edf72019-03-19 17:00:394973 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014974 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204975 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4976 .WillOnce(Invoke(&mock_layered_pool,
4977 &MockLayeredPool::ReleaseOneConnection));
4978 ClientSocketHandle handle;
4979 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284980 EXPECT_EQ(ERR_IO_PENDING,
4981 handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524982 TestGroupId("group2"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284983 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4984 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4985 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014986 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204987}
4988
4989// Tests the case when an idle socket can be closed when a new request is
4990// issued, and the new request belongs to a group that was previously stalled.
4991TEST_F(ClientSocketPoolBaseTest,
4992 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4993 CreatePool(2, 2);
4994 std::list<TestConnectJob::JobType> job_types;
4995 job_types.push_back(TestConnectJob::kMockJob);
4996 job_types.push_back(TestConnectJob::kMockJob);
4997 job_types.push_back(TestConnectJob::kMockJob);
4998 job_types.push_back(TestConnectJob::kMockJob);
4999 connect_job_factory_->set_job_types(&job_types);
5000
5001 ClientSocketHandle handle1;
5002 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:525003 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:285004 DEFAULT_PRIORITY, SocketTag(),
5005 ClientSocketPool::RespectLimits::ENABLED,
5006 callback1.callback(),
5007 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5008 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205009
Matt Menkec6b3edf72019-03-19 17:00:395010 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:015011 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205012 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
5013 .WillRepeatedly(Invoke(&mock_layered_pool,
5014 &MockLayeredPool::ReleaseOneConnection));
5015 mock_layered_pool.set_can_release_connection(false);
5016
5017 // The third request is made when the socket pool is in a stalled state.
5018 ClientSocketHandle handle3;
5019 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:285020 EXPECT_EQ(ERR_IO_PENDING,
5021 handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:525022 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285023 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5024 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5025 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205026
5027 base::RunLoop().RunUntilIdle();
5028 EXPECT_FALSE(callback3.have_result());
5029
5030 // The fourth request is made when the pool is no longer stalled. The third
5031 // request should be serviced first, since it was issued first and has the
5032 // same priority.
5033 mock_layered_pool.set_can_release_connection(true);
5034 ClientSocketHandle handle4;
5035 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:285036 EXPECT_EQ(ERR_IO_PENDING,
5037 handle4.Init(
Anton Bikineev068d2912021-05-15 20:43:525038 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285039 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5040 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5041 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015042 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205043 EXPECT_FALSE(callback4.have_result());
5044
5045 // Closing a handle should free up another socket slot.
5046 handle1.Reset();
robpercival214763f2016-07-01 23:27:015047 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205048}
5049
5050// Tests the case when an idle socket can be closed when a new request is
5051// issued, and the new request belongs to a group that was previously stalled.
5052//
5053// The two differences from the above test are that the stalled requests are not
5054// in the same group as the layered pool's request, and the the fourth request
5055// has a higher priority than the third one, so gets a socket first.
5056TEST_F(ClientSocketPoolBaseTest,
5057 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
5058 CreatePool(2, 2);
5059 std::list<TestConnectJob::JobType> job_types;
5060 job_types.push_back(TestConnectJob::kMockJob);
5061 job_types.push_back(TestConnectJob::kMockJob);
5062 job_types.push_back(TestConnectJob::kMockJob);
5063 job_types.push_back(TestConnectJob::kMockJob);
5064 connect_job_factory_->set_job_types(&job_types);
5065
5066 ClientSocketHandle handle1;
5067 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:525068 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:285069 DEFAULT_PRIORITY, SocketTag(),
5070 ClientSocketPool::RespectLimits::ENABLED,
5071 callback1.callback(),
5072 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5073 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205074
Matt Menkec6b3edf72019-03-19 17:00:395075 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:015076 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205077 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
5078 .WillRepeatedly(Invoke(&mock_layered_pool,
5079 &MockLayeredPool::ReleaseOneConnection));
5080 mock_layered_pool.set_can_release_connection(false);
5081
5082 // The third request is made when the socket pool is in a stalled state.
5083 ClientSocketHandle handle3;
5084 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:205085 EXPECT_EQ(
5086 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525087 handle3.Init(TestGroupId("group3"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:285088 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505089 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5090 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205091
5092 base::RunLoop().RunUntilIdle();
5093 EXPECT_FALSE(callback3.have_result());
5094
5095 // The fourth request is made when the pool is no longer stalled. This
5096 // request has a higher priority than the third request, so is serviced first.
5097 mock_layered_pool.set_can_release_connection(true);
5098 ClientSocketHandle handle4;
5099 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:205100 EXPECT_EQ(
5101 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525102 handle4.Init(TestGroupId("group3"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:285103 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505104 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5105 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015106 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205107 EXPECT_FALSE(callback3.have_result());
5108
5109 // Closing a handle should free up another socket slot.
5110 handle1.Reset();
robpercival214763f2016-07-01 23:27:015111 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205112}
5113
5114TEST_F(ClientSocketPoolBaseTest,
5115 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
5116 CreatePool(1, 1);
5117 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5118
Matt Menkec6b3edf72019-03-19 17:00:395119 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:015120 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205121 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
5122 .WillRepeatedly(Invoke(&mock_layered_pool1,
5123 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:395124 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:015125 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
5126 IsOk());
[email protected]58e562f2013-04-22 17:32:205127 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
5128 .WillRepeatedly(Invoke(&mock_layered_pool2,
5129 &MockLayeredPool::ReleaseOneConnection));
5130 ClientSocketHandle handle;
5131 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:505132 EXPECT_EQ(
5133 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525134 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285135 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5136 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5137 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015138 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205139}
5140
[email protected]b021ece62013-06-11 11:06:335141// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:155142// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
5143// socket instead of a request with the same priority that was issued earlier,
5144// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:335145TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:335146 CreatePool(1, 1);
5147
5148 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395149 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5150 TestGroupId("a"), MAXIMUM_PRIORITY,
5151 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265152 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335153
5154 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5155
mmenked3641e12016-01-28 16:06:155156 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395157 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155158 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265159 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335160
mmenked3641e12016-01-28 16:06:155161 // Issue a request that ignores the limits, so a new ConnectJob is
5162 // created.
5163 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395164 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155165 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265166 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335167
robpercival214763f2016-07-01 23:27:015168 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335169 EXPECT_FALSE(request(1)->have_result());
5170}
5171
[email protected]c55fabd2013-11-04 23:26:565172// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155173// issued for a request with RespectLimits::DISABLED is not cancelled when a
5174// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565175TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565176 CreatePool(1, 1);
5177
5178 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395179 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5180 TestGroupId("a"), MAXIMUM_PRIORITY,
5181 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265182 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565183
5184 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5185
mmenked3641e12016-01-28 16:06:155186 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395187 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155188 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265189 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565190
mmenked3641e12016-01-28 16:06:155191 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5192 // created.
5193 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395194 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155195 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265196 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335197
mmenked3641e12016-01-28 16:06:155198 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335199 // should not be cancelled.
5200 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265201 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335202
robpercival214763f2016-07-01 23:27:015203 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335204 EXPECT_FALSE(request(1)->have_result());
5205}
5206
Matt Menkeb57663b32019-03-01 17:17:105207TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5208 CreatePool(1, 1);
5209
5210 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5211
5212 ClientSocketHandle handle;
5213 TestCompletionCallback callback;
5214 EXPECT_EQ(
5215 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525216 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285217 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5218 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5219 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105220
Matt Menke9fa17d52019-03-25 19:12:265221 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105222
5223 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5224 EXPECT_FALSE(handle.is_initialized());
5225 EXPECT_FALSE(handle.socket());
5226
5227 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265228 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105229}
5230
5231class TestAuthHelper {
5232 public:
5233 TestAuthHelper() = default;
Peter Boström293b1342021-09-22 17:31:435234
5235 TestAuthHelper(const TestAuthHelper&) = delete;
5236 TestAuthHelper& operator=(const TestAuthHelper&) = delete;
5237
Matt Menkeb57663b32019-03-01 17:17:105238 ~TestAuthHelper() = default;
5239
Matt Menkec6b3edf72019-03-19 17:00:395240 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195241 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265242 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395243 RequestPriority priority = DEFAULT_PRIORITY,
5244 ClientSocketPool::RespectLimits respect_limits =
5245 ClientSocketPool::RespectLimits::ENABLED,
5246 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105247 EXPECT_EQ(ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525248 handle_.Init(group_id_in, params, absl::nullopt, priority,
Matt Menkef09e64c2019-04-23 22:16:285249 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105250 base::BindRepeating(&TestAuthHelper::AuthCallback,
5251 base::Unretained(this)),
5252 pool, NetLogWithSource()));
5253 }
5254
5255 void WaitForAuth() {
5256 run_loop_ = std::make_unique<base::RunLoop>();
5257 run_loop_->Run();
5258 run_loop_.reset();
5259 }
5260
5261 void WaitForAuthAndRestartSync() {
5262 restart_sync_ = true;
5263 WaitForAuth();
5264 restart_sync_ = false;
5265 }
5266
5267 void WaitForAuthAndResetHandleSync() {
5268 reset_handle_sync_ = true;
5269 WaitForAuth();
5270 reset_handle_sync_ = false;
5271 }
5272
5273 void RestartWithAuth() {
5274 DCHECK(restart_with_auth_callback_);
5275 std::move(restart_with_auth_callback_).Run();
5276 }
5277
5278 int WaitForResult() {
5279 int result = callback_.WaitForResult();
5280 // There shouldn't be any callback waiting to be invoked once the request is
5281 // complete.
5282 EXPECT_FALSE(restart_with_auth_callback_);
5283 // The socket should only be initialized on success.
5284 EXPECT_EQ(result == OK, handle_.is_initialized());
5285 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5286 return result;
5287 }
5288
5289 ClientSocketHandle* handle() { return &handle_; }
5290 int auth_count() const { return auth_count_; }
5291 int have_result() const { return callback_.have_result(); }
5292
5293 private:
5294 void AuthCallback(const HttpResponseInfo& response,
5295 HttpAuthController* auth_controller,
5296 base::OnceClosure restart_with_auth_callback) {
5297 EXPECT_FALSE(restart_with_auth_callback_);
5298 EXPECT_TRUE(restart_with_auth_callback);
5299
5300 // Once there's a result, this method shouldn't be invoked again.
5301 EXPECT_FALSE(callback_.have_result());
5302
5303 ++auth_count_;
5304 run_loop_->Quit();
5305 if (restart_sync_) {
5306 std::move(restart_with_auth_callback).Run();
5307 return;
5308 }
5309
5310 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5311
5312 if (reset_handle_sync_) {
5313 handle_.Reset();
5314 return;
5315 }
5316 }
5317
5318 std::unique_ptr<base::RunLoop> run_loop_;
5319 base::OnceClosure restart_with_auth_callback_;
5320
5321 bool restart_sync_ = false;
5322 bool reset_handle_sync_ = false;
5323
5324 ClientSocketHandle handle_;
5325 int auth_count_ = 0;
5326 TestCompletionCallback callback_;
Matt Menkeb57663b32019-03-01 17:17:105327};
5328
5329TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5330 CreatePool(1, 1);
5331 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5332
5333 TestAuthHelper auth_helper;
5334 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265335 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015336 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395337 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105338
5339 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265340 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015341 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395342 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105343
5344 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265345 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015346 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395347 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105348
5349 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5350 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265351 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5352 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395353 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105354 EXPECT_EQ(0, pool_->IdleSocketCount());
5355}
5356
5357TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5358 CreatePool(1, 1);
5359 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5360
5361 TestAuthHelper auth_helper;
5362 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265363 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015364 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395365 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105366
5367 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265368 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015369 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395370 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105371
5372 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5373 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265374 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5375 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395376 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105377 EXPECT_EQ(0, pool_->IdleSocketCount());
5378}
5379
5380TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5381 CreatePool(1, 1);
5382 connect_job_factory_->set_job_type(
5383 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5384
5385 TestAuthHelper auth_helper;
5386 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265387 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105388
5389 auth_helper.WaitForAuth();
5390 auth_helper.RestartWithAuth();
5391 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5392
5393 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265394 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105395 EXPECT_EQ(0, pool_->IdleSocketCount());
5396}
5397
5398TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5399 CreatePool(1, 1);
5400 connect_job_factory_->set_job_type(
5401 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5402
5403 TestAuthHelper auth_helper;
5404 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265405 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105406
5407 auth_helper.WaitForAuthAndRestartSync();
5408 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5409
5410 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265411 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105412 EXPECT_EQ(0, pool_->IdleSocketCount());
5413}
5414
5415TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5416 CreatePool(1, 1);
5417 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5418
5419 TestAuthHelper auth_helper;
5420 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265421 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105422
5423 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265424 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105425
5426 auth_helper.handle()->Reset();
5427
5428 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265429 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105430 EXPECT_EQ(0, pool_->IdleSocketCount());
5431 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5432 EXPECT_FALSE(auth_helper.handle()->socket());
5433}
5434
5435TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5436 CreatePool(1, 1);
5437 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5438
5439 TestAuthHelper auth_helper;
5440 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265441 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105442
5443 auth_helper.WaitForAuthAndResetHandleSync();
5444 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265445 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105446 EXPECT_EQ(0, pool_->IdleSocketCount());
5447 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5448 EXPECT_FALSE(auth_helper.handle()->socket());
5449}
5450
5451TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5452 CreatePool(1, 1);
5453 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5454
5455 TestAuthHelper auth_helper;
5456 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265457 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105458
5459 auth_helper.WaitForAuth();
5460
Matt Menke433de6d2020-03-04 00:24:115461 pool_->FlushWithError(ERR_FAILED, "Network changed");
Matt Menkeb57663b32019-03-01 17:17:105462 base::RunLoop().RunUntilIdle();
5463
5464 // When flushing the socket pool, bound sockets should delay returning the
5465 // error until completion.
5466 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265467 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105468 EXPECT_EQ(0, pool_->IdleSocketCount());
5469
5470 auth_helper.RestartWithAuth();
5471 // The callback should be called asynchronously.
5472 EXPECT_FALSE(auth_helper.have_result());
5473
5474 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265475 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105476 EXPECT_EQ(0, pool_->IdleSocketCount());
5477}
5478
5479TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5480 CreatePool(1, 1);
5481 connect_job_factory_->set_job_type(
5482 TestConnectJob::kMockAuthChallengeTwiceJob);
5483
5484 TestAuthHelper auth_helper;
5485 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265486 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015487 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395488 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105489
5490 auth_helper.WaitForAuth();
5491 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265492 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105493 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015494 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395495 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105496
5497 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265498 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015499 EXPECT_EQ(2, auth_helper.auth_count());
5500 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395501 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015502
Matt Menkeb57663b32019-03-01 17:17:105503 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265504 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105505 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015506 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395507 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105508
5509 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5510 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265511 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5512 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395513 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105514 EXPECT_EQ(0, pool_->IdleSocketCount());
5515}
5516
5517TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5518 CreatePool(1, 1);
5519 connect_job_factory_->set_job_type(
5520 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5521
5522 TestAuthHelper auth_helper;
5523 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265524 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105525
5526 auth_helper.WaitForAuth();
5527 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265528 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105529 EXPECT_EQ(1, auth_helper.auth_count());
5530
5531 auth_helper.WaitForAuth();
5532 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265533 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105534 EXPECT_EQ(2, auth_helper.auth_count());
5535
5536 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5537 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265538 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105539 EXPECT_EQ(0, pool_->IdleSocketCount());
5540}
5541
5542// Makes sure that when a bound request is destroyed, a new ConnectJob is
5543// created, if needed.
5544TEST_F(ClientSocketPoolBaseTest,
5545 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5546 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5547 connect_job_factory_->set_job_type(
5548 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5549
5550 // First request creates a ConnectJob.
5551 TestAuthHelper auth_helper1;
5552 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265553 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105554
5555 // A second request come in, but no new ConnectJob is needed, since the limit
5556 // has been reached.
5557 TestAuthHelper auth_helper2;
5558 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265559 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105560
5561 // Run until the auth callback for the first request is invoked.
5562 auth_helper1.WaitForAuth();
5563 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265564 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5565 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395566 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105567
5568 // Make connect jobs succeed, then cancel the first request, which should
5569 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5570 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5571 auth_helper1.handle()->Reset();
5572 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265573 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105574
5575 // The second ConnectJob should succeed.
5576 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5577 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265578 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105579}
5580
5581// Makes sure that when a bound request is destroyed, a new ConnectJob is
5582// created for another group, if needed.
5583TEST_F(ClientSocketPoolBaseTest,
5584 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5585 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5586 connect_job_factory_->set_job_type(
5587 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5588
5589 // First request creates a ConnectJob.
5590 TestAuthHelper auth_helper1;
5591 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265592 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105593
5594 // A second request come in, but no new ConnectJob is needed, since the limit
5595 // has been reached.
5596 TestAuthHelper auth_helper2;
5597 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395598 ClientSocketPool::RespectLimits::ENABLED,
5599 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265600 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5601 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105602
5603 // Run until the auth callback for the first request is invoked.
5604 auth_helper1.WaitForAuth();
5605 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265606 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5607 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395608 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265609 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5610 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395611 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105612
5613 // Make connect jobs succeed, then cancel the first request, which should
5614 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5615 // other group.
5616 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5617 auth_helper1.handle()->Reset();
5618 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265619 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5620 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105621
5622 // The second ConnectJob should succeed.
5623 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5624 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265625 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5626 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105627}
5628
5629// Test that once an auth challenge is bound, that's the request that gets all
5630// subsequent calls and the socket itself.
5631TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5632 CreatePool(1, 1);
5633 connect_job_factory_->set_job_type(
5634 TestConnectJob::kMockAuthChallengeTwiceJob);
5635
5636 // First request creates a ConnectJob.
5637 TestAuthHelper auth_helper1;
5638 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265639 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105640
5641 // A second, higher priority request is made.
5642 TestAuthHelper auth_helper2;
5643 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265644 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105645
5646 // Run until the auth callback for the second request is invoked.
5647 auth_helper2.WaitForAuth();
5648 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265649 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5650 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395651 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105652
5653 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5654 // ConnectJob.
5655 TestAuthHelper auth_helper3;
5656 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265657 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105658
5659 // Start a higher job that ignores limits, creating a hanging socket. It
5660 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5661 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5662 TestAuthHelper auth_helper4;
5663 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5664 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265665 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105666
5667 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5668 // again.
5669 auth_helper2.RestartWithAuth();
5670 auth_helper2.WaitForAuth();
5671 EXPECT_EQ(0, auth_helper1.auth_count());
5672 EXPECT_FALSE(auth_helper1.have_result());
5673 EXPECT_EQ(2, auth_helper2.auth_count());
5674 EXPECT_FALSE(auth_helper2.have_result());
5675 EXPECT_EQ(0, auth_helper3.auth_count());
5676 EXPECT_FALSE(auth_helper3.have_result());
5677 EXPECT_EQ(0, auth_helper4.auth_count());
5678 EXPECT_FALSE(auth_helper4.have_result());
5679
5680 // Advance auth again, and |auth_helper2| should get the socket.
5681 auth_helper2.RestartWithAuth();
5682 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5683 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5684 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265685 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5686 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105687 EXPECT_EQ(0, auth_helper1.auth_count());
5688 EXPECT_FALSE(auth_helper1.have_result());
5689 EXPECT_EQ(0, auth_helper3.auth_count());
5690 EXPECT_FALSE(auth_helper3.have_result());
5691 EXPECT_EQ(0, auth_helper4.auth_count());
5692 EXPECT_FALSE(auth_helper4.have_result());
5693
5694 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5695 // socket request should be able to claim it.
5696 auth_helper2.handle()->Reset();
5697 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5698 EXPECT_EQ(0, auth_helper1.auth_count());
5699 EXPECT_FALSE(auth_helper1.have_result());
5700 EXPECT_EQ(0, auth_helper3.auth_count());
5701 EXPECT_FALSE(auth_helper3.have_result());
5702 EXPECT_EQ(0, auth_helper4.auth_count());
5703}
5704
David Benjaminbac8dff2019-08-07 01:30:415705enum class RefreshType {
5706 kServer,
5707 kProxy,
5708};
5709
5710// Common base class to test RefreshGroup() when called from either
5711// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5712//
5713// Tests which test behavior specific to one or the other case should use
5714// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5715// when the pool's proxy matches.
5716class ClientSocketPoolBaseRefreshTest
5717 : public ClientSocketPoolBaseTest,
5718 public testing::WithParamInterface<RefreshType> {
5719 public:
5720 void CreatePoolForRefresh(int max_sockets,
5721 int max_sockets_per_group,
5722 bool enable_backup_connect_jobs = false) {
5723 switch (GetParam()) {
5724 case RefreshType::kServer:
5725 CreatePool(max_sockets, max_sockets_per_group,
5726 enable_backup_connect_jobs);
5727 break;
5728 case RefreshType::kProxy:
5729 CreatePoolWithIdleTimeouts(
5730 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5731 ClientSocketPool::used_idle_socket_timeout(),
5732 enable_backup_connect_jobs,
Eric Orth5ccc3f02021-09-23 00:01:575733 PacResultElementToProxyServer("HTTPS myproxy:70"));
David Benjaminbac8dff2019-08-07 01:30:415734 break;
5735 }
5736 }
5737
5738 static ClientSocketPool::GroupId GetGroupId() {
Eric Ortha2e7773212021-06-22 21:49:555739 return TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415740 }
5741
David Benjamin6dd7e882019-10-10 02:35:235742 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5743 // Note this GroupId will match GetGroupId() unless
5744 // kPartitionConnectionsByNetworkIsolationKey is enabled.
Matt Menke4807a9a2020-11-21 00:14:415745 const SchemefulSite kSite(GURL("https://b/"));
Brianna Goldsteina7593fca2022-09-28 02:59:325746 const NetworkAnonymizationKey kNetworkAnonymizationKey(
5747 kSite, kSite, /*is_cross_site=*/false);
Eric Ortha2e7773212021-06-22 21:49:555748 return TestGroupId("a", 443, url::kHttpsScheme,
David Benjamin6dd7e882019-10-10 02:35:235749 PrivacyMode::PRIVACY_MODE_DISABLED,
Brianna Goldsteina7593fca2022-09-28 02:59:325750 kNetworkAnonymizationKey);
David Benjamin6dd7e882019-10-10 02:35:235751 }
5752
David Benjaminbac8dff2019-08-07 01:30:415753 void OnSSLConfigForServerChanged() {
5754 switch (GetParam()) {
5755 case RefreshType::kServer:
5756 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5757 break;
5758 case RefreshType::kProxy:
5759 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5760 break;
5761 }
5762 }
5763};
5764
5765INSTANTIATE_TEST_SUITE_P(RefreshType,
5766 ClientSocketPoolBaseRefreshTest,
5767 ::testing::Values(RefreshType::kServer,
5768 RefreshType::kProxy));
5769
5770TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5771 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5772 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245773
5774 // First job will be waiting until it gets aborted.
5775 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5776
5777 ClientSocketHandle handle;
5778 TestCompletionCallback callback;
5779 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525780 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285781 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5782 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5783 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245784 IsError(ERR_IO_PENDING));
5785
5786 // Switch connect job types, so creating a new ConnectJob will result in
5787 // success.
5788 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5789
David Benjaminbac8dff2019-08-07 01:30:415790 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245791 EXPECT_EQ(OK, callback.WaitForResult());
5792 ASSERT_TRUE(handle.socket());
5793 EXPECT_EQ(0, pool_->IdleSocketCount());
5794 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5795 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5796 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5797 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5798}
5799
David Benjaminbac8dff2019-08-07 01:30:415800TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235801 base::test::ScopedFeatureList feature_list;
5802 feature_list.InitAndEnableFeature(
5803 features::kPartitionConnectionsByNetworkIsolationKey);
5804
David Benjaminbac8dff2019-08-07 01:30:415805 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5806 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235807 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245808
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:215809 EXPECT_EQ(
5810 OK, pool_->RequestSockets(kGroupId, params_, absl::nullopt, 2,
5811 CompletionOnceCallback(), NetLogWithSource()));
5812
5813 EXPECT_EQ(
5814 OK, pool_->RequestSockets(kGroupIdInPartition, params_, absl::nullopt, 2,
5815 CompletionOnceCallback(), NetLogWithSource()));
Matt Menkebf3c767d2019-04-15 23:28:245816 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235817 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5818 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245819 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235820 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245821
David Benjaminbac8dff2019-08-07 01:30:415822 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245823 EXPECT_EQ(0, pool_->IdleSocketCount());
5824 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235825 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245826}
5827
5828TEST_F(ClientSocketPoolBaseTest,
5829 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5830 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415831 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555832 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415833 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555834 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245835
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:215836 EXPECT_EQ(
5837 OK, pool_->RequestSockets(kOtherGroupId, params_, absl::nullopt, 2,
5838 CompletionOnceCallback(), NetLogWithSource()));
Matt Menkebf3c767d2019-04-15 23:28:245839 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5840 EXPECT_EQ(2, pool_->IdleSocketCount());
5841 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5842
David Benjaminbac8dff2019-08-07 01:30:415843 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245844 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5845 EXPECT_EQ(2, pool_->IdleSocketCount());
5846 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5847}
5848
David Benjaminbac8dff2019-08-07 01:30:415849TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5850 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5851 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245852
5853 ClientSocketHandle handle;
5854 TestCompletionCallback callback;
5855 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525856 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285857 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5858 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5859 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245860 IsOk());
5861 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5862 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5863
David Benjaminbac8dff2019-08-07 01:30:415864 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245865
5866 handle.Reset();
5867 EXPECT_EQ(0, pool_->IdleSocketCount());
5868 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5869}
5870
5871TEST_F(ClientSocketPoolBaseTest,
5872 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5873 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415874 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555875 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415876 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555877 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245878
5879 ClientSocketHandle handle;
5880 TestCompletionCallback callback;
5881 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525882 handle.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285883 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5884 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5885 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245886 IsOk());
5887 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5888 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5889
David Benjaminbac8dff2019-08-07 01:30:415890 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245891
5892 handle.Reset();
5893 EXPECT_EQ(1, pool_->IdleSocketCount());
5894 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5895 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5896}
5897
David Benjaminbac8dff2019-08-07 01:30:415898TEST_P(ClientSocketPoolBaseRefreshTest,
5899 RefreshGroupReplacesBoundConnectJobOnConnect) {
5900 CreatePoolForRefresh(1, 1);
5901 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245902 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5903
5904 TestAuthHelper auth_helper;
5905 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5906 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5907 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5908
5909 auth_helper.WaitForAuth();
5910
5911 // This should update the generation, but not cancel the old ConnectJob - it's
5912 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415913 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245914
5915 // Providing auth credentials and restarting the request with them will cause
5916 // the ConnectJob to complete successfully, but the result will be discarded
5917 // because of the generation mismatch.
5918 auth_helper.RestartWithAuth();
5919
5920 // Despite using ConnectJobs that simulate a single challenge, a second
5921 // challenge will be seen, due to using a new ConnectJob.
5922 auth_helper.WaitForAuth();
5923 auth_helper.RestartWithAuth();
5924
5925 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5926 EXPECT_TRUE(auth_helper.handle()->socket());
5927 EXPECT_EQ(2, auth_helper.auth_count());
5928
5929 // When released, the socket will be returned to the socket pool, and
5930 // available for reuse.
5931 auth_helper.handle()->Reset();
5932 EXPECT_EQ(1, pool_->IdleSocketCount());
5933 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5934 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5935}
5936
David Benjaminbac8dff2019-08-07 01:30:415937TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5938 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5939 kUnusedIdleSocketTimeout,
5940 ClientSocketPool::used_idle_socket_timeout(),
5941 false /* no backup connect jobs */,
Eric Orth5ccc3f02021-09-23 00:01:575942 PacResultElementToProxyServer("HTTPS myproxy:70"));
David Benjaminbac8dff2019-08-07 01:30:415943
5944 const ClientSocketPool::GroupId kGroupId1 =
Eric Ortha2e7773212021-06-22 21:49:555945 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415946 const ClientSocketPool::GroupId kGroupId2 =
Eric Ortha2e7773212021-06-22 21:49:555947 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415948 const ClientSocketPool::GroupId kGroupId3 =
Eric Ortha2e7773212021-06-22 21:49:555949 TestGroupId("c", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415950
5951 // Make three sockets in three different groups. The third socket is released
5952 // to the pool as idle.
5953 ClientSocketHandle handle1, handle2, handle3;
5954 TestCompletionCallback callback;
5955 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525956 handle1.Init(kGroupId1, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415957 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5958 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5959 pool_.get(), NetLogWithSource()),
5960 IsOk());
5961 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525962 handle2.Init(kGroupId2, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415963 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5964 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5965 pool_.get(), NetLogWithSource()),
5966 IsOk());
5967 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525968 handle3.Init(kGroupId3, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415969 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5970 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5971 pool_.get(), NetLogWithSource()),
5972 IsOk());
5973 handle3.Reset();
5974 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5975 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5976 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5977 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5978 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5979 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5980
5981 // Changes to some other proxy do not affect the pool. The idle socket remains
5982 // alive and closing |handle2| makes the socket available for the pool.
5983 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5984
5985 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5986 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5987 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5988 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5989 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5990 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5991
5992 handle2.Reset();
5993 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5994 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5995
5996 // Changes to the matching proxy refreshes all groups.
5997 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5998
5999 // Idle sockets are closed.
6000 EXPECT_EQ(0, pool_->IdleSocketCount());
6001 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
6002 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
6003
6004 // The active socket, however, continues to be active.
6005 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
6006 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
6007
6008 // Closing it does not make it available for the pool.
6009 handle1.Reset();
6010 EXPECT_EQ(0, pool_->IdleSocketCount());
6011 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
6012}
6013
6014TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
6015 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
6016
Eric Ortha2e7773212021-06-22 21:49:556017 const ClientSocketPool::GroupId kGroupId = TestGroupId(
6018 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_DISABLED);
6019 const ClientSocketPool::GroupId kGroupIdPrivacy = TestGroupId(
6020 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_ENABLED);
David Benjaminbac8dff2019-08-07 01:30:416021 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:556022 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:416023
6024 // Make a socket in each groups.
6025 ClientSocketHandle handle1, handle2, handle3;
6026 TestCompletionCallback callback;
6027 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526028 handle1.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416029 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6030 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6031 pool_.get(), NetLogWithSource()),
6032 IsOk());
6033 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526034 handle2.Init(kGroupIdPrivacy, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416035 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6036 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6037 pool_.get(), NetLogWithSource()),
6038 IsOk());
6039 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526040 handle3.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416041 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6042 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6043 pool_.get(), NetLogWithSource()),
6044 IsOk());
6045 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
6046 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
6047 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6048 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
6049 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6050 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
6051
6052 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
6053
6054 // Active sockets continue to be active.
6055 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
6056 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
6057 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6058 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
6059 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6060 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
6061
6062 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
6063 // are unusable.
6064 handle1.Reset();
6065 handle2.Reset();
6066 handle3.Reset();
6067 EXPECT_EQ(1, pool_->IdleSocketCount());
6068 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
6069 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6070 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6071 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
6072}
6073
[email protected]f6d1d6eb2009-06-24 20:16:096074} // namespace
6075
6076} // namespace net