blob: 7edbdf8831fe38b7ea19aed9d3ac8a94c169c3f9 [file] [log] [blame]
[email protected]e34400c32012-01-24 02:49:331// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]f6d1d6eb2009-06-24 20:16:092// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
tbansalf82cc8e2015-10-14 20:05:495#include <stdint.h>
Daniel Cheng5feb16f2022-02-28 06:52:076
dchengc7eeda422015-12-26 03:56:487#include <utility>
[email protected]51fdc7c2012-04-10 19:19:488#include <vector>
9
[email protected]6ecf2b92011-12-15 01:14:5210#include "base/bind.h"
[email protected]2041cf342010-02-19 03:15:5911#include "base/callback.h"
danakjdb9ae7942020-11-11 16:01:3512#include "base/callback_helpers.h"
Hans Wennborg0924470b2020-04-27 21:08:0513#include "base/check_op.h"
skyostil4891b25b2015-06-11 11:43:4514#include "base/location.h"
Daniel Cheng5feb16f2022-02-28 06:52:0715#include "base/memory/raw_ptr.h"
[email protected]3b63f8f42011-03-28 01:54:1516#include "base/memory/ref_counted.h"
[email protected]6ea7b152011-12-21 21:21:1317#include "base/memory/weak_ptr.h"
Hans Wennborg0924470b2020-04-27 21:08:0518#include "base/notreached.h"
[email protected]034df0f32013-01-07 23:17:4819#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:5120#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1521#include "base/strings/stringprintf.h"
Patrick Monette643cdf62021-10-15 19:13:4222#include "base/task/single_thread_task_runner.h"
Matt Menke166443c2019-05-24 18:45:5923#include "base/test/scoped_feature_list.h"
[email protected]f214f8792011-01-01 02:17:0824#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3525#include "base/threading/thread_task_runner_handle.h"
Gabriel Charetted87f10f2022-03-31 00:44:2226#include "base/time/time.h"
[email protected]f3a1c642011-07-12 19:15:0327#include "base/values.h"
Matt Menke166443c2019-05-24 18:45:5928#include "net/base/features.h"
Eric Ortha2e7773212021-06-22 21:49:5529#include "net/base/host_port_pair.h"
[email protected]034df0f32013-01-07 23:17:4830#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5931#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0632#include "net/base/net_errors.h"
Matt Menke166443c2019-05-24 18:45:5933#include "net/base/network_isolation_key.h"
Matt Menkebdf777802019-04-22 19:38:5934#include "net/base/privacy_mode.h"
Matt Menkeaafff542019-04-22 22:09:3635#include "net/base/proxy_server.h"
Eric Orth5ccc3f02021-09-23 00:01:5736#include "net/base/proxy_string_util.h"
[email protected]ac790b42009-12-02 04:31:3137#include "net/base/request_priority.h"
Matt Menke4807a9a2020-11-21 00:14:4138#include "net/base/schemeful_site.h"
[email protected]f6d1d6eb2009-06-24 20:16:0939#include "net/base/test_completion_callback.h"
dalykedd30d982019-12-16 15:31:1040#include "net/dns/public/resolve_error_info.h"
Ben Schwartz3ff4dc1e62021-04-27 21:15:2341#include "net/dns/public/secure_dns_policy.h"
[email protected]277d5942010-08-11 21:02:3542#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5143#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0744#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0045#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1946#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0047#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5648#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4649#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0950#include "net/socket/client_socket_factory.h"
51#include "net/socket/client_socket_handle.h"
Eric Ortha9b8be02021-06-29 23:09:0852#include "net/socket/connect_job_factory.h"
tfarina5dd13c22016-11-16 12:08:2653#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2854#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5455#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1756#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4457#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1058#include "net/socket/stream_socket.h"
Daniel Cheng5feb16f2022-02-28 06:52:0759#include "net/socket/transport_client_socket_pool.h"
Matt Menke9fa17d52019-03-25 19:12:2660#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5161#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0162#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4063#include "net/test/test_with_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2864#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3865#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4866#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0967#include "testing/gtest/include/gtest/gtest.h"
Anton Bikineev068d2912021-05-15 20:43:5268#include "third_party/abseil-cpp/absl/types/optional.h"
Eric Ortha2e7773212021-06-22 21:49:5569#include "url/scheme_host_port.h"
70#include "url/url_constants.h"
[email protected]f6d1d6eb2009-06-24 20:16:0971
robpercival214763f2016-07-01 23:27:0172using net::test::IsError;
73using net::test::IsOk;
74
[email protected]51fdc7c2012-04-10 19:19:4875using ::testing::Invoke;
76using ::testing::Return;
77
[email protected]f6d1d6eb2009-06-24 20:16:0978namespace net {
79
80namespace {
81
[email protected]211d21722009-07-22 15:48:5382const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2083const int kDefaultMaxSocketsPerGroup = 2;
Peter Kastinge5a38ed2021-10-02 03:06:3584constexpr base::TimeDelta kUnusedIdleSocketTimeout = base::Seconds(10);
[email protected]0b7648c2009-07-06 20:14:0185
Matt Menkebdf777802019-04-22 19:38:5986ClientSocketPool::GroupId TestGroupId(
Eric Ortha2e7773212021-06-22 21:49:5587 base::StringPiece host,
Matt Menkebdf777802019-04-22 19:38:5988 int port = 80,
Eric Ortha2e7773212021-06-22 21:49:5589 base::StringPiece scheme = url::kHttpScheme,
Matt Menke166443c2019-05-24 18:45:5990 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
91 NetworkIsolationKey network_isolation_key = NetworkIsolationKey()) {
Eric Ortha2e7773212021-06-22 21:49:5592 return ClientSocketPool::GroupId(url::SchemeHostPort(scheme, host, port),
dalyk5f48a132019-10-14 15:20:1993 privacy_mode, network_isolation_key,
Ben Schwartz3ff4dc1e62021-04-27 21:15:2394 SecureDnsPolicy::kAllow);
Matt Menkec6b3edf72019-03-19 17:00:3995}
96
[email protected]034df0f32013-01-07 23:17:4897// Make sure |handle| sets load times correctly when it has been assigned a
98// reused socket.
99void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
100 LoadTimingInfo load_timing_info;
101 // Only pass true in as |is_reused|, as in general, HttpStream types should
102 // have stricter concepts of reuse than socket pools.
103 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
104
105 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19106 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48107
[email protected]b258e0792013-01-12 07:11:59108 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
109 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48110}
111
112// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33113// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48114// of a connection where |is_reused| is false may consider the connection
115// reused.
116void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
117 EXPECT_FALSE(handle.is_reused());
118
119 LoadTimingInfo load_timing_info;
120 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
121
122 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19123 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48124
[email protected]b258e0792013-01-12 07:11:59125 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
126 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
127 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48128
129 TestLoadTimingInfoConnectedReused(handle);
130}
131
132// Make sure |handle| sets load times correctly, in the case that it does not
133// currently have a socket.
134void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
135 // Should only be set to true once a socket is assigned, if at all.
136 EXPECT_FALSE(handle.is_reused());
137
138 LoadTimingInfo load_timing_info;
139 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
140
141 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19142 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48143
[email protected]b258e0792013-01-12 07:11:59144 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
145 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48146}
147
[email protected]3268023f2011-05-05 00:08:10148class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09149 public:
[email protected]034df0f32013-01-07 23:17:48150 explicit MockClientSocket(net::NetLog* net_log)
Tsuyoshi Horo2ec06e002022-06-09 01:38:59151 : net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)) {}
[email protected]f6d1d6eb2009-06-24 20:16:09152
Peter Boström407869b2021-10-07 04:42:48153 MockClientSocket(const MockClientSocket&) = delete;
154 MockClientSocket& operator=(const MockClientSocket&) = delete;
155
[email protected]0dc88b32014-03-26 20:12:28156 // Sets whether the socket has unread data. If true, the next call to Read()
157 // will return 1 byte and IsConnectedAndIdle() will return false.
158 void set_has_unread_data(bool has_unread_data) {
159 has_unread_data_ = has_unread_data;
160 }
161
[email protected]3f55aa12011-12-07 02:03:33162 // Socket implementation.
dchengb03027d2014-10-21 12:00:20163 int Read(IOBuffer* /* buf */,
164 int len,
Brad Lassey3a814172018-04-26 03:30:21165 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28166 if (has_unread_data_ && len > 0) {
167 has_unread_data_ = false;
168 was_used_to_convey_data_ = true;
169 return 1;
170 }
[email protected]e86df8dc2013-03-30 13:18:28171 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33172 }
[email protected]ab838892009-06-30 18:49:05173
[email protected]a2b2cfc2017-12-06 09:06:08174 int Write(
175 IOBuffer* /* buf */,
176 int len,
Brad Lassey3a814172018-04-26 03:30:21177 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08178 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01179 was_used_to_convey_data_ = true;
180 return len;
[email protected]ab838892009-06-30 18:49:05181 }
Avi Drissman13fc8932015-12-20 04:40:46182 int SetReceiveBufferSize(int32_t size) override { return OK; }
183 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05184
[email protected]dbf036f2011-12-06 23:33:24185 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21186 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24187 connected_ = true;
188 return OK;
189 }
[email protected]f6d1d6eb2009-06-24 20:16:09190
dchengb03027d2014-10-21 12:00:20191 void Disconnect() override { connected_ = false; }
192 bool IsConnected() const override { return connected_; }
193 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28194 return connected_ && !has_unread_data_;
195 }
[email protected]0b7648c2009-07-06 20:14:01196
dchengb03027d2014-10-21 12:00:20197 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16198 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09199 }
[email protected]f6d1d6eb2009-06-24 20:16:09200
dchengb03027d2014-10-21 12:00:20201 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35202 return ERR_UNEXPECTED;
203 }
204
tfarina428341112016-09-22 13:38:20205 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02206
dchengb03027d2014-10-21 12:00:20207 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37208 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20209 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
210 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
tbansalf82cc8e2015-10-14 20:05:49211 int64_t GetTotalReceivedBytes() const override {
212 NOTIMPLEMENTED();
213 return 0;
214 }
Paul Jensen0f49dec2017-12-12 23:39:58215 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45216
[email protected]f6d1d6eb2009-06-24 20:16:09217 private:
Tsuyoshi Horo2ec06e002022-06-09 01:38:59218 bool connected_ = false;
219 bool has_unread_data_ = false;
tfarina428341112016-09-22 13:38:20220 NetLogWithSource net_log_;
Tsuyoshi Horo2ec06e002022-06-09 01:38:59221 bool was_used_to_convey_data_ = false;
[email protected]f6d1d6eb2009-06-24 20:16:09222};
223
[email protected]5fc08e32009-07-15 17:09:57224class TestConnectJob;
225
[email protected]f6d1d6eb2009-06-24 20:16:09226class MockClientSocketFactory : public ClientSocketFactory {
227 public:
Tsuyoshi Horo2ec06e002022-06-09 01:38:59228 MockClientSocketFactory() = default;
[email protected]f6d1d6eb2009-06-24 20:16:09229
danakj655b66c2016-04-16 00:51:38230 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04231 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41232 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19233 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41234 NOTREACHED();
David Benjamin24725be2019-07-24 20:57:18235 return nullptr;
[email protected]98b0e582011-06-22 14:31:41236 }
237
Helen Lid5bb9222018-04-12 15:33:09238 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07239 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38240 std::unique_ptr<
241 SocketPerformanceWatcher> /* socket_performance_watcher */,
Eric Roman2bc77162020-09-16 18:30:45242 NetworkQualityEstimator* /* network_quality_estimator */,
[email protected]0a0b7682010-08-25 17:08:07243 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19244 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09245 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09246 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09247 }
248
danakj655b66c2016-04-16 00:51:38249 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
David Benjamin24725be2019-07-24 20:57:18250 SSLClientContext* context,
Matt Menke841fc412019-03-05 23:20:12251 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27252 const HostPortPair& host_and_port,
David Benjamin24725be2019-07-24 20:57:18253 const SSLConfig& ssl_config) override {
[email protected]f6d1d6eb2009-06-24 20:16:09254 NOTIMPLEMENTED();
David Benjamin24725be2019-07-24 20:57:18255 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09256 }
Matt Menkefd956922019-02-04 23:44:03257
[email protected]5fc08e32009-07-15 17:09:57258 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55259
[email protected]5fc08e32009-07-15 17:09:57260 void SignalJobs();
261
[email protected]03b7c8c2013-07-20 04:38:55262 void SignalJob(size_t job);
263
264 void SetJobLoadState(size_t job, LoadState load_state);
265
Matt Menke141b87f22019-01-30 02:43:03266 // Sets the HasConnectionEstablished value of the specified job to true,
267 // without invoking the callback.
268 void SetJobHasEstablishedConnection(size_t job);
269
[email protected]f6d1d6eb2009-06-24 20:16:09270 int allocation_count() const { return allocation_count_; }
271
[email protected]f6d1d6eb2009-06-24 20:16:09272 private:
Tsuyoshi Horo2ec06e002022-06-09 01:38:59273 int allocation_count_ = 0;
[email protected]5fc08e32009-07-15 17:09:57274 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09275};
276
[email protected]ab838892009-06-30 18:49:05277class TestConnectJob : public ConnectJob {
278 public:
279 enum JobType {
280 kMockJob,
281 kMockFailingJob,
282 kMockPendingJob,
283 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57284 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10285
286 // Certificate errors return a socket in addition to an error code.
287 kMockCertErrorJob,
288 kMockPendingCertErrorJob,
289
[email protected]e60e47a2010-07-14 03:37:18290 kMockAdditionalErrorStateJob,
291 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28292 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10293
294 kMockAuthChallengeOnceJob,
295 kMockAuthChallengeTwiceJob,
296 kMockAuthChallengeOnceFailingJob,
297 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05298 };
299
[email protected]994d4932010-07-12 17:55:13300 // The kMockPendingJob uses a slight delay before allowing the connect
301 // to complete.
302 static const int kPendingConnectDelay = 2;
303
[email protected]ab838892009-06-30 18:49:05304 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40305 RequestPriority request_priority,
306 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34307 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43308 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05309 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43310 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40311 : ConnectJob(request_priority,
312 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38313 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43314 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38315 delegate,
316 nullptr /* net_log */,
317 NetLogSourceType::TRANSPORT_CONNECT_JOB,
318 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58319 job_type_(job_type),
Tsuyoshi Horo2ec06e002022-06-09 01:38:59320 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05321
Peter Boström407869b2021-10-07 04:42:48322 TestConnectJob(const TestConnectJob&) = delete;
323 TestConnectJob& operator=(const TestConnectJob&) = delete;
324
[email protected]974ebd62009-08-03 23:14:34325 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13326 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34327 }
328
[email protected]03b7c8c2013-07-20 04:38:55329 void set_load_state(LoadState load_state) { load_state_ = load_state; }
330
Matt Menke141b87f22019-01-30 02:43:03331 void set_has_established_connection() {
332 DCHECK(!has_established_connection_);
333 has_established_connection_ = true;
334 }
335
[email protected]03b7c8c2013-07-20 04:38:55336 // From ConnectJob:
337
dchengb03027d2014-10-21 12:00:20338 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21339
Matt Menke141b87f22019-01-30 02:43:03340 bool HasEstablishedConnection() const override {
341 return has_established_connection_;
342 }
343
dalykedd30d982019-12-16 15:31:10344 ResolveErrorInfo GetResolveErrorInfo() const override {
345 return ResolveErrorInfo(OK);
346 }
347
Matt Menke6f84d1f12019-04-11 19:26:47348 bool IsSSLError() const override { return store_additional_error_state_; }
349
350 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
351 if (store_additional_error_state_)
352 return base::MakeRefCounted<SSLCertRequestInfo>();
353 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18354 }
355
[email protected]974ebd62009-08-03 23:14:34356 private:
[email protected]03b7c8c2013-07-20 04:38:55357 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05358
dchengb03027d2014-10-21 12:00:20359 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05360 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35361 client_socket_factory_->CreateTransportClientSocket(
Eric Roman2bc77162020-09-16 18:30:45362 ignored, nullptr, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05363 switch (job_type_) {
364 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13365 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10366 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05367 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13368 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10369 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05370 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57371 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47372
373 // Depending on execution timings, posting a delayed task can result
374 // in the task getting executed the at the earliest possible
375 // opportunity or only after returning once from the message loop and
376 // then a second call into the message loop. In order to make behavior
377 // more deterministic, we change the default delay to 2ms. This should
378 // always require us to wait for the second call into the message loop.
379 //
380 // N.B. The correct fix for this and similar timing problems is to
381 // abstract time for the purpose of unittests. Unfortunately, we have
382 // a lot of third-party components that directly call the various
383 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45384 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05385 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49386 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
387 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10388 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35389 base::Milliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05390 return ERR_IO_PENDING;
391 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57392 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45393 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05394 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49395 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
396 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10397 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35398 base::Milliseconds(2));
[email protected]ab838892009-06-30 18:49:05399 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57400 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55401 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57402 client_socket_factory_->WaitForSignal(this);
403 waiting_success_ = true;
404 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10405 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13406 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10407 true /* cert_error */);
408 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13409 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45410 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13411 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49412 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
413 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10414 true /* async */, true /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35415 base::Milliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13416 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18417 case kMockAdditionalErrorStateJob:
418 store_additional_error_state_ = true;
419 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10420 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18421 case kMockPendingAdditionalErrorStateJob:
422 set_load_state(LOAD_STATE_CONNECTING);
423 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45424 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18425 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49426 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
427 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10428 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35429 base::Milliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18430 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28431 case kMockUnreadDataJob: {
432 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10433 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28434 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
435 return ret;
436 }
Matt Menkeb57663b32019-03-01 17:17:10437 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01438 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10439 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
440 return ERR_IO_PENDING;
441 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01442 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10443 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
444 return ERR_IO_PENDING;
445 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01446 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10447 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
448 return ERR_IO_PENDING;
449 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01450 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10451 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
452 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05453 default:
454 NOTREACHED();
Anton Bikineev068d2912021-05-15 20:43:52455 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05456 return ERR_FAILED;
457 }
458 }
459
Lily Chen02ef29a2018-11-30 16:31:43460 void ChangePriorityInternal(RequestPriority priority) override {}
461
Matt Menkeb57663b32019-03-01 17:17:10462 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13463 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03464 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05465 if (succeed) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19466 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52467 absl::nullopt);
Bence Békybdbb0e72018-08-07 21:42:59468 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10469 } else if (cert_error) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19470 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52471 absl::nullopt);
Matt Menkeb57663b32019-03-01 17:17:10472 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40473 } else {
[email protected]e772db3f2010-07-12 18:11:13474 result = ERR_CONNECTION_FAILED;
Anton Bikineev068d2912021-05-15 20:43:52475 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05476 }
[email protected]2ab05b52009-07-01 23:57:58477
478 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30479 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05480 return result;
481 }
482
Matt Menkeb57663b32019-03-01 17:17:10483 void DoAdvanceAuthChallenge(int remaining_challenges,
484 bool succeed_after_last_challenge) {
485 base::ThreadTaskRunnerHandle::Get()->PostTask(
486 FROM_HERE,
487 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
488 weak_factory_.GetWeakPtr(), remaining_challenges,
489 succeed_after_last_challenge));
490 }
491
492 void InvokeNextProxyAuthCallback(int remaining_challenges,
493 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01494 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10495 if (remaining_challenges == 0) {
496 DoConnect(succeed_after_last_challenge, true /* was_async */,
497 false /* cert_error */);
498 return;
499 }
500
501 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
502 // The auth tests here are just focused on ConnectJob bookkeeping.
503 HttpResponseInfo info;
504 NotifyDelegateOfProxyAuth(
505 info, nullptr /* http_auth_controller */,
506 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
507 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
508 succeed_after_last_challenge));
509 }
510
[email protected]5fc08e32009-07-15 17:09:57511 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05512 const JobType job_type_;
Keishi Hattori0e45c022021-11-27 09:25:52513 const raw_ptr<MockClientSocketFactory> client_socket_factory_;
Tsuyoshi Horo2ec06e002022-06-09 01:38:59514 LoadState load_state_ = LOAD_STATE_IDLE;
515 bool has_established_connection_ = false;
516 bool store_additional_error_state_ = false;
[email protected]ab838892009-06-30 18:49:05517
Jeremy Romand54000b22019-07-08 18:40:16518 base::WeakPtrFactory<TestConnectJob> weak_factory_{this};
[email protected]ab838892009-06-30 18:49:05519};
520
Eric Ortha9b8be02021-06-29 23:09:08521class TestConnectJobFactory : public ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05522 public:
Eric Ortha9b8be02021-06-29 23:09:08523 explicit TestConnectJobFactory(MockClientSocketFactory* client_socket_factory)
524 : client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05525
Peter Boström293b1342021-09-22 17:31:43526 TestConnectJobFactory(const TestConnectJobFactory&) = delete;
527 TestConnectJobFactory& operator=(const TestConnectJobFactory&) = delete;
528
Chris Watkins7a41d3552017-12-01 02:13:27529 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05530
531 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
532
[email protected]51fdc7c2012-04-10 19:19:48533 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
534 job_types_ = job_types;
535 CHECK(!job_types_->empty());
536 }
537
[email protected]974ebd62009-08-03 23:14:34538 void set_timeout_duration(base::TimeDelta timeout_duration) {
539 timeout_duration_ = timeout_duration;
540 }
541
[email protected]3f55aa12011-12-07 02:03:33542 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55543
Eric Ortha9b8be02021-06-29 23:09:08544 std::unique_ptr<ConnectJob> CreateConnectJob(
Eric Orthc98a3e62021-07-02 17:46:37545 Endpoint endpoint,
Eric Ortha9b8be02021-06-29 23:09:08546 const ProxyServer& proxy_server,
Anton Bikineev068d2912021-05-15 20:43:52547 const absl::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Eric Ortha9b8be02021-06-29 23:09:08548 const SSLConfig* ssl_config_for_origin,
549 const SSLConfig* ssl_config_for_proxy,
550 bool force_tunnel,
551 PrivacyMode privacy_mode,
552 const OnHostResolutionCallback& resolution_callback,
Matt Menke16f5c2e52019-03-25 21:50:40553 RequestPriority request_priority,
554 SocketTag socket_tag,
Eric Ortha9b8be02021-06-29 23:09:08555 const NetworkIsolationKey& network_isolation_key,
556 SecureDnsPolicy secure_dns_policy,
557 const CommonConnectJobParams* common_connect_job_params,
mostynbba063d6032014-10-09 11:01:13558 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48559 EXPECT_TRUE(!job_types_ || !job_types_->empty());
560 TestConnectJob::JobType job_type = job_type_;
561 if (job_types_ && !job_types_->empty()) {
562 job_type = job_types_->front();
563 job_types_->pop_front();
564 }
Matt Menkea6f99ad2019-03-08 02:26:43565 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40566 job_type, request_priority, socket_tag, timeout_duration_,
Eric Ortha9b8be02021-06-29 23:09:08567 common_connect_job_params, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05568 }
569
570 private:
Eric Ortha9b8be02021-06-29 23:09:08571 TestConnectJob::JobType job_type_ = TestConnectJob::kMockJob;
Keishi Hattori0e45c022021-11-27 09:25:52572 raw_ptr<std::list<TestConnectJob::JobType>> job_types_ = nullptr;
[email protected]974ebd62009-08-03 23:14:34573 base::TimeDelta timeout_duration_;
Keishi Hattori0e45c022021-11-27 09:25:52574 const raw_ptr<MockClientSocketFactory> client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05575};
576
[email protected]a937a06d2009-08-19 21:19:24577} // namespace
578
[email protected]a937a06d2009-08-19 21:19:24579namespace {
580
[email protected]5fc08e32009-07-15 17:09:57581void MockClientSocketFactory::SignalJobs() {
Tsuyoshi Horo17ef47d02022-06-30 10:58:27582 for (auto* waiting_job : waiting_jobs_) {
583 waiting_job->Signal();
[email protected]5fc08e32009-07-15 17:09:57584 }
585 waiting_jobs_.clear();
586}
587
[email protected]03b7c8c2013-07-20 04:38:55588void MockClientSocketFactory::SignalJob(size_t job) {
589 ASSERT_LT(job, waiting_jobs_.size());
590 waiting_jobs_[job]->Signal();
591 waiting_jobs_.erase(waiting_jobs_.begin() + job);
592}
593
594void MockClientSocketFactory::SetJobLoadState(size_t job,
595 LoadState load_state) {
596 ASSERT_LT(job, waiting_jobs_.size());
597 waiting_jobs_[job]->set_load_state(load_state);
598}
599
Matt Menke141b87f22019-01-30 02:43:03600void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
601 ASSERT_LT(job, waiting_jobs_.size());
602 waiting_jobs_[job]->set_has_established_connection();
603}
604
Gabriel Charette694c3c332019-08-19 14:53:05605class ClientSocketPoolBaseTest : public TestWithTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09606 protected:
Alex Clarke0def2092018-12-10 12:01:45607 ClientSocketPoolBaseTest()
Gabriel Charette694c3c332019-08-19 14:53:05608 : TestWithTaskEnvironment(
609 base::test::TaskEnvironment::TimeSource::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03610 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54611 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40612 TransportClientSocketPool::connect_backup_jobs_enabled();
613 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54614 }
[email protected]2431756e2010-09-29 20:26:13615
dcheng67be2b1f2014-10-27 21:47:29616 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40617 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54618 connect_backup_jobs_enabled_);
619 }
[email protected]c9d6a1d2009-07-14 16:15:20620
Matt Menke9fa17d52019-03-25 19:12:26621 void CreatePool(int max_sockets,
622 int max_sockets_per_group,
623 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59624 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
625 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26626 ClientSocketPool::used_idle_socket_timeout(),
627 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16628 }
629
David Benjaminbac8dff2019-08-07 01:30:41630 void CreatePoolWithIdleTimeouts(
631 int max_sockets,
632 int max_sockets_per_group,
633 base::TimeDelta unused_idle_socket_timeout,
634 base::TimeDelta used_idle_socket_timeout,
635 bool enable_backup_connect_jobs = false,
636 ProxyServer proxy_server = ProxyServer::Direct()) {
[email protected]c9d6a1d2009-07-14 16:15:20637 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26638 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
Eric Ortha9b8be02021-06-29 23:09:08639 std::make_unique<TestConnectJobFactory>(&client_socket_factory_);
Matt Menke9fa17d52019-03-25 19:12:26640 connect_job_factory_ = connect_job_factory.get();
641 pool_ = TransportClientSocketPool::CreateForTesting(
642 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
Eric Ortha9b8be02021-06-29 23:09:08643 used_idle_socket_timeout, proxy_server, /*is_for_websockets=*/false,
644 &common_connect_job_params_, std::move(connect_job_factory),
Matt Menke9fa17d52019-03-25 19:12:26645 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20646 }
[email protected]f6d1d6eb2009-06-24 20:16:09647
mmenked3641e12016-01-28 16:06:15648 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39649 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33650 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15651 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39652 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15653 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33654 }
655
Matt Menkec6b3edf72019-03-19 17:00:39656 int StartRequest(const ClientSocketPool::GroupId& group_id,
657 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15658 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39659 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09660 }
661
[email protected]2431756e2010-09-29 20:26:13662 int GetOrderOfRequest(size_t index) const {
663 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09664 }
665
[email protected]2431756e2010-09-29 20:26:13666 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
667 return test_base_.ReleaseOneConnection(keep_alive);
668 }
669
670 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
671 test_base_.ReleaseAllConnections(keep_alive);
672 }
673
Matt Menke433de6d2020-03-04 00:24:11674 // Expects a single NetLogEventType::SOCKET_POOL_CLOSING_SOCKET in |net_log_|.
675 // It should be logged for the provided source and have the indicated reason.
676 void ExpectSocketClosedWithReason(NetLogSource expected_source,
677 const char* expected_reason) {
Matt Reichhoff0049a0b72021-10-20 20:44:26678 auto entries = net_log_observer_.GetEntriesForSourceWithType(
Matt Menke433de6d2020-03-04 00:24:11679 expected_source, NetLogEventType::SOCKET_POOL_CLOSING_SOCKET,
680 NetLogEventPhase::NONE);
681 ASSERT_EQ(1u, entries.size());
682 ASSERT_TRUE(entries[0].HasParams());
683 ASSERT_TRUE(entries[0].params.is_dict());
Matt Menkeca721da2022-06-01 04:47:29684 const std::string* reason =
685 entries[0].params.GetDict().FindString("reason");
Matt Menke433de6d2020-03-04 00:24:11686 ASSERT_TRUE(reason);
687 EXPECT_EQ(expected_reason, *reason);
688 }
689
[email protected]2431756e2010-09-29 20:26:13690 TestSocketRequest* request(int i) { return test_base_.request(i); }
691 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38692 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42693 return test_base_.requests();
694 }
rdsmith29dbad12017-02-17 02:22:18695 // Only counts the requests that get sockets asynchronously;
696 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13697 size_t completion_count() const { return test_base_.completion_count(); }
698
Eric Ortha9b8be02021-06-29 23:09:08699 const CommonConnectJobParams common_connect_job_params_{
700 nullptr /* client_socket_factory */,
701 nullptr /* host_resolver */,
702 nullptr /* http_auth_cache */,
703 nullptr /* http_auth_handler_factory */,
704 nullptr /* spdy_session_pool */,
705 nullptr /* quic_supported_versions */,
706 nullptr /* quic_stream_factory */,
707 nullptr /* proxy_delegate */,
708 nullptr /* http_user_agent_settings */,
709 nullptr /* ssl_client_context */,
710 nullptr /* socket_performance_watcher_factory */,
711 nullptr /* network_quality_estimator */,
Matt Reichhoff36a1fd62021-10-12 22:52:20712 NetLog::Get(),
Eric Ortha9b8be02021-06-29 23:09:08713 nullptr /* websocket_endpoint_lock_manager */};
[email protected]636b8252011-04-08 19:56:54714 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09715 MockClientSocketFactory client_socket_factory_;
Keishi Hattori0e45c022021-11-27 09:25:52716 raw_ptr<TestConnectJobFactory> connect_job_factory_;
Matt Reichhoff0049a0b72021-10-20 20:44:26717 RecordingNetLogObserver net_log_observer_;
Matt Menke9fa17d52019-03-25 19:12:26718 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19719 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26720 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13721 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09722};
723
[email protected]5fc08e32009-07-15 17:09:57724TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53725 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20726
[email protected]6ecf2b92011-12-15 01:14:52727 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06728 ClientSocketHandle handle;
Matt Reichhoff0049a0b72021-10-20 20:44:26729 NetLogWithSource net_log_with_source =
730 NetLogWithSource::Make(NetLogSourceType::NONE);
731
[email protected]034df0f32013-01-07 23:17:48732 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53733
Matt Menkef09e64c2019-04-23 22:16:28734 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:52735 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28736 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
737 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:26738 pool_.get(), net_log_with_source));
[email protected]f6d1d6eb2009-06-24 20:16:09739 EXPECT_TRUE(handle.is_initialized());
740 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48741 TestLoadTimingInfoConnectedNotReused(handle);
742
[email protected]f6d1d6eb2009-06-24 20:16:09743 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48744 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30745
Matt Reichhoff0049a0b72021-10-20 20:44:26746 auto entries =
747 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:40748
Matt Menke9fa17d52019-03-25 19:12:26749 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53750 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26751 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00752 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26753 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
754 EXPECT_TRUE(LogContainsEvent(
755 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
756 NetLogEventPhase::NONE));
757 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00758 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
759 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26760 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09761}
762
[email protected]ab838892009-06-30 18:49:05763TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53764 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20765
[email protected]ab838892009-06-30 18:49:05766 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Reichhoff0049a0b72021-10-20 20:44:26767 NetLogWithSource net_log_with_source =
768 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]9e743cd2010-03-16 07:03:53769
[email protected]2431756e2010-09-29 20:26:13770 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52771 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18772 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13773 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51774 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50775 EXPECT_EQ(
776 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:52777 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28778 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
779 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:26780 pool_.get(), net_log_with_source));
[email protected]2431756e2010-09-29 20:26:13781 EXPECT_FALSE(handle.socket());
782 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51783 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48784 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30785
Matt Reichhoff0049a0b72021-10-20 20:44:26786 auto entries =
787 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:40788
Matt Menke9fa17d52019-03-25 19:12:26789 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17790 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26791 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00792 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26793 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
794 EXPECT_TRUE(LogContainsEvent(
795 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
796 NetLogEventPhase::NONE));
797 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09798}
799
Matt Menke433de6d2020-03-04 00:24:11800// Test releasing an open socket into the socket pool, telling the socket pool
801// to close the socket.
802TEST_F(ClientSocketPoolBaseTest, ReleaseAndCloseConnection) {
803 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
804
805 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
806 ASSERT_TRUE(request(0)->handle()->socket());
807 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
808 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
809
810 EXPECT_EQ(0, pool_->IdleSocketCount());
811 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
812
813 ExpectSocketClosedWithReason(
814 source, TransportClientSocketPool::kClosedConnectionReturnedToPool);
815}
816
817TEST_F(ClientSocketPoolBaseTest, SocketWithUnreadDataReturnedToPool) {
818 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
819 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
820
821 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
822 ASSERT_TRUE(request(0)->handle()->socket());
823 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
824 EXPECT_TRUE(request(0)->handle()->socket()->IsConnected());
825 EXPECT_FALSE(request(0)->handle()->socket()->IsConnectedAndIdle());
826 ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE);
827
828 EXPECT_EQ(0, pool_->IdleSocketCount());
829 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
830
831 ExpectSocketClosedWithReason(
832 source, TransportClientSocketPool::kDataReceivedUnexpectedly);
833}
834
Matt Menkef6edce752019-03-19 17:21:56835// Make sure different groups do not share sockets.
836TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59837 base::test::ScopedFeatureList feature_list;
838 feature_list.InitAndEnableFeature(
839 features::kPartitionConnectionsByNetworkIsolationKey);
840
Matt Menkef6edce752019-03-19 17:21:56841 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
842
843 const HostPortPair kHostPortPairs[] = {
844 {"a", 80},
845 {"a", 443},
846 {"b", 80},
847 };
848
Eric Ortha2e7773212021-06-22 21:49:55849 const char* const kSchemes[] = {
850 url::kHttpScheme,
851 url::kHttpsScheme,
Matt Menkef6edce752019-03-19 17:21:56852 };
853
Matt Menkebdf777802019-04-22 19:38:59854 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
855 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56856
Matt Menke4807a9a2020-11-21 00:14:41857 const SchemefulSite kSiteA(GURL("http://a.test/"));
858 const SchemefulSite kSiteB(GURL("http://b.test/"));
Matt Menke166443c2019-05-24 18:45:59859 const NetworkIsolationKey kNetworkIsolationKeys[] = {
Matt Menke4807a9a2020-11-21 00:14:41860 NetworkIsolationKey(kSiteA, kSiteA),
861 NetworkIsolationKey(kSiteB, kSiteB),
Matt Menke166443c2019-05-24 18:45:59862 };
863
Ben Schwartz3ff4dc1e62021-04-27 21:15:23864 const SecureDnsPolicy kSecureDnsPolicys[] = {SecureDnsPolicy::kAllow,
865 SecureDnsPolicy::kDisable};
dalyk5f48a132019-10-14 15:20:19866
Matt Menkef6edce752019-03-19 17:21:56867 int total_idle_sockets = 0;
868
869 // Walk through each GroupId, making sure that requesting a socket for one
870 // group does not return a previously connected socket for another group.
871 for (const auto& host_port_pair : kHostPortPairs) {
872 SCOPED_TRACE(host_port_pair.ToString());
Eric Ortha2e7773212021-06-22 21:49:55873 for (const char* scheme : kSchemes) {
874 SCOPED_TRACE(scheme);
Matt Menkef6edce752019-03-19 17:21:56875 for (const auto& privacy_mode : kPrivacyModes) {
876 SCOPED_TRACE(privacy_mode);
Matt Menke166443c2019-05-24 18:45:59877 for (const auto& network_isolation_key : kNetworkIsolationKeys) {
Matt Menke11ffd532022-07-22 00:49:33878 SCOPED_TRACE(network_isolation_key.ToDebugString());
Ben Schwartz3ff4dc1e62021-04-27 21:15:23879 for (const auto& secure_dns_policy : kSecureDnsPolicys) {
880 SCOPED_TRACE(static_cast<int>(secure_dns_policy));
Matt Menkef6edce752019-03-19 17:21:56881
dalyk5f48a132019-10-14 15:20:19882 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56883
dalyk5f48a132019-10-14 15:20:19884 ClientSocketPool::GroupId group_id(
Eric Ortha2e7773212021-06-22 21:49:55885 url::SchemeHostPort(scheme, host_port_pair.host(),
886 host_port_pair.port()),
887 privacy_mode, network_isolation_key, secure_dns_policy);
Matt Menkef6edce752019-03-19 17:21:56888
dalyk5f48a132019-10-14 15:20:19889 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56890
dalyk5f48a132019-10-14 15:20:19891 TestCompletionCallback callback;
892 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56893
dalyk5f48a132019-10-14 15:20:19894 // Since the group is empty, requesting a socket should not complete
895 // synchronously.
Anton Bikineev068d2912021-05-15 20:43:52896 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19897 DEFAULT_PRIORITY, SocketTag(),
898 ClientSocketPool::RespectLimits::ENABLED,
899 callback.callback(),
900 ClientSocketPool::ProxyAuthCallback(),
901 pool_.get(), NetLogWithSource()),
902 IsError(ERR_IO_PENDING));
903 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
904 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56905
dalyk5f48a132019-10-14 15:20:19906 EXPECT_THAT(callback.WaitForResult(), IsOk());
907 EXPECT_TRUE(handle.socket());
908 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
909 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56910
dalyk5f48a132019-10-14 15:20:19911 // Return socket to pool.
912 handle.Reset();
913 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56914
dalyk5f48a132019-10-14 15:20:19915 // Requesting a socket again should return the same socket as
916 // before, so should complete synchronously.
Anton Bikineev068d2912021-05-15 20:43:52917 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19918 DEFAULT_PRIORITY, SocketTag(),
919 ClientSocketPool::RespectLimits::ENABLED,
920 callback.callback(),
921 ClientSocketPool::ProxyAuthCallback(),
922 pool_.get(), NetLogWithSource()),
923 IsOk());
924 EXPECT_TRUE(handle.socket());
925 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56926
dalyk5f48a132019-10-14 15:20:19927 // Return socket to pool again.
928 handle.Reset();
929 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56930
dalyk5f48a132019-10-14 15:20:19931 ++total_idle_sockets;
932 }
Matt Menke166443c2019-05-24 18:45:59933 }
Matt Menkef6edce752019-03-19 17:21:56934 }
935 }
936 }
937}
938
[email protected]211d21722009-07-22 15:48:53939TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
940 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
941
[email protected]9e743cd2010-03-16 07:03:53942 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30943
Matt Menkec6b3edf72019-03-19 17:00:39944 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
945 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
946 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
947 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53948
[email protected]2431756e2010-09-29 20:26:13949 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53950 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13951 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53952
Matt Menkec6b3edf72019-03-19 17:00:39953 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
954 IsError(ERR_IO_PENDING));
955 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
956 IsError(ERR_IO_PENDING));
957 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
958 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53959
[email protected]2431756e2010-09-29 20:26:13960 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53961
[email protected]2431756e2010-09-29 20:26:13962 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53963 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13964 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53965
966 EXPECT_EQ(1, GetOrderOfRequest(1));
967 EXPECT_EQ(2, GetOrderOfRequest(2));
968 EXPECT_EQ(3, GetOrderOfRequest(3));
969 EXPECT_EQ(4, GetOrderOfRequest(4));
970 EXPECT_EQ(5, GetOrderOfRequest(5));
971 EXPECT_EQ(6, GetOrderOfRequest(6));
972 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17973
974 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13975 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53976}
977
978TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
979 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
980
[email protected]9e743cd2010-03-16 07:03:53981 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30982
[email protected]211d21722009-07-22 15:48:53983 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39984 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
985 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
986 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
987 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53988
[email protected]2431756e2010-09-29 20:26:13989 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53990 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13991 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53992
993 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:39994 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
995 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53996
[email protected]2431756e2010-09-29 20:26:13997 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53998
[email protected]2431756e2010-09-29 20:26:13999 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531000 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131001 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531002
1003 EXPECT_EQ(1, GetOrderOfRequest(1));
1004 EXPECT_EQ(2, GetOrderOfRequest(2));
1005 EXPECT_EQ(3, GetOrderOfRequest(3));
1006 EXPECT_EQ(4, GetOrderOfRequest(4));
1007 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:171008
1009 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131010 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531011}
1012
1013TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
1014 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1015
Matt Menkec6b3edf72019-03-19 17:00:391016 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
1017 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
1018 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1019 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:531020
[email protected]2431756e2010-09-29 20:26:131021 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531022 client_socket_factory_.allocation_count());
1023
Matt Menkec6b3edf72019-03-19 17:00:391024 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
1025 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1026 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531027
[email protected]2431756e2010-09-29 20:26:131028 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531029
[email protected]2431756e2010-09-29 20:26:131030 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531031
1032 // First 4 requests don't have to wait, and finish in order.
1033 EXPECT_EQ(1, GetOrderOfRequest(1));
1034 EXPECT_EQ(2, GetOrderOfRequest(2));
1035 EXPECT_EQ(3, GetOrderOfRequest(3));
1036 EXPECT_EQ(4, GetOrderOfRequest(4));
1037
Matt Menkec6b3edf72019-03-19 17:00:391038 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1039 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531040 EXPECT_EQ(7, GetOrderOfRequest(5));
1041 EXPECT_EQ(6, GetOrderOfRequest(6));
1042 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171043
1044 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131045 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531046}
1047
rdsmith29dbad12017-02-17 02:22:181048// Test reprioritizing a request before completion doesn't interfere with
1049// its completion.
1050TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1051 CreatePool(kDefaultMaxSockets, 1);
1052
Matt Menkec6b3edf72019-03-19 17:00:391053 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1054 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181055 EXPECT_TRUE(request(0)->handle()->socket());
1056 EXPECT_FALSE(request(1)->handle()->socket());
1057
Lily Chenecebf932018-11-02 17:15:431058 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181059
1060 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1061
1062 EXPECT_TRUE(request(1)->handle()->socket());
1063}
1064
1065// Reprioritize a request up past another one and make sure that changes the
1066// completion order.
1067TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1068 CreatePool(kDefaultMaxSockets, 1);
1069
Matt Menkec6b3edf72019-03-19 17:00:391070 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1071 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1072 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181073 EXPECT_TRUE(request(0)->handle()->socket());
1074 EXPECT_FALSE(request(1)->handle()->socket());
1075 EXPECT_FALSE(request(2)->handle()->socket());
1076
1077 request(2)->handle()->SetPriority(HIGHEST);
1078
1079 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1080
1081 EXPECT_EQ(1, GetOrderOfRequest(1));
1082 EXPECT_EQ(3, GetOrderOfRequest(2));
1083 EXPECT_EQ(2, GetOrderOfRequest(3));
1084}
1085
1086// Reprioritize a request without changing relative priorities and check
1087// that the order doesn't change.
1088TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1089 CreatePool(kDefaultMaxSockets, 1);
1090
Matt Menkec6b3edf72019-03-19 17:00:391091 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1092 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1093 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181094 EXPECT_TRUE(request(0)->handle()->socket());
1095 EXPECT_FALSE(request(1)->handle()->socket());
1096 EXPECT_FALSE(request(2)->handle()->socket());
1097
1098 request(2)->handle()->SetPriority(MEDIUM);
1099
1100 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1101
1102 EXPECT_EQ(1, GetOrderOfRequest(1));
1103 EXPECT_EQ(2, GetOrderOfRequest(2));
1104 EXPECT_EQ(3, GetOrderOfRequest(3));
1105}
1106
1107// Reprioritize a request past down another one and make sure that changes the
1108// completion order.
1109TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1110 CreatePool(kDefaultMaxSockets, 1);
1111
Matt Menkec6b3edf72019-03-19 17:00:391112 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1113 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1114 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181115 EXPECT_TRUE(request(0)->handle()->socket());
1116 EXPECT_FALSE(request(1)->handle()->socket());
1117 EXPECT_FALSE(request(2)->handle()->socket());
1118
1119 request(1)->handle()->SetPriority(LOW);
1120
1121 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1122
1123 EXPECT_EQ(1, GetOrderOfRequest(1));
1124 EXPECT_EQ(3, GetOrderOfRequest(2));
1125 EXPECT_EQ(2, GetOrderOfRequest(3));
1126}
1127
1128// Reprioritize a request to the same level as another and confirm it is
1129// put after the old request.
1130TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1131 CreatePool(kDefaultMaxSockets, 1);
1132
Matt Menkec6b3edf72019-03-19 17:00:391133 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1134 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1135 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181136 EXPECT_TRUE(request(0)->handle()->socket());
1137 EXPECT_FALSE(request(1)->handle()->socket());
1138 EXPECT_FALSE(request(2)->handle()->socket());
1139
1140 request(1)->handle()->SetPriority(MEDIUM);
1141
1142 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1143
1144 EXPECT_EQ(1, GetOrderOfRequest(1));
1145 EXPECT_EQ(3, GetOrderOfRequest(2));
1146 EXPECT_EQ(2, GetOrderOfRequest(3));
1147}
1148
[email protected]211d21722009-07-22 15:48:531149TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1150 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1151
Matt Menkec6b3edf72019-03-19 17:00:391152 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1153 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1154 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1155 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531156
[email protected]2431756e2010-09-29 20:26:131157 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531158 client_socket_factory_.allocation_count());
1159
Matt Menkec6b3edf72019-03-19 17:00:391160 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1161 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1162 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531163
[email protected]2431756e2010-09-29 20:26:131164 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531165
[email protected]2431756e2010-09-29 20:26:131166 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531167 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131168 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531169
1170 // First 4 requests don't have to wait, and finish in order.
1171 EXPECT_EQ(1, GetOrderOfRequest(1));
1172 EXPECT_EQ(2, GetOrderOfRequest(2));
1173 EXPECT_EQ(3, GetOrderOfRequest(3));
1174 EXPECT_EQ(4, GetOrderOfRequest(4));
1175
1176 // Request ("b", 7) has the highest priority, but we can't make new socket for
1177 // group "b", because it has reached the per-group limit. Then we make
1178 // socket for ("c", 6), because it has higher priority than ("a", 4),
1179 // and we still can't make a socket for group "b".
1180 EXPECT_EQ(5, GetOrderOfRequest(5));
1181 EXPECT_EQ(6, GetOrderOfRequest(6));
1182 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171183
1184 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131185 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531186}
1187
1188// Make sure that we count connecting sockets against the total limit.
1189TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1190 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1191
Matt Menkec6b3edf72019-03-19 17:00:391192 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1193 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1194 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531195
1196 // Create one asynchronous request.
1197 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391198 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1199 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531200
[email protected]6b175382009-10-13 06:47:471201 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1202 // actually become pending until 2ms after they have been created. In order
1203 // to flush all tasks, we need to wait so that we know there are no
1204 // soon-to-be-pending tasks waiting.
Peter Kastinge5a38ed2021-10-02 03:06:351205 FastForwardBy(base::Milliseconds(10));
[email protected]6b175382009-10-13 06:47:471206
[email protected]211d21722009-07-22 15:48:531207 // The next synchronous request should wait for its turn.
1208 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391209 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1210 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531211
[email protected]2431756e2010-09-29 20:26:131212 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531213
[email protected]2431756e2010-09-29 20:26:131214 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531215 client_socket_factory_.allocation_count());
1216
1217 EXPECT_EQ(1, GetOrderOfRequest(1));
1218 EXPECT_EQ(2, GetOrderOfRequest(2));
1219 EXPECT_EQ(3, GetOrderOfRequest(3));
1220 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171221 EXPECT_EQ(5, GetOrderOfRequest(5));
1222
1223 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131224 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531225}
1226
[email protected]6427fe22010-04-16 22:27:411227TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1228 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1229 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1230
Matt Menkec6b3edf72019-03-19 17:00:391231 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1232 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1233 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1234 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411235
1236 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1237
1238 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1239
Matt Menkec6b3edf72019-03-19 17:00:391240 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1241 IsError(ERR_IO_PENDING));
1242 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1243 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411244
1245 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1246
[email protected]2431756e2010-09-29 20:26:131247 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411248 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131249 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411250 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131251 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1252 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411253 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1254}
1255
[email protected]d7027bb2010-05-10 18:58:541256TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1257 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1258 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1259
1260 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521261 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501262 EXPECT_EQ(
1263 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521264 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281265 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1266 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1267 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541268
1269 ClientSocketHandle handles[4];
Tsuyoshi Horo17ef47d02022-06-30 10:58:271270 for (auto& handle : handles) {
1271 EXPECT_EQ(
1272 ERR_IO_PENDING,
1273 handle.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
1274 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1275 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1276 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541277 }
1278
1279 // One will be stalled, cancel all the handles now.
1280 // This should hit the OnAvailableSocketSlot() code where we previously had
1281 // stalled groups, but no longer have any.
Tsuyoshi Horo17ef47d02022-06-30 10:58:271282 for (auto& handle : handles)
1283 handle.Reset();
[email protected]d7027bb2010-05-10 18:58:541284}
1285
[email protected]eb5a99382010-07-11 03:18:261286TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541287 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1288 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1289
[email protected]eb5a99382010-07-11 03:18:261290 {
1291 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521292 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261293 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Eric Ortha2e7773212021-06-22 21:49:551294 EXPECT_EQ(OK, handles[i].Init(TestGroupId("a" + base::NumberToString(i)),
1295 params_, absl::nullopt, DEFAULT_PRIORITY,
1296 SocketTag(),
1297 ClientSocketPool::RespectLimits::ENABLED,
1298 callbacks[i].callback(),
1299 ClientSocketPool::ProxyAuthCallback(),
1300 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261301 }
1302
1303 // Force a stalled group.
1304 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521305 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201306 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391307 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521308 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281309 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1310 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1311 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261312
1313 // Cancel the stalled request.
1314 stalled_handle.Reset();
1315
1316 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1317 EXPECT_EQ(0, pool_->IdleSocketCount());
1318
1319 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541320 }
1321
[email protected]43a21b82010-06-10 21:30:541322 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1323 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261324}
[email protected]43a21b82010-06-10 21:30:541325
[email protected]eb5a99382010-07-11 03:18:261326TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1327 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1328 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1329
1330 {
1331 ClientSocketHandle handles[kDefaultMaxSockets];
1332 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521333 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201334 EXPECT_EQ(ERR_IO_PENDING,
Eric Ortha2e7773212021-06-22 21:49:551335 handles[i].Init(
1336 TestGroupId("a" + base::NumberToString(i)), params_,
1337 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1338 ClientSocketPool::RespectLimits::ENABLED,
1339 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1340 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261341 }
1342
1343 // Force a stalled group.
1344 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1345 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521346 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201347 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391348 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521349 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281350 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1351 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1352 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261353
1354 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261355 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1356 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1357 TestGroupId("foo")));
1358 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1359 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261360
1361 // Cancel the stalled request.
1362 handles[0].Reset();
1363
[email protected]eb5a99382010-07-11 03:18:261364 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261365 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1366 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1367 TestGroupId("foo")));
1368 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1369 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261370
1371 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011372 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261373
1374 EXPECT_EQ(kDefaultMaxSockets + 1,
1375 client_socket_factory_.allocation_count());
1376 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261377 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1378 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1379 TestGroupId("foo")));
1380 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1381 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261382
1383 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541384 }
1385
[email protected]eb5a99382010-07-11 03:18:261386 EXPECT_EQ(1, pool_->IdleSocketCount());
1387}
[email protected]43a21b82010-06-10 21:30:541388
[email protected]eb5a99382010-07-11 03:18:261389TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1390 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1391 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541392
[email protected]eb5a99382010-07-11 03:18:261393 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521394 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261395 {
[email protected]51fdc7c2012-04-10 19:19:481396 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261397 ClientSocketHandle handles[kDefaultMaxSockets];
1398 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:391399 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281400 OK, handles[i].Init(
Eric Ortha2e7773212021-06-22 21:49:551401 TestGroupId(base::StringPrintf("take-2-%d", i)), params_,
Anton Bikineev068d2912021-05-15 20:43:521402 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:281403 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1404 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1405 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261406 }
1407
1408 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1409 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481410 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261411
1412 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201413 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391414 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521415 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281416 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1417 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1418 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481419 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261420
1421 // Dropping out of scope will close all handles and return them to idle.
1422 }
[email protected]43a21b82010-06-10 21:30:541423
1424 // But if we wait for it, the released idle sockets will be closed in
1425 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011426 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261427
1428 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1429 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541430}
1431
1432// Regression test for http://crbug.com/40952.
1433TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261434 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1435 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541436 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1437
1438 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1439 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521440 TestCompletionCallback callback;
Eric Ortha2e7773212021-06-22 21:49:551441 EXPECT_EQ(
1442 OK,
1443 handle.Init(TestGroupId("a" + base::NumberToString(i)), params_,
1444 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1445 ClientSocketPool::RespectLimits::ENABLED,
1446 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1447 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541448 }
1449
1450 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281451 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541452
1453 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1454 // reuse a socket.
1455 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1456 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521457 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541458
Eric Ortha2e7773212021-06-22 21:49:551459 // "a0" is special here, since it should be the first entry in the sorted map,
[email protected]43a21b82010-06-10 21:30:541460 // which is the one which we would close an idle socket for. We shouldn't
1461 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391462 EXPECT_EQ(OK, handle.Init(
Eric Ortha2e7773212021-06-22 21:49:551463 TestGroupId("a0"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281464 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391465 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1466 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541467
1468 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1469 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1470}
1471
[email protected]ab838892009-06-30 18:49:051472TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531473 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091474
Matt Menkec6b3edf72019-03-19 17:00:391475 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1476 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1477 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1478 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1479 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1480 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1481 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1482 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091483
[email protected]2431756e2010-09-29 20:26:131484 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201485 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1486 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131487 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1488 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091489
[email protected]c9d6a1d2009-07-14 16:15:201490 EXPECT_EQ(1, GetOrderOfRequest(1));
1491 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031492 EXPECT_EQ(8, GetOrderOfRequest(3));
1493 EXPECT_EQ(6, GetOrderOfRequest(4));
1494 EXPECT_EQ(4, GetOrderOfRequest(5));
1495 EXPECT_EQ(3, GetOrderOfRequest(6));
1496 EXPECT_EQ(5, GetOrderOfRequest(7));
1497 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171498
1499 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131500 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091501}
1502
[email protected]ab838892009-06-30 18:49:051503TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531504 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091505
Matt Menkec6b3edf72019-03-19 17:00:391506 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1507 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1508 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1509 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1510 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1511 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1512 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091513
[email protected]2431756e2010-09-29 20:26:131514 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091515
[email protected]2431756e2010-09-29 20:26:131516 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011517 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201518
[email protected]2431756e2010-09-29 20:26:131519 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201520 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131521 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1522 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091523}
1524
Matt Menke7eb405e2019-04-25 20:48:211525TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1526 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1527
1528 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1529 ClientSocketHandle handle;
1530 TestCompletionCallback callback;
1531 EXPECT_EQ(
1532 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521533 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke7eb405e2019-04-25 20:48:211534 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1535 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1536 pool_.get(), NetLogWithSource()));
1537
1538 EXPECT_THAT(callback.WaitForResult(), IsOk());
1539 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1540 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1541 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1542 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1543
1544 handle.ResetAndCloseSocket();
1545 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1546}
1547
Matt Menke99251ea42019-04-25 22:59:021548// This test will start up a socket request and then call Reset() on the handle.
1549// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211550TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531551 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201552
[email protected]ab838892009-06-30 18:49:051553 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131554 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521555 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501556 EXPECT_EQ(
1557 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521558 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281559 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1560 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1561 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131562 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211563 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1564 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1565}
1566
Matt Menke99251ea42019-04-25 22:59:021567// This test will start up a socket request and then call ResetAndCloseSocket()
1568// on the handle. The pending ConnectJob or connected socket should be
1569// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211570TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1571 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1572
Matt Menke99251ea42019-04-25 22:59:021573 // When true, the socket connects before it's canceled.
1574 for (bool cancel_when_callback_pending : {false, true}) {
1575 if (cancel_when_callback_pending) {
1576 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1577 } else {
1578 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1579 }
1580 ClientSocketHandle handle;
1581 TestCompletionCallback callback;
1582 EXPECT_EQ(
1583 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521584 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021585 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1586 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1587 pool_.get(), NetLogWithSource()));
1588 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1589 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1590
1591 if (cancel_when_callback_pending) {
1592 client_socket_factory_.SignalJobs();
1593 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1594 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1595 }
1596
1597 handle.ResetAndCloseSocket();
1598 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1599 }
Matt Menke7eb405e2019-04-25 20:48:211600}
1601
1602TEST_F(ClientSocketPoolBaseTest,
1603 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1604 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1605
Matt Menke99251ea42019-04-25 22:59:021606 // When true, the sockets connect before they're canceled.
1607 for (bool cancel_when_callback_pending : {false, true}) {
1608 if (cancel_when_callback_pending) {
1609 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1610 } else {
1611 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1612 }
Matt Menke7eb405e2019-04-25 20:48:211613
Matt Menke99251ea42019-04-25 22:59:021614 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1615 TestCompletionCallback callback;
1616 // Make |kDefaultMaxSockets + 1| socket requests.
1617 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1618 std::unique_ptr<ClientSocketHandle> handle =
1619 std::make_unique<ClientSocketHandle>();
1620 EXPECT_EQ(ERR_IO_PENDING,
1621 handle->Init(
Anton Bikineev068d2912021-05-15 20:43:521622 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021623 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1624 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1625 pool_.get(), NetLogWithSource()));
1626 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211627 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021628 EXPECT_EQ(
1629 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1630 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1631 }
1632
1633 if (cancel_when_callback_pending) {
1634 client_socket_factory_.SignalJobs();
1635 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1636 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1637 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1638 }
1639
1640 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1641 // or close a socket, since there are more requests than ConnectJobs or
1642 // sockets.
1643 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1644 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1645 if (cancel_when_callback_pending) {
1646 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1647 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1648 } else {
1649 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211650 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1651 }
Matt Menke99251ea42019-04-25 22:59:021652
1653 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1654 // or close a socket.
1655 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1656 handles[i]->ResetAndCloseSocket();
1657 if (i > 0) {
1658 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1659 if (cancel_when_callback_pending) {
1660 EXPECT_EQ(i,
1661 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1662 } else {
1663 EXPECT_EQ(static_cast<size_t>(i),
1664 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1665 }
1666 } else {
1667 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1668 }
1669 }
Matt Menke7eb405e2019-04-25 20:48:211670 }
[email protected]f6d1d6eb2009-06-24 20:16:091671}
1672
[email protected]ab838892009-06-30 18:49:051673TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531674 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201675
[email protected]ab838892009-06-30 18:49:051676 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061677 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521678 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091679
Matt Menke28ac03e2019-02-25 22:25:501680 EXPECT_EQ(
1681 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521682 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281683 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1684 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1685 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091686
1687 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211688 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1689 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091690
Matt Menke7eb405e2019-04-25 20:48:211691 // This will create a second ConnectJob, since the other ConnectJob was
1692 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521693 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501694 EXPECT_EQ(
1695 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521696 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281697 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501698 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1699 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091700
Matt Menke7eb405e2019-04-25 20:48:211701 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1702 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1703
robpercival214763f2016-07-01 23:27:011704 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091705 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211706 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1707 // One ConnectJob completed, and its socket is now assigned to |handle|.
1708 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1709 // The other ConnectJob should have either completed, or still be connecting.
1710 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1711 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091712
1713 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211714 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1715 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1716 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1717 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091718}
1719
[email protected]ab838892009-06-30 18:49:051720TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531721 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091722
Matt Menkec6b3edf72019-03-19 17:00:391723 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1724 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1725 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1726 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1727 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1728 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1729 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091730
1731 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201732 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131733 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1734 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091735
[email protected]2431756e2010-09-29 20:26:131736 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091737
[email protected]c9d6a1d2009-07-14 16:15:201738 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1739 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131740 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1741 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091742
[email protected]c9d6a1d2009-07-14 16:15:201743 EXPECT_EQ(1, GetOrderOfRequest(1));
1744 EXPECT_EQ(2, GetOrderOfRequest(2));
1745 EXPECT_EQ(5, GetOrderOfRequest(3));
1746 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131747 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1748 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201749 EXPECT_EQ(4, GetOrderOfRequest(6));
1750 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171751
1752 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131753 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091754}
1755
mmenke33d24423d2015-05-19 19:41:091756// Function to be used as a callback on socket request completion. It first
1757// disconnects the successfully connected socket from the first request, and
1758// then reuses the ClientSocketHandle to request another socket.
1759//
1760// |nested_callback| is called with the result of the second socket request.
1761void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261762 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091763 TestConnectJobFactory* test_connect_job_factory,
1764 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411765 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091766 int first_request_result) {
robpercival214763f2016-07-01 23:27:011767 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091768
1769 test_connect_job_factory->set_job_type(next_job_type);
1770
1771 // Don't allow reuse of the socket. Disconnect it and then release it.
1772 if (handle->socket())
1773 handle->socket()->Disconnect();
1774 handle->Reset();
1775
mmenke33d24423d2015-05-19 19:41:091776 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501777 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031778 TestGroupId("a"),
Anton Bikineev068d2912021-05-15 20:43:521779 ClientSocketPool::SocketParams::CreateForHttpForTesting(), absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:281780 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031781 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1782 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091783 if (rv != ERR_IO_PENDING) {
1784 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411785 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091786 } else {
1787 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521788 }
mmenke33d24423d2015-05-19 19:41:091789}
[email protected]f6d1d6eb2009-06-24 20:16:091790
mmenke33d24423d2015-05-19 19:41:091791// Tests the case where a second socket is requested in a completion callback,
1792// and the second socket connects asynchronously. Reuses the same
1793// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581794TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531795 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201796
[email protected]0b7648c2009-07-06 20:14:011797 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061798 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091799 TestCompletionCallback second_result_callback;
1800 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521801 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541802 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501803 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1804 connect_job_factory_, TestConnectJob::kMockPendingJob,
1805 &second_result_callback),
1806 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011807 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091808
robpercival214763f2016-07-01 23:27:011809 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581810}
[email protected]f6d1d6eb2009-06-24 20:16:091811
mmenke33d24423d2015-05-19 19:41:091812// Tests the case where a second socket is requested in a completion callback,
1813// and the second socket connects synchronously. Reuses the same
1814// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581815TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531816 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201817
[email protected]0b7648c2009-07-06 20:14:011818 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061819 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091820 TestCompletionCallback second_result_callback;
1821 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521822 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541823 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501824 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1825 connect_job_factory_, TestConnectJob::kMockPendingJob,
1826 &second_result_callback),
1827 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011828 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581829
robpercival214763f2016-07-01 23:27:011830 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091831}
1832
1833// Make sure that pending requests get serviced after active requests get
1834// cancelled.
[email protected]ab838892009-06-30 18:49:051835TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531836 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201837
[email protected]0b7648c2009-07-06 20:14:011838 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091839
Matt Menkec6b3edf72019-03-19 17:00:391840 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1841 IsError(ERR_IO_PENDING));
1842 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1843 IsError(ERR_IO_PENDING));
1844 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1845 IsError(ERR_IO_PENDING));
1846 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1847 IsError(ERR_IO_PENDING));
1848 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1849 IsError(ERR_IO_PENDING));
1850 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1851 IsError(ERR_IO_PENDING));
1852 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1853 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091854
[email protected]c9d6a1d2009-07-14 16:15:201855 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1856 // Let's cancel them.
1857 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131858 ASSERT_FALSE(request(i)->handle()->is_initialized());
1859 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091860 }
1861
[email protected]f6d1d6eb2009-06-24 20:16:091862 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131863 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011864 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131865 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091866 }
1867
[email protected]2431756e2010-09-29 20:26:131868 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1869 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091870}
1871
1872// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051873TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531874 const size_t kMaxSockets = 5;
1875 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201876
[email protected]0b7648c2009-07-06 20:14:011877 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091878
[email protected]211d21722009-07-22 15:48:531879 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1880 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091881
1882 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531883 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391884 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1885 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091886
[email protected]211d21722009-07-22 15:48:531887 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011888 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091889}
1890
mmenke9d72fe42017-05-18 22:36:071891// Make sure that pending requests that complete synchronously get serviced
1892// after active requests fail. See https://crbug.com/723748
1893TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1894 const size_t kNumberOfRequests = 10;
1895 const size_t kMaxSockets = 1;
1896 CreatePool(kMaxSockets, kMaxSockets);
1897
1898 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1899
Matt Menkec6b3edf72019-03-19 17:00:391900 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1901 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071902
1903 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1904
1905 // Queue up all the other requests
1906 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391907 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1908 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071909
1910 // Make sure all requests fail, instead of hanging.
1911 for (size_t i = 0; i < kNumberOfRequests; ++i)
1912 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1913}
1914
[email protected]5fc08e32009-07-15 17:09:571915TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531916 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571917
1918 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1919
[email protected]2431756e2010-09-29 20:26:131920 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521921 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501922 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521923 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501924 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1925 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011926 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571927
1928 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131929 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571930
Anton Bikineev068d2912021-05-15 20:43:521931 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281932 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501933 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1934 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011935 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1936 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571937
[email protected]2431756e2010-09-29 20:26:131938 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481939 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571940 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1941}
1942
xunjieli26619e72016-11-23 19:39:551943TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
Matt Menke433de6d2020-03-04 00:24:111944 const char kReason[] = "Really nifty reason";
1945
xunjieli26619e72016-11-23 19:39:551946 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1947 ClientSocketHandle handle;
1948 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261949 int rv =
1950 handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
1951 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1952 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1953 NetLogWithSource::Make(NetLogSourceType::NONE));
xunjieli26619e72016-11-23 19:39:551954 EXPECT_THAT(rv, IsOk());
Matt Menke433de6d2020-03-04 00:24:111955 ASSERT_TRUE(handle.socket());
1956 NetLogSource source = handle.socket()->NetLog().source();
xunjieli26619e72016-11-23 19:39:551957 handle.Reset();
1958 EXPECT_EQ(1, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111959 pool_->CloseIdleSockets(kReason);
1960 ExpectSocketClosedWithReason(source, kReason);
xunjieli26619e72016-11-23 19:39:551961}
1962
xunjieli92feb332017-03-03 17:19:231963TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231964 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1965 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261966 NetLogWithSource net_log_with_source =
1967 NetLogWithSource::Make(NetLogSourceType::NONE);
xunjieli92feb332017-03-03 17:19:231968 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501969 int rv = handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:521970 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501971 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261972 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231973 EXPECT_THAT(rv, IsOk());
1974 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:521975 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281976 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501977 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261978 pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231979 ClientSocketHandle handle3;
Anton Bikineev068d2912021-05-15 20:43:521980 rv = handle3.Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281981 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501982 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261983 pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231984 EXPECT_THAT(rv, IsOk());
1985 handle1.Reset();
1986 handle2.Reset();
1987 handle3.Reset();
1988 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111989 pool_->CloseIdleSocketsInGroup(TestGroupId("a"), "Very good reason");
xunjieli92feb332017-03-03 17:19:231990 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231991}
1992
xunjieli26619e72016-11-23 19:39:551993TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551994 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1995 ClientSocketHandle handle;
1996 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261997 NetLogWithSource net_log_with_source =
1998 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:501999 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522000 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502001 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262002 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
xunjieli26619e72016-11-23 19:39:552003 EXPECT_THAT(rv, IsOk());
2004 StreamSocket* socket = handle.socket();
Matt Menke433de6d2020-03-04 00:24:112005 ASSERT_TRUE(socket);
xunjieli26619e72016-11-23 19:39:552006 handle.Reset();
2007 EXPECT_EQ(1, pool_->IdleSocketCount());
2008
2009 // Disconnect socket now to make the socket unusable.
Matt Menke433de6d2020-03-04 00:24:112010 NetLogSource source = socket->NetLog().source();
xunjieli26619e72016-11-23 19:39:552011 socket->Disconnect();
2012 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:522013 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282014 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502015 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262016 pool_.get(), net_log_with_source);
xunjieli26619e72016-11-23 19:39:552017 EXPECT_THAT(rv, IsOk());
2018 EXPECT_FALSE(handle2.is_reused());
Matt Menke433de6d2020-03-04 00:24:112019
2020 // This is admittedly not an accurate error in this case, but normally code
2021 // doesn't secretly keep a raw pointers to sockets returned to the socket pool
2022 // and close them out of band, so discovering an idle socket was closed when
2023 // trying to reuse it normally means it was closed by the remote side.
2024 ExpectSocketClosedWithReason(
2025 source, TransportClientSocketPool::kRemoteSideClosedConnection);
xunjieli26619e72016-11-23 19:39:552026}
2027
[email protected]2b7523d2009-07-29 20:29:232028// Regression test for http://crbug.com/17985.
2029TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
2030 const int kMaxSockets = 3;
2031 const int kMaxSocketsPerGroup = 2;
2032 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
2033
[email protected]ac790b42009-12-02 04:31:312034 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:232035
Matt Menkec6b3edf72019-03-19 17:00:392036 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2037 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232038
2039 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:392040 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2041 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232042
2043 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:392044 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232045
2046 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:392047 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2048 IsError(ERR_IO_PENDING));
2049 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2050 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232051
Matt Menkec6b3edf72019-03-19 17:00:392052 // Release the first two sockets from TestGroupId("a"). Because this is a
2053 // keepalive, the first release will unblock the pending request for
2054 // TestGroupId("a"). The second release will unblock a request for "c",
2055 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:132056 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
2057 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:232058
2059 // Closing idle sockets should not get us into trouble, but in the bug
2060 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:392061 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke433de6d2020-03-04 00:24:112062 pool_->CloseIdleSockets("Very good reason");
[email protected]eb5a99382010-07-11 03:18:262063
[email protected]2da659e2013-05-23 20:51:342064 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282065 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232066}
2067
[email protected]4d3b05d2010-01-27 21:27:292068TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532069 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572070
2071 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132072 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522073 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262074 NetLogWithSource net_log_with_source =
2075 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502076 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522077 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502078 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262079 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012080 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392081 EXPECT_EQ(LOAD_STATE_CONNECTING,
2082 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482083 TestLoadTimingInfoNotConnected(handle);
2084
robpercival214763f2016-07-01 23:27:012085 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132086 EXPECT_TRUE(handle.is_initialized());
2087 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482088 TestLoadTimingInfoConnectedNotReused(handle);
2089
[email protected]2431756e2010-09-29 20:26:132090 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482091 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302092
Matt Reichhoff0049a0b72021-10-20 20:44:262093 auto entries =
2094 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:402095
Matt Menke9fa17d52019-03-25 19:12:262096 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172097 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262098 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002099 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262100 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2101 EXPECT_TRUE(LogContainsEvent(
2102 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2103 NetLogEventPhase::NONE));
2104 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002105 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2106 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262107 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572108}
2109
[email protected]4d3b05d2010-01-27 21:27:292110TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572111 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532112 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572113
2114 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132115 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522116 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262117 NetLogWithSource net_log_with_source =
2118 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]e60e47a2010-07-14 03:37:182119 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132120 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512121 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502122 EXPECT_EQ(
2123 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522124 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282125 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2126 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262127 pool_.get(), net_log_with_source));
Matt Menkec6b3edf72019-03-19 17:00:392128 EXPECT_EQ(LOAD_STATE_CONNECTING,
2129 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012130 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132131 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512132 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302133
Matt Reichhoff0049a0b72021-10-20 20:44:262134 auto entries =
2135 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:402136
Matt Menke9fa17d52019-03-25 19:12:262137 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172138 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262139 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002140 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262141 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2142 EXPECT_TRUE(LogContainsEvent(
2143 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2144 NetLogEventPhase::NONE));
2145 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572146}
2147
mmenke6be122f2015-03-09 22:22:472148// Check that an async ConnectJob failure does not result in creation of a new
2149// ConnectJob when there's another pending request also waiting on its own
2150// ConnectJob. See http://crbug.com/463960.
2151TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2152 CreatePool(2, 2);
2153 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2154
Matt Menkec6b3edf72019-03-19 17:00:392155 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2156 IsError(ERR_IO_PENDING));
2157 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2158 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472159
robpercival214763f2016-07-01 23:27:012160 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2161 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472162
2163 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2164}
2165
[email protected]4d3b05d2010-01-27 21:27:292166TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102167 // TODO(eroman): Add back the log expectations! Removed them because the
2168 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532169 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572170
2171 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132172 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522173 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132174 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522175 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572176
Matt Menke28ac03e2019-02-25 22:25:502177 EXPECT_EQ(
2178 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522179 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282180 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2181 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2182 pool_.get(), NetLogWithSource()));
Matt Reichhoff0049a0b72021-10-20 20:44:262183 RecordingNetLogObserver log2;
tfarina428341112016-09-22 13:38:202184 EXPECT_EQ(
2185 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522186 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282187 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502188 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2189 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572190
[email protected]2431756e2010-09-29 20:26:132191 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572192
[email protected]fd7b7c92009-08-20 19:38:302193
2194 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302195
robpercival214763f2016-07-01 23:27:012196 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132197 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302198
2199 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532200 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572201}
2202
[email protected]4d3b05d2010-01-27 21:27:292203TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342204 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2205
[email protected]17a0c6c2009-08-04 00:07:042206 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2207
Matt Menkec6b3edf72019-03-19 17:00:392208 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2209 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2210 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2211 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342212
Raul Tambre8335a6d2019-02-21 16:57:432213 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262214 static_cast<int>(
2215 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132216 (*requests())[2]->handle()->Reset();
2217 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432218 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262219 static_cast<int>(
2220 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342221
[email protected]2431756e2010-09-29 20:26:132222 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432223 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262224 static_cast<int>(
2225 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342226
[email protected]2431756e2010-09-29 20:26:132227 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432228 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262229 static_cast<int>(
2230 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342231}
2232
[email protected]5fc08e32009-07-15 17:09:572233// When requests and ConnectJobs are not coupled, the request will get serviced
2234// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292235TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532236 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572237
2238 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322239 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572240
[email protected]2431756e2010-09-29 20:26:132241 std::vector<TestSocketRequest*> request_order;
2242 size_t completion_count; // unused
2243 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502244 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522245 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502246 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2247 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012248 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2249 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572250
2251 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2252 // without a job.
2253 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2254
[email protected]2431756e2010-09-29 20:26:132255 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502256 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522257 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502258 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2259 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012260 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132261 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502262 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522263 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502264 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2265 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012266 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572267
2268 // Both Requests 2 and 3 are pending. We release socket 1 which should
2269 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332270 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342271 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282272 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332273 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012274 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332275 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572276
2277 // Signal job 2, which should service request 3.
2278
2279 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012280 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572281
Raul Tambre8335a6d2019-02-21 16:57:432282 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132283 EXPECT_EQ(&req1, request_order[0]);
2284 EXPECT_EQ(&req2, request_order[1]);
2285 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392286 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572287}
2288
2289// The requests are not coupled to the jobs. So, the requests should finish in
2290// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292291TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532292 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572293 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322294 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572295
[email protected]2431756e2010-09-29 20:26:132296 std::vector<TestSocketRequest*> request_order;
2297 size_t completion_count; // unused
2298 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502299 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522300 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502301 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2302 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012303 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572304
[email protected]2431756e2010-09-29 20:26:132305 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502306 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522307 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502308 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2309 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012310 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572311
2312 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322313 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572314
[email protected]2431756e2010-09-29 20:26:132315 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502316 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522317 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502318 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2319 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012320 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572321
robpercival214763f2016-07-01 23:27:012322 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2323 EXPECT_THAT(req2.WaitForResult(), IsOk());
2324 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572325
Raul Tambre8335a6d2019-02-21 16:57:432326 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132327 EXPECT_EQ(&req1, request_order[0]);
2328 EXPECT_EQ(&req2, request_order[1]);
2329 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572330}
2331
[email protected]03b7c8c2013-07-20 04:38:552332// Test GetLoadState in the case there's only one socket request.
2333TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532334 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552335 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572336
[email protected]2431756e2010-09-29 20:26:132337 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522338 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502339 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522340 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502341 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2342 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012343 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552344 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572345
[email protected]03b7c8c2013-07-20 04:38:552346 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2347 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2348
2349 // No point in completing the connection, since ClientSocketHandles only
2350 // expect the LoadState to be checked while connecting.
2351}
2352
2353// Test GetLoadState in the case there are two socket requests.
2354TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2355 CreatePool(2, 2);
2356 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2357
2358 ClientSocketHandle handle;
2359 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502360 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522361 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502362 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2363 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012364 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002365 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2366
2367 ClientSocketHandle handle2;
2368 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522369 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282370 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502371 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2372 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012373 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002374 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2375
Matt Menke4b69f932019-03-04 16:20:012376 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002377 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2378 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2379
Matt Menke4b69f932019-03-04 16:20:012380 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002381 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2382
Matt Menke4b69f932019-03-04 16:20:012383 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002384 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002385 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012386
2387 // Update the state of the second job.
2388 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2389
2390 // Only the state of the second request should have changed.
2391 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2392 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2393
2394 // Second job connects and the first request gets the socket. The
2395 // second handle switches to the state of the remaining ConnectJob.
2396 client_socket_factory_.SignalJob(1);
2397 EXPECT_THAT(callback.WaitForResult(), IsOk());
2398 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552399}
2400
2401// Test GetLoadState in the case the per-group limit is reached.
2402TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2403 CreatePool(2, 1);
2404 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2405
2406 ClientSocketHandle handle;
2407 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502408 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522409 TestGroupId("a"), params_, absl::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502410 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2411 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012412 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552413 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2414
2415 // Request another socket from the same pool, buth with a higher priority.
2416 // The first request should now be stalled at the socket group limit.
2417 ClientSocketHandle handle2;
2418 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522419 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:282420 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502421 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2422 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012423 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552424 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2425 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2426
2427 // The first handle should remain stalled as the other socket goes through
2428 // the connect process.
2429
2430 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2431 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2432 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2433
2434 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012435 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552436 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2437
2438 // Closing the second socket should cause the stalled handle to finally get a
2439 // ConnectJob.
2440 handle2.socket()->Disconnect();
2441 handle2.Reset();
2442 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2443}
2444
2445// Test GetLoadState in the case the per-pool limit is reached.
2446TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2447 CreatePool(2, 2);
2448 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2449
2450 ClientSocketHandle handle;
2451 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502452 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522453 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502454 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2455 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012456 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552457
2458 // Request for socket from another pool.
2459 ClientSocketHandle handle2;
2460 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522461 rv = handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282462 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502463 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2464 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012465 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552466
2467 // Request another socket from the first pool. Request should stall at the
2468 // socket pool limit.
2469 ClientSocketHandle handle3;
2470 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522471 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282472 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502473 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2474 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012475 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552476
2477 // The third handle should remain stalled as the other sockets in its group
2478 // goes through the connect process.
2479
2480 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2481 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2482
2483 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2484 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2485 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2486
2487 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012488 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552489 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2490
2491 // Closing a socket should allow the stalled handle to finally get a new
2492 // ConnectJob.
2493 handle.socket()->Disconnect();
2494 handle.Reset();
2495 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572496}
2497
Matt Menkeb57663b32019-03-01 17:17:102498TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132499 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102500 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132501
[email protected]2431756e2010-09-29 20:26:132502 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522503 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502504 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102505 ERR_CERT_COMMON_NAME_INVALID,
Anton Bikineev068d2912021-05-15 20:43:522506 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282507 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2508 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2509 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132510 EXPECT_TRUE(handle.is_initialized());
2511 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132512}
2513
Matt Menkeb57663b32019-03-01 17:17:102514TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132515 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2516
Matt Menkeb57663b32019-03-01 17:17:102517 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132518 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522519 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502520 EXPECT_EQ(
2521 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522522 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282523 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2524 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2525 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392526 EXPECT_EQ(LOAD_STATE_CONNECTING,
2527 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102528 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132529 EXPECT_TRUE(handle.is_initialized());
2530 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132531}
2532
[email protected]e60e47a2010-07-14 03:37:182533TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2534 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2535 connect_job_factory_->set_job_type(
2536 TestConnectJob::kMockAdditionalErrorStateJob);
2537
[email protected]2431756e2010-09-29 20:26:132538 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522539 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502540 EXPECT_EQ(
2541 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:522542 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282543 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2544 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2545 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132546 EXPECT_FALSE(handle.is_initialized());
2547 EXPECT_FALSE(handle.socket());
2548 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512549 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182550}
2551
2552TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2553 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2554
2555 connect_job_factory_->set_job_type(
2556 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132557 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522558 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502559 EXPECT_EQ(
2560 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522561 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282562 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2563 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2564 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392565 EXPECT_EQ(LOAD_STATE_CONNECTING,
2566 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012567 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132568 EXPECT_FALSE(handle.is_initialized());
2569 EXPECT_FALSE(handle.socket());
2570 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512571 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182572}
2573
martijn003cd612016-05-19 22:24:382574// Make sure we can reuse sockets.
2575TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412576 CreatePoolWithIdleTimeouts(
2577 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032578 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352579 base::Days(1)); // Don't time out used sockets.
[email protected]e7b1c6d2c2012-05-05 00:54:032580
2581 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2582
2583 ClientSocketHandle handle;
2584 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502585 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522586 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502587 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2588 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012589 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392590 EXPECT_EQ(LOAD_STATE_CONNECTING,
2591 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012592 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032593
2594 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352595 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382596 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482597 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032598 handle.Reset();
2599
2600 // Should now have one idle socket.
2601 ASSERT_EQ(1, pool_->IdleSocketCount());
2602
2603 // Request a new socket. This should reuse the old socket and complete
2604 // synchronously.
Matt Reichhoff0049a0b72021-10-20 20:44:262605 NetLogWithSource net_log_with_source =
2606 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502607 rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522608 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502609 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262610 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012611 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032612 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482613 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032614
Matt Menke9fa17d52019-03-25 19:12:262615 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392616 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262617 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032618
Matt Reichhoff0049a0b72021-10-20 20:44:262619 auto entries =
2620 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
Matt Menke9fa17d52019-03-25 19:12:262621 EXPECT_TRUE(LogContainsEvent(
2622 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2623 NetLogEventPhase::NONE));
2624 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032625 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262626 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032627}
2628
martijn003cd612016-05-19 22:24:382629// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172630TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032631 CreatePoolWithIdleTimeouts(
2632 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2633 base::TimeDelta(), // Time out unused sockets immediately
2634 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412635
2636 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2637
2638 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2639
2640 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522641 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502642 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522643 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502644 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2645 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012646 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392647 EXPECT_EQ(LOAD_STATE_CONNECTING,
2648 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412649
2650 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522651 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522652 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282653 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502654 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2655 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012656 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392657 EXPECT_EQ(LOAD_STATE_CONNECTING,
2658 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412659
2660 // Cancel one of the requests. Wait for the other, which will get the first
2661 // job. Release the socket. Run the loop again to make sure the second
2662 // socket is sitting idle and the first one is released (since ReleaseSocket()
2663 // just posts a DoReleaseSocket() task).
2664
2665 handle.Reset();
robpercival214763f2016-07-01 23:27:012666 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menke433de6d2020-03-04 00:24:112667 // Get the NetLogSource for the socket, so the time out reason can be checked
2668 // at the end of the test.
2669 NetLogSource net_log_source2 = handle2.socket()->NetLog().source();
[email protected]64770b7d2011-11-16 04:30:412670 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352671 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382672 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412673 handle2.Reset();
2674
[email protected]e7b1c6d2c2012-05-05 00:54:032675 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2676 // actually become pending until 2ms after they have been created. In order
2677 // to flush all tasks, we need to wait so that we know there are no
2678 // soon-to-be-pending tasks waiting.
Peter Kastinge5a38ed2021-10-02 03:06:352679 FastForwardBy(base::Milliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412680
[email protected]e7b1c6d2c2012-05-05 00:54:032681 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412682 ASSERT_EQ(2, pool_->IdleSocketCount());
2683
2684 // Request a new socket. This should cleanup the unused and timed out ones.
2685 // A new socket will be created rather than reusing the idle one.
Matt Reichhoff0049a0b72021-10-20 20:44:262686 NetLogWithSource net_log_with_source =
2687 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]6ecf2b92011-12-15 01:14:522688 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522689 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282690 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502691 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262692 pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012693 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2694 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412695 EXPECT_FALSE(handle.is_reused());
2696
[email protected]e7b1c6d2c2012-05-05 00:54:032697 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262698 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392699 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262700 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412701
Matt Reichhoff0049a0b72021-10-20 20:44:262702 auto entries =
2703 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]64770b7d2011-11-16 04:30:412704 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002705 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
Matt Menke433de6d2020-03-04 00:24:112706 ExpectSocketClosedWithReason(
2707 net_log_source2, TransportClientSocketPool::kIdleTimeLimitExpired);
[email protected]64770b7d2011-11-16 04:30:412708}
2709
[email protected]2041cf342010-02-19 03:15:592710// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162711// because of multiple releasing disconnected sockets.
2712TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2713 CreatePoolWithIdleTimeouts(
2714 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2715 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352716 base::Days(1)); // Don't time out used sockets.
[email protected]4f2abec2010-02-03 18:10:162717
2718 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2719
2720 // Startup 4 connect jobs. Two of them will be pending.
2721
[email protected]2431756e2010-09-29 20:26:132722 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522723 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502724 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522725 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502726 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2727 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012728 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162729
[email protected]2431756e2010-09-29 20:26:132730 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522731 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522732 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282733 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502734 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2735 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012736 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162737
[email protected]2431756e2010-09-29 20:26:132738 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522739 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522740 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282741 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502742 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2743 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012744 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162745
[email protected]2431756e2010-09-29 20:26:132746 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522747 TestCompletionCallback callback4;
Anton Bikineev068d2912021-05-15 20:43:522748 rv = handle4.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282749 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502750 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2751 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012752 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162753
2754 // Release two disconnected sockets.
2755
[email protected]2431756e2010-09-29 20:26:132756 handle.socket()->Disconnect();
2757 handle.Reset();
2758 handle2.socket()->Disconnect();
2759 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162760
robpercival214763f2016-07-01 23:27:012761 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132762 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012763 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132764 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162765}
2766
[email protected]d7027bb2010-05-10 18:58:542767// Regression test for http://crbug.com/42267.
2768// When DoReleaseSocket() is processed for one socket, it is blocked because the
2769// other stalled groups all have releasing sockets, so no progress can be made.
2770TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2771 CreatePoolWithIdleTimeouts(
2772 4 /* socket limit */, 4 /* socket limit per group */,
2773 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352774 base::Days(1)); // Don't time out used sockets.
[email protected]d7027bb2010-05-10 18:58:542775
2776 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2777
2778 // Max out the socket limit with 2 per group.
2779
[email protected]2431756e2010-09-29 20:26:132780 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522781 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132782 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522783 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542784
2785 for (int i = 0; i < 2; ++i) {
Anton Bikineev068d2912021-05-15 20:43:522786 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282787 LOWEST, SocketTag(),
2788 ClientSocketPool::RespectLimits::ENABLED,
2789 callback_a[i].callback(),
2790 ClientSocketPool::ProxyAuthCallback(),
2791 pool_.get(), NetLogWithSource()));
Anton Bikineev068d2912021-05-15 20:43:522792 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282793 LOWEST, SocketTag(),
2794 ClientSocketPool::RespectLimits::ENABLED,
2795 callback_b[i].callback(),
2796 ClientSocketPool::ProxyAuthCallback(),
2797 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542798 }
[email protected]b89f7e42010-05-20 20:37:002799
[email protected]d7027bb2010-05-10 18:58:542800 // Make 4 pending requests, 2 per group.
2801
2802 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282803 EXPECT_EQ(
2804 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522805 handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282806 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2807 callback_a[i].callback(),
2808 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2809 NetLogWithSource()));
2810 EXPECT_EQ(
2811 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522812 handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282813 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2814 callback_b[i].callback(),
2815 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2816 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542817 }
2818
2819 // Release b's socket first. The order is important, because in
2820 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2821 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2822 // first, which has a releasing socket, so it refuses to start up another
2823 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132824 handle_b[0].socket()->Disconnect();
2825 handle_b[0].Reset();
2826 handle_a[0].socket()->Disconnect();
2827 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542828
2829 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282830 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542831
[email protected]2431756e2010-09-29 20:26:132832 handle_b[1].socket()->Disconnect();
2833 handle_b[1].Reset();
2834 handle_a[1].socket()->Disconnect();
2835 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542836
2837 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012838 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2839 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542840 }
2841}
2842
[email protected]fd4fe0b2010-02-08 23:02:152843TEST_F(ClientSocketPoolBaseTest,
2844 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2845 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2846
2847 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2848
Matt Menkec6b3edf72019-03-19 17:00:392849 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2850 IsError(ERR_IO_PENDING));
2851 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2852 IsError(ERR_IO_PENDING));
2853 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2854 IsError(ERR_IO_PENDING));
2855 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2856 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152857
robpercival214763f2016-07-01 23:27:012858 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2859 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132860 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152861
2862 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132863 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012864 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152865
[email protected]2431756e2010-09-29 20:26:132866 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012867 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132868 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152869
2870 EXPECT_EQ(1, GetOrderOfRequest(1));
2871 EXPECT_EQ(2, GetOrderOfRequest(2));
2872 EXPECT_EQ(3, GetOrderOfRequest(3));
2873 EXPECT_EQ(4, GetOrderOfRequest(4));
2874
2875 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132876 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152877}
2878
[email protected]6ecf2b92011-12-15 01:14:522879class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042880 public:
Matt Menke9fa17d52019-03-25 19:12:262881 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132882 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182883 bool reset_releasing_handle)
2884 : pool_(pool),
2885 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042886 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522887
Chris Watkins7a41d3552017-12-01 02:13:272888 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042889
2890 ClientSocketHandle* handle() { return &handle_; }
2891
Bence Béky8ddc2492018-06-13 01:02:042892 CompletionOnceCallback callback() {
2893 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2894 base::Unretained(this));
2895 }
[email protected]4f1e4982010-03-02 18:31:042896
2897 private:
[email protected]6ecf2b92011-12-15 01:14:522898 void OnComplete(int result) {
2899 SetResult(result);
2900 if (reset_releasing_handle_)
2901 handle_.Reset();
2902
Matt Menkec6b3edf72019-03-19 17:00:392903 EXPECT_EQ(
2904 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032905 handle2_.Init(
2906 TestGroupId("a"),
2907 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:522908 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032909 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2910 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522911 }
2912
Keishi Hattori0e45c022021-11-27 09:25:522913 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]e60e47a2010-07-14 03:37:182914 int expected_result_;
2915 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042916 ClientSocketHandle handle_;
2917 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042918};
2919
[email protected]e60e47a2010-07-14 03:37:182920
2921TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2922 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2923
Matt Menkec6b3edf72019-03-19 17:00:392924 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2925 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2926 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182927
[email protected]2431756e2010-09-29 20:26:132928 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182929 client_socket_factory_.allocation_count());
2930
2931 connect_job_factory_->set_job_type(
2932 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2933 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282934 EXPECT_EQ(ERR_IO_PENDING,
2935 req.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522936 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282937 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2938 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2939 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182940 // The next job should complete synchronously
2941 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2942
robpercival214763f2016-07-01 23:27:012943 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182944 EXPECT_FALSE(req.handle()->is_initialized());
2945 EXPECT_FALSE(req.handle()->socket());
2946 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512947 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182948}
2949
[email protected]b6501d3d2010-06-03 23:53:342950// http://crbug.com/44724 regression test.
2951// We start releasing the pool when we flush on network change. When that
2952// happens, the only active references are in the ClientSocketHandles. When a
2953// ConnectJob completes and calls back into the last ClientSocketHandle, that
2954// callback can release the last reference and delete the pool. After the
2955// callback finishes, we go back to the stack frame within the now-deleted pool.
2956// Executing any code that refers to members of the now-deleted pool can cause
2957// crashes.
2958TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2959 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2960 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2961
2962 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522963 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502964 EXPECT_EQ(
2965 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522966 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282967 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2968 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2969 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342970
Matt Menke433de6d2020-03-04 00:24:112971 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]b6501d3d2010-06-03 23:53:342972
2973 // We'll call back into this now.
2974 callback.WaitForResult();
2975}
2976
[email protected]a7e38572010-06-07 18:22:242977TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2978 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2979 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2980
2981 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522982 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502983 EXPECT_EQ(
2984 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522985 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282986 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2987 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2988 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012989 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242990 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:112991 NetLogSource source = handle.socket()->NetLog().source();
[email protected]a7e38572010-06-07 18:22:242992
Matt Menke433de6d2020-03-04 00:24:112993 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]a7e38572010-06-07 18:22:242994
2995 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282996 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242997
Matt Menke28ac03e2019-02-25 22:25:502998 EXPECT_EQ(
2999 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523000 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283001 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3002 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3003 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013004 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243005 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113006
3007 ExpectSocketClosedWithReason(
3008 source, TransportClientSocketPool::kSocketGenerationOutOfDate);
[email protected]a7e38572010-06-07 18:22:243009}
3010
[email protected]6ecf2b92011-12-15 01:14:523011class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:143012 public:
Matt Menke9fa17d52019-03-25 19:12:263013 ConnectWithinCallback(
3014 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:193015 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:263016 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:393017 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:143018
Peter Boström293b1342021-09-22 17:31:433019 ConnectWithinCallback(const ConnectWithinCallback&) = delete;
3020 ConnectWithinCallback& operator=(const ConnectWithinCallback&) = delete;
3021
Chris Watkins7a41d3552017-12-01 02:13:273022 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:143023
3024 int WaitForNestedResult() {
3025 return nested_callback_.WaitForResult();
3026 }
3027
Bence Béky8ddc2492018-06-13 01:02:043028 CompletionOnceCallback callback() {
3029 return base::BindOnce(&ConnectWithinCallback::OnComplete,
3030 base::Unretained(this));
3031 }
[email protected]6ecf2b92011-12-15 01:14:523032
[email protected]06f92462010-08-31 19:24:143033 private:
[email protected]6ecf2b92011-12-15 01:14:523034 void OnComplete(int result) {
3035 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:283036 EXPECT_EQ(
3037 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523038 handle_.Init(group_id_, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283039 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3040 nested_callback_.callback(),
3041 ClientSocketPool::ProxyAuthCallback(), pool_,
3042 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:523043 }
3044
Matt Menkec6b3edf72019-03-19 17:00:393045 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:193046 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Keishi Hattori0e45c022021-11-27 09:25:523047 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]06f92462010-08-31 19:24:143048 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:523049 TestCompletionCallback nested_callback_;
[email protected]06f92462010-08-31 19:24:143050};
3051
3052TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
3053 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3054
3055 // First job will be waiting until it gets aborted.
3056 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3057
3058 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:393059 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:503060 EXPECT_EQ(
3061 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523062 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283063 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3064 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3065 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:143066
3067 // Second job will be started during the first callback, and will
3068 // asynchronously complete with OK.
3069 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menke433de6d2020-03-04 00:24:113070 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
robpercival214763f2016-07-01 23:27:013071 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
3072 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:143073}
3074
Matt Menke141b87f22019-01-30 02:43:033075TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:263076 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3077 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033078
3079 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3080 ClientSocketHandle handle;
3081 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503082 EXPECT_EQ(
3083 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523084 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283085 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3086 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3087 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033088 // The backup timer fires but doesn't start a new ConnectJob while resolving
3089 // the hostname.
3090 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
Peter Kastinge5a38ed2021-10-02 03:06:353091 FastForwardBy(
3092 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033093 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3094
3095 // Once the ConnectJob has finished resolving the hostname, the backup timer
3096 // will create a ConnectJob when it fires.
3097 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
Peter Kastinge5a38ed2021-10-02 03:06:353098 FastForwardBy(
3099 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs));
Matt Menke141b87f22019-01-30 02:43:033100 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3101}
3102
3103// Test that no backup socket is created when a ConnectJob connects before it
3104// completes.
3105TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263106 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3107 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033108
3109 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3110 ClientSocketHandle handle;
3111 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503112 EXPECT_EQ(
3113 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523114 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283115 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3116 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3117 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033118 // The backup timer fires but doesn't start a new ConnectJob while resolving
3119 // the hostname.
3120 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
Peter Kastinge5a38ed2021-10-02 03:06:353121 FastForwardBy(
3122 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033123 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3124
3125 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3126 client_socket_factory_.SetJobHasEstablishedConnection(0);
Peter Kastinge5a38ed2021-10-02 03:06:353127 FastForwardBy(
3128 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033129 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3130}
3131
[email protected]25eea382010-07-10 23:55:263132// Cancel a pending socket request while we're at max sockets,
3133// and verify that the backup socket firing doesn't cause a crash.
3134TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3135 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263136 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3137 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263138
[email protected]4baaf9d2010-08-31 15:15:443139 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3140 // timer.
[email protected]25eea382010-07-10 23:55:263141 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3142 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523143 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503144 EXPECT_EQ(
3145 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523146 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283147 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3148 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3149 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263150
3151 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3152 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3153 ClientSocketHandle handles[kDefaultMaxSockets];
3154 for (int i = 1; i < kDefaultMaxSockets; ++i) {
Anton Bikineev068d2912021-05-15 20:43:523155 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283156 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203157 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503158 callback.callback(),
3159 ClientSocketPool::ProxyAuthCallback(),
3160 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263161 }
3162
fdoray5eeb7642016-06-22 16:11:283163 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263164
3165 // Cancel the pending request.
3166 handle.Reset();
3167
3168 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353169 FastForwardBy(
3170 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263171
[email protected]25eea382010-07-10 23:55:263172 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3173}
3174
[email protected]3f00be82010-09-27 19:50:023175TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263176 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3177 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443178
3179 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3180 // timer.
3181 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3182 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523183 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503184 EXPECT_EQ(
3185 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523186 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283187 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3188 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3189 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263190 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3191 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3192 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3193 TestGroupId("bar")));
3194 EXPECT_EQ(
3195 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443196
3197 // Cancel the socket request. This should cancel the backup timer. Wait for
3198 // the backup time to see if it indeed got canceled.
3199 handle.Reset();
3200 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353201 FastForwardBy(
3202 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263203 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3204 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443205}
3206
[email protected]3f00be82010-09-27 19:50:023207TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263208 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3209 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023210
3211 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3212 // timer.
3213 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3214 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523215 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503216 EXPECT_EQ(
3217 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523218 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283219 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3220 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3221 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023222 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3223 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523224 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203225 EXPECT_EQ(
3226 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523227 handle2.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283228 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503229 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3230 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263231 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3232 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023233
3234 // Cancel request 1 and then complete request 2. With the requests finished,
3235 // the backup timer should be cancelled.
3236 handle.Reset();
robpercival214763f2016-07-01 23:27:013237 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023238 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353239 FastForwardBy(
3240 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023241}
3242
[email protected]eb5a99382010-07-11 03:18:263243// Test delayed socket binding for the case where we have two connects,
3244// and while one is waiting on a connect, the other frees up.
3245// The socket waiting on a connect should switch immediately to the freed
3246// up socket.
3247TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3248 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3249 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3250
3251 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523252 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503253 EXPECT_EQ(
3254 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523255 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283256 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503257 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3258 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013259 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263260
3261 // No idle sockets, no pending jobs.
3262 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263263 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263264
3265 // Create a second socket to the same host, but this one will wait.
3266 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3267 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503268 EXPECT_EQ(
3269 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523270 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283271 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503272 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3273 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263274 // No idle sockets, and one connecting job.
3275 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263276 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263277
3278 // Return the first handle to the pool. This will initiate the delayed
3279 // binding.
3280 handle1.Reset();
3281
fdoray5eeb7642016-06-22 16:11:283282 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263283
3284 // Still no idle sockets, still one pending connect job.
3285 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263286 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263287
3288 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013289 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263290
3291 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263292 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263293
3294 // Finally, signal the waiting Connect.
3295 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263296 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263297
fdoray5eeb7642016-06-22 16:11:283298 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263299}
3300
3301// Test delayed socket binding when a group is at capacity and one
3302// of the group's sockets frees up.
3303TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3304 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3305 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3306
3307 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523308 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503309 EXPECT_EQ(
3310 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523311 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283312 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503313 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3314 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013315 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263316
3317 // No idle sockets, no pending jobs.
3318 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263319 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263320
3321 // Create a second socket to the same host, but this one will wait.
3322 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3323 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503324 EXPECT_EQ(
3325 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523326 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283327 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503328 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3329 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263330 // No idle sockets, and one connecting job.
3331 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263332 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263333
3334 // Return the first handle to the pool. This will initiate the delayed
3335 // binding.
3336 handle1.Reset();
3337
fdoray5eeb7642016-06-22 16:11:283338 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263339
3340 // Still no idle sockets, still one pending connect job.
3341 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263342 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263343
3344 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013345 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263346
3347 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263348 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263349
3350 // Finally, signal the waiting Connect.
3351 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263352 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263353
fdoray5eeb7642016-06-22 16:11:283354 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263355}
3356
3357// Test out the case where we have one socket connected, one
3358// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513359// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263360// should complete, by taking the first socket's idle socket.
3361TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3362 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3363 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3364
3365 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523366 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503367 EXPECT_EQ(
3368 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523369 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283370 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503371 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3372 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013373 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263374
3375 // No idle sockets, no pending jobs.
3376 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263377 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263378
3379 // Create a second socket to the same host, but this one will wait.
3380 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3381 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503382 EXPECT_EQ(
3383 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523384 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283385 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503386 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3387 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263388 // No idle sockets, and one connecting job.
3389 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263390 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263391
3392 // Return the first handle to the pool. This will initiate the delayed
3393 // binding.
3394 handle1.Reset();
3395
fdoray5eeb7642016-06-22 16:11:283396 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263397
3398 // Still no idle sockets, still one pending connect job.
3399 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263400 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263401
3402 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013403 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263404
3405 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263406 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263407
3408 // Finally, signal the waiting Connect.
3409 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263410 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263411
fdoray5eeb7642016-06-22 16:11:283412 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263413}
3414
[email protected]2abfe90a2010-08-25 17:49:513415// Cover the case where on an available socket slot, we have one pending
3416// request that completes synchronously, thereby making the Group empty.
3417TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3418 const int kUnlimitedSockets = 100;
3419 const int kOneSocketPerGroup = 1;
3420 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3421
3422 // Make the first request asynchronous fail.
3423 // This will free up a socket slot later.
3424 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3425
3426 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523427 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203428 EXPECT_EQ(
3429 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523430 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283431 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503432 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3433 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263434 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513435
3436 // Make the second request synchronously fail. This should make the Group
3437 // empty.
3438 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3439 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523440 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513441 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3442 // when created.
tfarina428341112016-09-22 13:38:203443 EXPECT_EQ(
3444 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523445 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283446 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503447 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3448 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513449
Matt Menke9fa17d52019-03-25 19:12:263450 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513451
robpercival214763f2016-07-01 23:27:013452 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3453 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263454 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513455}
3456
[email protected]e1b54dc2010-10-06 21:27:223457TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3458 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3459
3460 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3461
3462 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523463 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203464 EXPECT_EQ(
3465 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523466 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283467 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503468 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3469 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223470
3471 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523472 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203473 EXPECT_EQ(
3474 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523475 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283476 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503477 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3478 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223479 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523480 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203481 EXPECT_EQ(
3482 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523483 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283484 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503485 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3486 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223487
robpercival214763f2016-07-01 23:27:013488 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3489 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3490 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223491
3492 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353493 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383494 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353495 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383496 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223497
3498 handle1.Reset();
3499 handle2.Reset();
3500 handle3.Reset();
3501
Matt Menkec6b3edf72019-03-19 17:00:393502 EXPECT_EQ(OK, handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:523503 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283504 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393505 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3506 pool_.get(), NetLogWithSource()));
3507 EXPECT_EQ(OK, handle2.Init(
Anton Bikineev068d2912021-05-15 20:43:523508 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283509 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393510 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3511 pool_.get(), NetLogWithSource()));
3512 EXPECT_EQ(OK, handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:523513 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283514 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393515 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3516 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223517
3518 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3519 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3520 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3521}
3522
[email protected]2c2bef152010-10-13 00:55:033523TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3524 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3525 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3526
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213527 TestCompletionCallback preconnect_callback;
3528 EXPECT_EQ(ERR_IO_PENDING,
3529 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3530 preconnect_callback.callback(),
3531 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033532
Matt Menke9fa17d52019-03-25 19:12:263533 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3534 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3535 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3536 TestGroupId("a")));
3537 EXPECT_EQ(2u,
3538 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393539 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033540
3541 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523542 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203543 EXPECT_EQ(
3544 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523545 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283546 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503547 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3548 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033549
3550 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523551 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203552 EXPECT_EQ(
3553 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523554 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283555 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503556 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3557 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033558
Matt Menke9fa17d52019-03-25 19:12:263559 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3560 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3561 TestGroupId("a")));
3562 EXPECT_EQ(0u,
3563 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393564 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033565
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213566 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
robpercival214763f2016-07-01 23:27:013567 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3568 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033569 handle1.Reset();
3570 handle2.Reset();
3571
Matt Menke9fa17d52019-03-25 19:12:263572 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3573 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3574 TestGroupId("a")));
3575 EXPECT_EQ(0u,
3576 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393577 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033578}
3579
3580TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3581 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3582 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3583
3584 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523585 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203586 EXPECT_EQ(
3587 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523588 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283589 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503590 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3591 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033592
Matt Menke9fa17d52019-03-25 19:12:263593 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3594 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3595 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3596 TestGroupId("a")));
3597 EXPECT_EQ(0u,
3598 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393599 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033600
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213601 TestCompletionCallback preconnect_callback;
3602 EXPECT_EQ(ERR_IO_PENDING,
3603 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3604 preconnect_callback.callback(),
3605 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033606
Matt Menke9fa17d52019-03-25 19:12:263607 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3608 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3609 TestGroupId("a")));
3610 EXPECT_EQ(1u,
3611 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393612 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033613
3614 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523615 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203616 EXPECT_EQ(
3617 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523618 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283619 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503620 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3621 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033622
Matt Menke9fa17d52019-03-25 19:12:263623 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3624 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3625 TestGroupId("a")));
3626 EXPECT_EQ(0u,
3627 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393628 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033629
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213630 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
robpercival214763f2016-07-01 23:27:013631 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3632 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033633 handle1.Reset();
3634 handle2.Reset();
3635
Matt Menke9fa17d52019-03-25 19:12:263636 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3637 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3638 TestGroupId("a")));
3639 EXPECT_EQ(0u,
3640 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393641 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033642}
3643
3644TEST_F(ClientSocketPoolBaseTest,
3645 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3646 CreatePool(4, 4);
3647 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3648
3649 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523650 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203651 EXPECT_EQ(
3652 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523653 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283654 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503655 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3656 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033657
3658 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523659 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203660 EXPECT_EQ(
3661 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523662 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283663 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503664 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3665 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033666
3667 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523668 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203669 EXPECT_EQ(
3670 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523671 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283672 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503673 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3674 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033675
Matt Menke9fa17d52019-03-25 19:12:263676 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3677 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3678 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3679 TestGroupId("a")));
3680 EXPECT_EQ(0u,
3681 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393682 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033683
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213684 EXPECT_EQ(
3685 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3686 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033687
Matt Menke9fa17d52019-03-25 19:12:263688 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3689 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3690 TestGroupId("a")));
3691 EXPECT_EQ(0u,
3692 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393693 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033694
robpercival214763f2016-07-01 23:27:013695 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3696 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3697 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033698 handle1.Reset();
3699 handle2.Reset();
3700 handle3.Reset();
3701
Matt Menke9fa17d52019-03-25 19:12:263702 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3703 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3704 TestGroupId("a")));
3705 EXPECT_EQ(0u,
3706 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393707 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033708}
3709
3710TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3711 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3712 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3713
Matt Menke9fa17d52019-03-25 19:12:263714 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033715
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213716 TestCompletionCallback preconnect_callback;
3717 EXPECT_EQ(ERR_IO_PENDING,
3718 pool_->RequestSockets(
3719 TestGroupId("a"), params_, absl::nullopt, kDefaultMaxSockets,
3720 preconnect_callback.callback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033721
Matt Menke9fa17d52019-03-25 19:12:263722 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433723 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393724 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263725 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3726 EXPECT_EQ(
3727 kDefaultMaxSockets,
3728 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3729 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433730 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263731 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3732 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033733
Matt Menke9fa17d52019-03-25 19:12:263734 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033735
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213736 EXPECT_EQ(OK,
3737 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
3738 kDefaultMaxSockets, CompletionOnceCallback(),
3739 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033740
Matt Menke9fa17d52019-03-25 19:12:263741 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213742
3743 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033744}
3745
3746TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3747 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3748 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3749
Matt Menke9fa17d52019-03-25 19:12:263750 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033751
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213752 TestCompletionCallback preconnect_callback1;
3753 EXPECT_EQ(ERR_IO_PENDING,
3754 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3755 kDefaultMaxSockets - 1,
3756 preconnect_callback1.callback(),
3757 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033758
Matt Menke9fa17d52019-03-25 19:12:263759 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433760 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393761 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263762 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3763 EXPECT_EQ(
3764 kDefaultMaxSockets - 1,
3765 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3766 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433767 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263768 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3769 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483770 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033771
Matt Menke9fa17d52019-03-25 19:12:263772 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033773
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213774 TestCompletionCallback preconnect_callback2;
3775 EXPECT_EQ(ERR_IO_PENDING,
3776 pool_->RequestSockets(
3777 TestGroupId("b"), params_, absl::nullopt, kDefaultMaxSockets,
3778 preconnect_callback2.callback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033779
Matt Menke9fa17d52019-03-25 19:12:263780 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3781 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483782 EXPECT_FALSE(pool_->IsStalled());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213783
3784 EXPECT_THAT(preconnect_callback1.WaitForResult(), IsOk());
3785 EXPECT_THAT(preconnect_callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033786}
3787
3788TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3789 CreatePool(4, 4);
3790 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3791
3792 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523793 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203794 EXPECT_EQ(
3795 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523796 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283797 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503798 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3799 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013800 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033801 handle1.Reset();
3802
Matt Menke9fa17d52019-03-25 19:12:263803 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3804 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3805 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3806 TestGroupId("a")));
3807 EXPECT_EQ(0u,
3808 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393809 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033810
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213811 TestCompletionCallback preconnect_callback;
3812 EXPECT_EQ(ERR_IO_PENDING,
3813 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3814 preconnect_callback.callback(),
3815 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033816
Matt Menke9fa17d52019-03-25 19:12:263817 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3818 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3819 TestGroupId("a")));
3820 EXPECT_EQ(1u,
3821 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393822 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213823
3824 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033825}
3826
3827TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3828 CreatePool(4, 4);
3829 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3830
3831 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523832 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203833 EXPECT_EQ(
3834 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523835 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283836 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503837 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3838 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013839 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033840
Matt Menke9fa17d52019-03-25 19:12:263841 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3842 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3843 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3844 TestGroupId("a")));
3845 EXPECT_EQ(0u,
3846 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393847 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263848 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033849
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213850 TestCompletionCallback preconnect_callback;
3851 EXPECT_EQ(ERR_IO_PENDING,
3852 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3853 preconnect_callback.callback(),
3854 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033855
Matt Menke9fa17d52019-03-25 19:12:263856 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3857 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3858 TestGroupId("a")));
3859 EXPECT_EQ(1u,
3860 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393861 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263862 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213863
3864 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033865}
3866
3867TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3868 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3869 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3870
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213871 EXPECT_EQ(
3872 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3873 kDefaultMaxSocketsPerGroup,
3874 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033875
Matt Menke9fa17d52019-03-25 19:12:263876 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3877 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3878 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3879 TestGroupId("a")));
3880 EXPECT_EQ(0u,
3881 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433882 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393883 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033884
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213885 EXPECT_EQ(
3886 OK, pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
3887 kDefaultMaxSocketsPerGroup,
3888 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033889
Matt Menke9fa17d52019-03-25 19:12:263890 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3891 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3892 TestGroupId("b")));
3893 EXPECT_EQ(0u,
3894 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433895 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393896 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033897}
3898
[email protected]3c819f522010-12-02 02:03:123899TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3900 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3901 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3902
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213903 EXPECT_EQ(
3904 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3905 kDefaultMaxSocketsPerGroup,
3906 CompletionOnceCallback(), NetLogWithSource()));
[email protected]3c819f522010-12-02 02:03:123907
Matt Menke9fa17d52019-03-25 19:12:263908 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523909
3910 connect_job_factory_->set_job_type(
3911 TestConnectJob::kMockAdditionalErrorStateJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213912
3913 EXPECT_EQ(
3914 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3915 kDefaultMaxSocketsPerGroup,
3916 CompletionOnceCallback(), NetLogWithSource()));
[email protected]fd2e53e2011-01-14 20:40:523917
Matt Menke9fa17d52019-03-25 19:12:263918 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123919}
3920
[email protected]8159a1c2012-06-07 00:00:103921TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033922 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433923 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033924
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213925 TestCompletionCallback preconnect_callback;
3926 EXPECT_EQ(ERR_IO_PENDING,
3927 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3928 preconnect_callback.callback(),
3929 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033930
Matt Menke9fa17d52019-03-25 19:12:263931 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3932 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3933 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3934 TestGroupId("a")));
3935 EXPECT_EQ(2u,
3936 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3937 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393938 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033939
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213940 EXPECT_EQ(
3941 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3942 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263943 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3944 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3945 TestGroupId("a")));
3946 EXPECT_EQ(2u,
3947 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3948 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393949 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033950
3951 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523952 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203953 EXPECT_EQ(
3954 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523955 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283956 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503957 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3958 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433959
3960 client_socket_factory_.SignalJob(0);
3961 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3962
Matt Menke9fa17d52019-03-25 19:12:263963 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3964 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3965 TestGroupId("a")));
3966 EXPECT_EQ(1u,
3967 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3968 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393969 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033970
3971 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523972 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433973 EXPECT_EQ(
3974 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523975 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283976 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503977 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3978 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433979 client_socket_factory_.SignalJob(0);
3980 EXPECT_THAT(callback2.WaitForResult(), IsOk());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213981 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033982
Matt Menke9fa17d52019-03-25 19:12:263983 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3984 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3985 TestGroupId("a")));
3986 EXPECT_EQ(0u,
3987 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3988 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393989 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103990
[email protected]2c2bef152010-10-13 00:55:033991 handle1.Reset();
3992 handle2.Reset();
3993
Matt Menke9fa17d52019-03-25 19:12:263994 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3995 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3996 TestGroupId("a")));
3997 EXPECT_EQ(0u,
3998 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3999 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394000 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034001
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214002 EXPECT_EQ(
4003 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4004 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264005 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4006 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4007 TestGroupId("a")));
4008 EXPECT_EQ(0u,
4009 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4010 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394011 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034012}
4013
4014TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
4015 CreatePool(4, 4);
4016 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4017
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214018 TestCompletionCallback preconnect_callback1;
4019 EXPECT_EQ(ERR_IO_PENDING,
4020 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4021 preconnect_callback1.callback(),
4022 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034023
Matt Menke9fa17d52019-03-25 19:12:264024 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4025 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4026 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4027 TestGroupId("a")));
4028 EXPECT_EQ(1u,
4029 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394030 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034031
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214032 TestCompletionCallback preconnect_callback2;
4033 EXPECT_EQ(ERR_IO_PENDING,
4034 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4035 preconnect_callback2.callback(),
4036 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264037 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4038 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4039 TestGroupId("a")));
4040 EXPECT_EQ(2u,
4041 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394042 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034043
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214044 TestCompletionCallback preconnect_callback3;
4045 EXPECT_EQ(ERR_IO_PENDING,
4046 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 3,
4047 preconnect_callback3.callback(),
4048 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264049 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4050 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4051 TestGroupId("a")));
4052 EXPECT_EQ(3u,
4053 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394054 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034055
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214056 EXPECT_EQ(
4057 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4058 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264059 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4060 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4061 TestGroupId("a")));
4062 EXPECT_EQ(3u,
4063 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394064 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034065}
4066
4067TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
4068 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434069 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:034070
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214071 TestCompletionCallback preconnect_callback;
4072 EXPECT_EQ(ERR_IO_PENDING,
4073 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4074 preconnect_callback.callback(),
4075 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034076
Matt Menke9fa17d52019-03-25 19:12:264077 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4078 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4079 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4080 TestGroupId("a")));
4081 EXPECT_EQ(1u,
4082 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394083 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034084
4085 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524086 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204087 EXPECT_EQ(
4088 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524089 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284090 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504091 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4092 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034093
Matt Menke9fa17d52019-03-25 19:12:264094 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4095 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4096 TestGroupId("a")));
4097 EXPECT_EQ(0u,
4098 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394099 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034100
Lily Chenecebf932018-11-02 17:15:434101 client_socket_factory_.SignalJobs();
4102 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214103 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
Lily Chenecebf932018-11-02 17:15:434104
Matt Menke9fa17d52019-03-25 19:12:264105 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4106 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4107 TestGroupId("a")));
4108 EXPECT_EQ(0u,
4109 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394110 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264111 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034112
[email protected]0dc88b32014-03-26 20:12:284113 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:484114 // starts, it has a connect start time.
4115 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:034116 handle1.Reset();
4117
Matt Menkec6b3edf72019-03-19 17:00:394118 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034119}
4120
[email protected]034df0f32013-01-07 23:17:484121// Checks that fully connected preconnect jobs have no connect times, and are
4122// marked as reused.
4123TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
4124 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4125 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214126
4127 EXPECT_EQ(
4128 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4129 CompletionOnceCallback(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484130
Matt Menke9fa17d52019-03-25 19:12:264131 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4132 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4133 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4134 TestGroupId("a")));
4135 EXPECT_EQ(0u,
4136 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394137 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484138
4139 ClientSocketHandle handle;
4140 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394141 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524142 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284143 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394144 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4145 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484146
4147 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394148 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484149
4150 TestLoadTimingInfoConnectedReused(handle);
4151 handle.Reset();
4152 TestLoadTimingInfoNotConnected(handle);
4153}
4154
[email protected]dcbe168a2010-12-02 03:14:464155// http://crbug.com/64940 regression test.
4156TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4157 const int kMaxTotalSockets = 3;
4158 const int kMaxSocketsPerGroup = 2;
4159 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434160 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464161
Matt Menkef6edce752019-03-19 17:21:564162 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464163 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4164
4165 // Set up one idle socket in "a".
4166 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524167 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204168 EXPECT_EQ(
4169 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524170 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284171 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504172 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4173 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264174 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4175 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4176 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4177 TestGroupId("a")));
4178 EXPECT_EQ(0u,
4179 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394180 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464181
Lily Chenecebf932018-11-02 17:15:434182 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014183 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264184 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4185 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4186 TestGroupId("a")));
4187 EXPECT_EQ(0u,
4188 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4189 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434190
[email protected]dcbe168a2010-12-02 03:14:464191 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394192 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464193
4194 // Set up two active sockets in "b".
4195 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524196 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204197 EXPECT_EQ(
4198 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524199 handle1.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284200 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504201 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4202 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204203 EXPECT_EQ(
4204 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524205 handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284206 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504207 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4208 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464209
Matt Menke9fa17d52019-03-25 19:12:264210 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4211 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4212 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4213 TestGroupId("b")));
4214 EXPECT_EQ(0u,
4215 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394216 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434217
4218 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014219 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4220 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394221 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264222 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4223 TestGroupId("b")));
4224 EXPECT_EQ(0u,
4225 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4226 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464227
4228 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4229 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4230 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4231 // sockets for "a", and "b" should still have 2 active sockets.
4232
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214233 EXPECT_EQ(
4234 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4235 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264236 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4237 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4238 TestGroupId("a")));
4239 EXPECT_EQ(0u,
4240 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394241 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264242 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4243 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4244 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4245 TestGroupId("b")));
4246 EXPECT_EQ(0u,
4247 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394248 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264249 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464250
4251 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4252 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4253 // "a" should result in closing 1 for "b".
4254 handle1.Reset();
4255 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394256 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264257 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464258
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214259 TestCompletionCallback preconnect_callback;
4260 EXPECT_EQ(ERR_IO_PENDING,
4261 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4262 preconnect_callback.callback(),
4263 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264264 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4265 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4266 TestGroupId("a")));
4267 EXPECT_EQ(1u,
4268 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394269 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264270 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4271 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4272 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4273 TestGroupId("b")));
4274 EXPECT_EQ(0u,
4275 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394276 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264277 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464278}
4279
[email protected]b7b8be42011-07-12 12:46:414280TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264281 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4282 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074283
4284 // Make the ConnectJob hang until it times out, shorten the timeout.
4285 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Peter Kastinge5a38ed2021-10-02 03:06:354286 connect_job_factory_->set_timeout_duration(base::Milliseconds(500));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214287 TestCompletionCallback preconnect_callback;
4288 EXPECT_EQ(ERR_IO_PENDING,
4289 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4290 preconnect_callback.callback(),
4291 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264292 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4293 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4294 TestGroupId("a")));
4295 EXPECT_EQ(1u,
4296 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394297 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074298
[email protected]b7b8be42011-07-12 12:46:414299 // Verify the backup timer doesn't create a backup job, by making
4300 // the backup job a pending job instead of a waiting job, so it
4301 // *would* complete if it were created.
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594302 base::RunLoop loop;
[email protected]a9fc8fc2011-05-10 02:41:074303 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454304 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Peter Kastinge5a38ed2021-10-02 03:06:354305 FROM_HERE, loop.QuitClosure(), base::Seconds(1));
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594306 loop.Run();
Matt Menke9fa17d52019-03-25 19:12:264307 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074308}
4309
[email protected]b7b8be42011-07-12 12:46:414310TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264311 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4312 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074313
4314 // Make the ConnectJob hang forever.
4315 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214316 TestCompletionCallback preconnect_callback;
4317 EXPECT_EQ(ERR_IO_PENDING,
4318 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4319 preconnect_callback.callback(),
4320 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264321 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4322 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4323 TestGroupId("a")));
4324 EXPECT_EQ(1u,
4325 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394326 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284327 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074328
4329 // Make the backup job be a pending job, so it completes normally.
4330 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4331 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524332 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504333 EXPECT_EQ(
4334 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524335 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284336 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4337 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4338 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414339 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264340 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4341 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4342 TestGroupId("a")));
4343 EXPECT_EQ(0u,
4344 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394345 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264346 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014347 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074348
4349 // The hung connect job should still be there, but everything else should be
4350 // complete.
Matt Menke9fa17d52019-03-25 19:12:264351 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4352 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4353 TestGroupId("a")));
4354 EXPECT_EQ(1u,
4355 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394356 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264357 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074358}
4359
[email protected]0dc88b32014-03-26 20:12:284360// Tests that a preconnect that starts out with unread data can still be used.
4361// http://crbug.com/334467
4362TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4363 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4364 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4365
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214366 EXPECT_EQ(
4367 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4368 CompletionOnceCallback(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284369
Matt Menke9fa17d52019-03-25 19:12:264370 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4371 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4372 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4373 TestGroupId("a")));
4374 EXPECT_EQ(0u,
4375 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394376 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284377
4378 // Fail future jobs to be sure that handle receives the preconnected socket
4379 // rather than closing it and making a new one.
4380 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4381 ClientSocketHandle handle;
4382 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394383 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524384 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284385 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394386 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4387 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284388
Matt Menke9fa17d52019-03-25 19:12:264389 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4390 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4391 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4392 TestGroupId("a")));
4393 EXPECT_EQ(0u,
4394 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394395 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264396 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284397
4398 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354399 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284400
4401 TestLoadTimingInfoConnectedReused(handle);
4402 handle.Reset();
4403
4404 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394405 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284406}
4407
Lily Chenecebf932018-11-02 17:15:434408TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4409 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4410 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4411
4412 ClientSocketHandle handle1;
4413 TestCompletionCallback callback1;
4414 EXPECT_EQ(
4415 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524416 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284417 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504418 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4419 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434420
Matt Menke9fa17d52019-03-25 19:12:264421 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4422 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4423 TestGroupId("a")));
4424 EXPECT_EQ(0u,
4425 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394426 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434427
Matt Menkec6b3edf72019-03-19 17:00:394428 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4429 &handle1));
Lily Chenecebf932018-11-02 17:15:434430}
4431
4432TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4433 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4434 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4435
4436 ClientSocketHandle handle1;
4437 TestCompletionCallback callback1;
4438 EXPECT_EQ(
4439 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524440 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284441 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504442 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4443 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434444
Matt Menke9fa17d52019-03-25 19:12:264445 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4446 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4447 TestGroupId("a")));
4448 EXPECT_EQ(0u,
4449 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394450 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434451
4452 ClientSocketHandle handle2;
4453 TestCompletionCallback callback2;
4454 EXPECT_EQ(
4455 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524456 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284457 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504458 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4459 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434460
Matt Menke9fa17d52019-03-25 19:12:264461 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4462 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4463 TestGroupId("a")));
4464 EXPECT_EQ(0u,
4465 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394466 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434467
Matt Menkec6b3edf72019-03-19 17:00:394468 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4469 &handle1));
4470 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4471 &handle2));
Lily Chenecebf932018-11-02 17:15:434472
4473 // One job completes. The other request should still have its job.
4474 client_socket_factory_.SignalJob(0);
4475 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4476
Matt Menke9fa17d52019-03-25 19:12:264477 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4478 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4479 TestGroupId("a")));
4480 EXPECT_EQ(0u,
4481 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4482 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394483 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434484
Matt Menkec6b3edf72019-03-19 17:00:394485 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4486 &handle2));
Lily Chenecebf932018-11-02 17:15:434487}
4488
4489TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4490 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4491 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4492
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214493 TestCompletionCallback preconnect_callback;
4494 EXPECT_EQ(ERR_IO_PENDING,
4495 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4496 preconnect_callback.callback(),
4497 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434498
Matt Menke9fa17d52019-03-25 19:12:264499 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4500 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4501 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4502 TestGroupId("a")));
4503 EXPECT_EQ(1u,
4504 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394505 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434506
4507 ClientSocketHandle handle1;
4508 TestCompletionCallback callback1;
4509 EXPECT_EQ(
4510 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524511 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284512 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504513 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4514 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434515
Matt Menke9fa17d52019-03-25 19:12:264516 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4517 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4518 TestGroupId("a")));
4519 EXPECT_EQ(0u,
4520 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394521 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434522
Matt Menkec6b3edf72019-03-19 17:00:394523 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4524 &handle1));
Lily Chenecebf932018-11-02 17:15:434525}
4526
4527TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4528 CreatePool(kDefaultMaxSockets, 1);
4529 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4530
4531 ClientSocketHandle handle1;
4532 TestCompletionCallback callback1;
4533 EXPECT_EQ(
4534 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524535 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284536 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504537 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4538 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434539
Matt Menke9fa17d52019-03-25 19:12:264540 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4541 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4542 TestGroupId("a")));
4543 EXPECT_EQ(0u,
4544 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394545 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434546
Matt Menkec6b3edf72019-03-19 17:00:394547 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4548 &handle1));
Lily Chenecebf932018-11-02 17:15:434549
4550 // Insert a higher priority request
4551 ClientSocketHandle handle2;
4552 TestCompletionCallback callback2;
4553 EXPECT_EQ(
4554 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524555 handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284556 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504557 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4558 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434559
Matt Menke9fa17d52019-03-25 19:12:264560 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4561 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4562 TestGroupId("a")));
4563 EXPECT_EQ(0u,
4564 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394565 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434566
4567 // The highest priority request should steal the job from the default priority
4568 // request.
Matt Menkec6b3edf72019-03-19 17:00:394569 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4570 &handle2));
4571 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4572 &handle1));
Lily Chenecebf932018-11-02 17:15:434573}
4574
4575TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4576 CreatePool(3, 3);
4577 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4578
4579 ClientSocketHandle handle_lowest;
4580 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284581 EXPECT_EQ(
4582 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524583 handle_lowest.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284584 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4585 callback_lowest.callback(),
4586 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4587 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434588
Matt Menke9fa17d52019-03-25 19:12:264589 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4590 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4591 TestGroupId("a")));
4592 EXPECT_EQ(0u,
4593 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394594 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434595
4596 ClientSocketHandle handle_highest;
4597 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284598 EXPECT_EQ(
4599 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524600 handle_highest.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284601 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4602 callback_highest.callback(),
4603 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4604 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434605
Matt Menke9fa17d52019-03-25 19:12:264606 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4607 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4608 TestGroupId("a")));
4609 EXPECT_EQ(0u,
4610 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394611 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434612
4613 ClientSocketHandle handle_low;
4614 TestCompletionCallback callback_low;
4615 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284616 handle_low.Init(
Anton Bikineev068d2912021-05-15 20:43:524617 TestGroupId("a"), params_, absl::nullopt, LOW, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284618 ClientSocketPool::RespectLimits::ENABLED,
4619 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4620 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434621
Matt Menke9fa17d52019-03-25 19:12:264622 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4623 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4624 TestGroupId("a")));
4625 EXPECT_EQ(0u,
4626 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394627 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434628
4629 ClientSocketHandle handle_lowest2;
4630 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284631 EXPECT_EQ(
4632 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524633 handle_lowest2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284634 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4635 callback_lowest2.callback(),
4636 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4637 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434638
Matt Menke9fa17d52019-03-25 19:12:264639 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4640 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4641 TestGroupId("a")));
4642 EXPECT_EQ(0u,
4643 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394644 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434645
4646 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394647 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4648 &handle_highest));
4649 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4650 &handle_low));
4651 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4652 &handle_lowest));
4653 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4654 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434655
4656 // Add another request with medium priority. It should steal the job from the
4657 // lowest priority request with a job.
4658 ClientSocketHandle handle_medium;
4659 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284660 EXPECT_EQ(
4661 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524662 handle_medium.Init(TestGroupId("a"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:284663 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4664 callback_medium.callback(),
4665 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4666 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434667
Matt Menke9fa17d52019-03-25 19:12:264668 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4669 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4670 TestGroupId("a")));
4671 EXPECT_EQ(0u,
4672 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394673 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4674 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4675 &handle_highest));
4676 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4677 &handle_medium));
4678 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4679 &handle_low));
4680 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4681 &handle_lowest));
4682 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4683 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434684}
4685
4686TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4687 CreatePool(kDefaultMaxSockets, 1);
4688 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4689
4690 ClientSocketHandle handle1;
4691 TestCompletionCallback callback1;
4692 EXPECT_EQ(
4693 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524694 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284695 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504696 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4697 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434698
Matt Menke9fa17d52019-03-25 19:12:264699 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4700 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4701 TestGroupId("a")));
4702 EXPECT_EQ(0u,
4703 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394704 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434705
4706 ClientSocketHandle handle2;
4707 TestCompletionCallback callback2;
4708 EXPECT_EQ(
4709 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524710 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284711 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504712 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4713 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434714
Matt Menke9fa17d52019-03-25 19:12:264715 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4716 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4717 TestGroupId("a")));
4718 EXPECT_EQ(0u,
4719 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394720 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434721
4722 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394723 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4724 &handle1));
4725 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4726 &handle2));
Lily Chenecebf932018-11-02 17:15:434727
4728 // Reprioritizing the second request places it above the first, and it steals
4729 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394730 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4731 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4732 &handle2));
4733 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4734 &handle1));
Lily Chenecebf932018-11-02 17:15:434735}
4736
4737TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4738 CreatePool(kDefaultMaxSockets, 1);
4739 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4740
4741 ClientSocketHandle handle1;
4742 TestCompletionCallback callback1;
4743 EXPECT_EQ(
4744 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524745 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284746 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504747 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4748 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434749
Matt Menke9fa17d52019-03-25 19:12:264750 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4751 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4752 TestGroupId("a")));
4753 EXPECT_EQ(0u,
4754 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394755 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434756
Matt Menkec6b3edf72019-03-19 17:00:394757 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4758 &handle1));
Lily Chenecebf932018-11-02 17:15:434759
4760 ClientSocketHandle handle2;
4761 TestCompletionCallback callback2;
4762 EXPECT_EQ(
4763 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524764 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284765 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504766 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4767 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434768
Matt Menke9fa17d52019-03-25 19:12:264769 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4770 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4771 TestGroupId("a")));
4772 EXPECT_EQ(0u,
4773 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394774 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434775
4776 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394777 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4778 &handle1));
4779 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4780 &handle2));
Lily Chenecebf932018-11-02 17:15:434781
4782 // The second request should get a job upon cancelling the first request.
4783 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264784 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4785 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4786 TestGroupId("a")));
4787 EXPECT_EQ(0u,
4788 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394789 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434790
Matt Menkec6b3edf72019-03-19 17:00:394791 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4792 &handle2));
Lily Chenecebf932018-11-02 17:15:434793}
4794
4795TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4796 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4797 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4798
4799 ClientSocketHandle handle1;
4800 TestCompletionCallback callback1;
4801 EXPECT_EQ(
4802 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524803 handle1.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284804 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504805 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4806 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434807
Matt Menke9fa17d52019-03-25 19:12:264808 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4809 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4810 TestGroupId("a")));
4811 EXPECT_EQ(0u,
4812 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394813 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434814
4815 ClientSocketHandle handle2;
4816 TestCompletionCallback callback2;
4817 EXPECT_EQ(
4818 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524819 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284820 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504821 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4822 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434823
Matt Menke9fa17d52019-03-25 19:12:264824 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4825 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4826 TestGroupId("a")));
4827 EXPECT_EQ(0u,
4828 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394829 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434830
Matt Menkec6b3edf72019-03-19 17:00:394831 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4832 &handle1));
4833 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4834 &handle2));
Lily Chenecebf932018-11-02 17:15:434835
4836 // The lower-priority job completes first. The higher-priority request should
4837 // get the socket, and the lower-priority request should get the remaining
4838 // job.
4839 client_socket_factory_.SignalJob(1);
4840 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264841 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4842 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4843 TestGroupId("a")));
4844 EXPECT_EQ(0u,
4845 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4846 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394847 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434848 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394849 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4850 &handle2));
Lily Chenecebf932018-11-02 17:15:434851}
4852
[email protected]043b68c82013-08-22 23:41:524853class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204854 public:
Matt Menke9fa17d52019-03-25 19:12:264855 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394856 const ClientSocketPool::GroupId& group_id)
Tsuyoshi Horo2ec06e002022-06-09 01:38:594857 : pool_(pool), group_id_(group_id) {
[email protected]043b68c82013-08-22 23:41:524858 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204859 }
4860
Daniel Cheng4496d0822018-04-26 21:52:154861 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204862
Matt Menke9fa17d52019-03-25 19:12:264863 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504864 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034865 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524866 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284867 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4868 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204869 }
4870
Matt Menke9fa17d52019-03-25 19:12:264871 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504872 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034873 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524874 absl::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504875 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4876 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204877 }
4878
4879 bool ReleaseOneConnection() {
4880 if (!handle_.is_initialized() || !can_release_connection_) {
4881 return false;
4882 }
4883 handle_.socket()->Disconnect();
4884 handle_.Reset();
4885 return true;
4886 }
4887
4888 void set_can_release_connection(bool can_release_connection) {
4889 can_release_connection_ = can_release_connection;
4890 }
4891
4892 MOCK_METHOD0(CloseOneIdleConnection, bool());
4893
4894 private:
Keishi Hattori0e45c022021-11-27 09:25:524895 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]58e562f2013-04-22 17:32:204896 ClientSocketHandle handle_;
4897 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394898 const ClientSocketPool::GroupId group_id_;
Tsuyoshi Horo2ec06e002022-06-09 01:38:594899 bool can_release_connection_ = true;
[email protected]58e562f2013-04-22 17:32:204900};
4901
[email protected]58e562f2013-04-22 17:32:204902// Tests the basic case of closing an idle socket in a higher layered pool when
4903// a new request is issued and the lower layer pool is stalled.
4904TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4905 CreatePool(1, 1);
4906 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4907
Matt Menkec6b3edf72019-03-19 17:00:394908 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014909 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204910 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4911 .WillOnce(Invoke(&mock_layered_pool,
4912 &MockLayeredPool::ReleaseOneConnection));
4913 ClientSocketHandle handle;
4914 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504915 EXPECT_EQ(
4916 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524917 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284918 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4919 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4920 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014921 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204922}
4923
Matt Menke833678642019-03-05 22:05:514924// Tests the case that trying to close an idle socket in a higher layered pool
4925// fails.
4926TEST_F(ClientSocketPoolBaseTest,
4927 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4928 CreatePool(1, 1);
4929 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4930
Matt Menkec6b3edf72019-03-19 17:00:394931 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514932 mock_layered_pool.set_can_release_connection(false);
4933 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4934 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4935 .WillOnce(Invoke(&mock_layered_pool,
4936 &MockLayeredPool::ReleaseOneConnection));
4937 ClientSocketHandle handle;
4938 TestCompletionCallback callback;
4939 EXPECT_EQ(
4940 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524941 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284942 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4943 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4944 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514945 base::RunLoop().RunUntilIdle();
4946 EXPECT_FALSE(callback.have_result());
4947}
4948
[email protected]58e562f2013-04-22 17:32:204949// Same as above, but the idle socket is in the same group as the stalled
4950// socket, and closes the only other request in its group when closing requests
4951// in higher layered pools. This generally shouldn't happen, but it may be
4952// possible if a higher level pool issues a request and the request is
4953// subsequently cancelled. Even if it's not possible, best not to crash.
4954TEST_F(ClientSocketPoolBaseTest,
4955 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4956 CreatePool(2, 2);
4957 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4958
4959 // Need a socket in another group for the pool to be stalled (If a group
4960 // has the maximum number of connections already, it's not stalled).
4961 ClientSocketHandle handle1;
4962 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524963 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284964 DEFAULT_PRIORITY, SocketTag(),
4965 ClientSocketPool::RespectLimits::ENABLED,
4966 callback1.callback(),
4967 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4968 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204969
Matt Menkec6b3edf72019-03-19 17:00:394970 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014971 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204972 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4973 .WillOnce(Invoke(&mock_layered_pool,
4974 &MockLayeredPool::ReleaseOneConnection));
4975 ClientSocketHandle handle;
4976 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284977 EXPECT_EQ(ERR_IO_PENDING,
4978 handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524979 TestGroupId("group2"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284980 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4981 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4982 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014983 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204984}
4985
4986// Tests the case when an idle socket can be closed when a new request is
4987// issued, and the new request belongs to a group that was previously stalled.
4988TEST_F(ClientSocketPoolBaseTest,
4989 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4990 CreatePool(2, 2);
4991 std::list<TestConnectJob::JobType> job_types;
4992 job_types.push_back(TestConnectJob::kMockJob);
4993 job_types.push_back(TestConnectJob::kMockJob);
4994 job_types.push_back(TestConnectJob::kMockJob);
4995 job_types.push_back(TestConnectJob::kMockJob);
4996 connect_job_factory_->set_job_types(&job_types);
4997
4998 ClientSocketHandle handle1;
4999 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:525000 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:285001 DEFAULT_PRIORITY, SocketTag(),
5002 ClientSocketPool::RespectLimits::ENABLED,
5003 callback1.callback(),
5004 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5005 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205006
Matt Menkec6b3edf72019-03-19 17:00:395007 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:015008 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205009 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
5010 .WillRepeatedly(Invoke(&mock_layered_pool,
5011 &MockLayeredPool::ReleaseOneConnection));
5012 mock_layered_pool.set_can_release_connection(false);
5013
5014 // The third request is made when the socket pool is in a stalled state.
5015 ClientSocketHandle handle3;
5016 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:285017 EXPECT_EQ(ERR_IO_PENDING,
5018 handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:525019 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285020 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5021 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5022 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205023
5024 base::RunLoop().RunUntilIdle();
5025 EXPECT_FALSE(callback3.have_result());
5026
5027 // The fourth request is made when the pool is no longer stalled. The third
5028 // request should be serviced first, since it was issued first and has the
5029 // same priority.
5030 mock_layered_pool.set_can_release_connection(true);
5031 ClientSocketHandle handle4;
5032 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:285033 EXPECT_EQ(ERR_IO_PENDING,
5034 handle4.Init(
Anton Bikineev068d2912021-05-15 20:43:525035 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285036 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5037 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5038 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015039 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205040 EXPECT_FALSE(callback4.have_result());
5041
5042 // Closing a handle should free up another socket slot.
5043 handle1.Reset();
robpercival214763f2016-07-01 23:27:015044 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205045}
5046
5047// Tests the case when an idle socket can be closed when a new request is
5048// issued, and the new request belongs to a group that was previously stalled.
5049//
5050// The two differences from the above test are that the stalled requests are not
5051// in the same group as the layered pool's request, and the the fourth request
5052// has a higher priority than the third one, so gets a socket first.
5053TEST_F(ClientSocketPoolBaseTest,
5054 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
5055 CreatePool(2, 2);
5056 std::list<TestConnectJob::JobType> job_types;
5057 job_types.push_back(TestConnectJob::kMockJob);
5058 job_types.push_back(TestConnectJob::kMockJob);
5059 job_types.push_back(TestConnectJob::kMockJob);
5060 job_types.push_back(TestConnectJob::kMockJob);
5061 connect_job_factory_->set_job_types(&job_types);
5062
5063 ClientSocketHandle handle1;
5064 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:525065 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:285066 DEFAULT_PRIORITY, SocketTag(),
5067 ClientSocketPool::RespectLimits::ENABLED,
5068 callback1.callback(),
5069 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5070 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205071
Matt Menkec6b3edf72019-03-19 17:00:395072 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:015073 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205074 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
5075 .WillRepeatedly(Invoke(&mock_layered_pool,
5076 &MockLayeredPool::ReleaseOneConnection));
5077 mock_layered_pool.set_can_release_connection(false);
5078
5079 // The third request is made when the socket pool is in a stalled state.
5080 ClientSocketHandle handle3;
5081 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:205082 EXPECT_EQ(
5083 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525084 handle3.Init(TestGroupId("group3"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:285085 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505086 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5087 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205088
5089 base::RunLoop().RunUntilIdle();
5090 EXPECT_FALSE(callback3.have_result());
5091
5092 // The fourth request is made when the pool is no longer stalled. This
5093 // request has a higher priority than the third request, so is serviced first.
5094 mock_layered_pool.set_can_release_connection(true);
5095 ClientSocketHandle handle4;
5096 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:205097 EXPECT_EQ(
5098 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525099 handle4.Init(TestGroupId("group3"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:285100 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505101 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5102 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015103 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205104 EXPECT_FALSE(callback3.have_result());
5105
5106 // Closing a handle should free up another socket slot.
5107 handle1.Reset();
robpercival214763f2016-07-01 23:27:015108 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205109}
5110
5111TEST_F(ClientSocketPoolBaseTest,
5112 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
5113 CreatePool(1, 1);
5114 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5115
Matt Menkec6b3edf72019-03-19 17:00:395116 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:015117 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205118 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
5119 .WillRepeatedly(Invoke(&mock_layered_pool1,
5120 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:395121 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:015122 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
5123 IsOk());
[email protected]58e562f2013-04-22 17:32:205124 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
5125 .WillRepeatedly(Invoke(&mock_layered_pool2,
5126 &MockLayeredPool::ReleaseOneConnection));
5127 ClientSocketHandle handle;
5128 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:505129 EXPECT_EQ(
5130 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525131 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285132 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5133 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5134 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015135 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205136}
5137
[email protected]b021ece62013-06-11 11:06:335138// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:155139// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
5140// socket instead of a request with the same priority that was issued earlier,
5141// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:335142TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:335143 CreatePool(1, 1);
5144
5145 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395146 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5147 TestGroupId("a"), MAXIMUM_PRIORITY,
5148 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265149 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335150
5151 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5152
mmenked3641e12016-01-28 16:06:155153 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395154 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155155 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265156 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335157
mmenked3641e12016-01-28 16:06:155158 // Issue a request that ignores the limits, so a new ConnectJob is
5159 // created.
5160 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395161 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155162 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265163 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335164
robpercival214763f2016-07-01 23:27:015165 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335166 EXPECT_FALSE(request(1)->have_result());
5167}
5168
[email protected]c55fabd2013-11-04 23:26:565169// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155170// issued for a request with RespectLimits::DISABLED is not cancelled when a
5171// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565172TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565173 CreatePool(1, 1);
5174
5175 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395176 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5177 TestGroupId("a"), MAXIMUM_PRIORITY,
5178 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265179 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565180
5181 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5182
mmenked3641e12016-01-28 16:06:155183 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395184 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155185 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265186 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565187
mmenked3641e12016-01-28 16:06:155188 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5189 // created.
5190 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395191 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155192 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265193 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335194
mmenked3641e12016-01-28 16:06:155195 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335196 // should not be cancelled.
5197 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265198 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335199
robpercival214763f2016-07-01 23:27:015200 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335201 EXPECT_FALSE(request(1)->have_result());
5202}
5203
Matt Menkeb57663b32019-03-01 17:17:105204TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5205 CreatePool(1, 1);
5206
5207 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5208
5209 ClientSocketHandle handle;
5210 TestCompletionCallback callback;
5211 EXPECT_EQ(
5212 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525213 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285214 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5215 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5216 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105217
Matt Menke9fa17d52019-03-25 19:12:265218 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105219
5220 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5221 EXPECT_FALSE(handle.is_initialized());
5222 EXPECT_FALSE(handle.socket());
5223
5224 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265225 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105226}
5227
5228class TestAuthHelper {
5229 public:
5230 TestAuthHelper() = default;
Peter Boström293b1342021-09-22 17:31:435231
5232 TestAuthHelper(const TestAuthHelper&) = delete;
5233 TestAuthHelper& operator=(const TestAuthHelper&) = delete;
5234
Matt Menkeb57663b32019-03-01 17:17:105235 ~TestAuthHelper() = default;
5236
Matt Menkec6b3edf72019-03-19 17:00:395237 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195238 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265239 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395240 RequestPriority priority = DEFAULT_PRIORITY,
5241 ClientSocketPool::RespectLimits respect_limits =
5242 ClientSocketPool::RespectLimits::ENABLED,
5243 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105244 EXPECT_EQ(ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525245 handle_.Init(group_id_in, params, absl::nullopt, priority,
Matt Menkef09e64c2019-04-23 22:16:285246 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105247 base::BindRepeating(&TestAuthHelper::AuthCallback,
5248 base::Unretained(this)),
5249 pool, NetLogWithSource()));
5250 }
5251
5252 void WaitForAuth() {
5253 run_loop_ = std::make_unique<base::RunLoop>();
5254 run_loop_->Run();
5255 run_loop_.reset();
5256 }
5257
5258 void WaitForAuthAndRestartSync() {
5259 restart_sync_ = true;
5260 WaitForAuth();
5261 restart_sync_ = false;
5262 }
5263
5264 void WaitForAuthAndResetHandleSync() {
5265 reset_handle_sync_ = true;
5266 WaitForAuth();
5267 reset_handle_sync_ = false;
5268 }
5269
5270 void RestartWithAuth() {
5271 DCHECK(restart_with_auth_callback_);
5272 std::move(restart_with_auth_callback_).Run();
5273 }
5274
5275 int WaitForResult() {
5276 int result = callback_.WaitForResult();
5277 // There shouldn't be any callback waiting to be invoked once the request is
5278 // complete.
5279 EXPECT_FALSE(restart_with_auth_callback_);
5280 // The socket should only be initialized on success.
5281 EXPECT_EQ(result == OK, handle_.is_initialized());
5282 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5283 return result;
5284 }
5285
5286 ClientSocketHandle* handle() { return &handle_; }
5287 int auth_count() const { return auth_count_; }
5288 int have_result() const { return callback_.have_result(); }
5289
5290 private:
5291 void AuthCallback(const HttpResponseInfo& response,
5292 HttpAuthController* auth_controller,
5293 base::OnceClosure restart_with_auth_callback) {
5294 EXPECT_FALSE(restart_with_auth_callback_);
5295 EXPECT_TRUE(restart_with_auth_callback);
5296
5297 // Once there's a result, this method shouldn't be invoked again.
5298 EXPECT_FALSE(callback_.have_result());
5299
5300 ++auth_count_;
5301 run_loop_->Quit();
5302 if (restart_sync_) {
5303 std::move(restart_with_auth_callback).Run();
5304 return;
5305 }
5306
5307 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5308
5309 if (reset_handle_sync_) {
5310 handle_.Reset();
5311 return;
5312 }
5313 }
5314
5315 std::unique_ptr<base::RunLoop> run_loop_;
5316 base::OnceClosure restart_with_auth_callback_;
5317
5318 bool restart_sync_ = false;
5319 bool reset_handle_sync_ = false;
5320
5321 ClientSocketHandle handle_;
5322 int auth_count_ = 0;
5323 TestCompletionCallback callback_;
Matt Menkeb57663b32019-03-01 17:17:105324};
5325
5326TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5327 CreatePool(1, 1);
5328 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5329
5330 TestAuthHelper auth_helper;
5331 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265332 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015333 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395334 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105335
5336 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265337 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015338 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395339 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105340
5341 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265342 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015343 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395344 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105345
5346 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5347 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265348 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5349 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395350 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105351 EXPECT_EQ(0, pool_->IdleSocketCount());
5352}
5353
5354TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5355 CreatePool(1, 1);
5356 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5357
5358 TestAuthHelper auth_helper;
5359 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265360 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015361 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395362 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105363
5364 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265365 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015366 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395367 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105368
5369 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5370 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265371 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5372 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395373 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105374 EXPECT_EQ(0, pool_->IdleSocketCount());
5375}
5376
5377TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5378 CreatePool(1, 1);
5379 connect_job_factory_->set_job_type(
5380 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5381
5382 TestAuthHelper auth_helper;
5383 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265384 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105385
5386 auth_helper.WaitForAuth();
5387 auth_helper.RestartWithAuth();
5388 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5389
5390 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265391 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105392 EXPECT_EQ(0, pool_->IdleSocketCount());
5393}
5394
5395TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5396 CreatePool(1, 1);
5397 connect_job_factory_->set_job_type(
5398 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5399
5400 TestAuthHelper auth_helper;
5401 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265402 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105403
5404 auth_helper.WaitForAuthAndRestartSync();
5405 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5406
5407 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265408 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105409 EXPECT_EQ(0, pool_->IdleSocketCount());
5410}
5411
5412TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5413 CreatePool(1, 1);
5414 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5415
5416 TestAuthHelper auth_helper;
5417 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265418 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105419
5420 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265421 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105422
5423 auth_helper.handle()->Reset();
5424
5425 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265426 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105427 EXPECT_EQ(0, pool_->IdleSocketCount());
5428 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5429 EXPECT_FALSE(auth_helper.handle()->socket());
5430}
5431
5432TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5433 CreatePool(1, 1);
5434 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5435
5436 TestAuthHelper auth_helper;
5437 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265438 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105439
5440 auth_helper.WaitForAuthAndResetHandleSync();
5441 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265442 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105443 EXPECT_EQ(0, pool_->IdleSocketCount());
5444 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5445 EXPECT_FALSE(auth_helper.handle()->socket());
5446}
5447
5448TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5449 CreatePool(1, 1);
5450 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5451
5452 TestAuthHelper auth_helper;
5453 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265454 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105455
5456 auth_helper.WaitForAuth();
5457
Matt Menke433de6d2020-03-04 00:24:115458 pool_->FlushWithError(ERR_FAILED, "Network changed");
Matt Menkeb57663b32019-03-01 17:17:105459 base::RunLoop().RunUntilIdle();
5460
5461 // When flushing the socket pool, bound sockets should delay returning the
5462 // error until completion.
5463 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265464 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105465 EXPECT_EQ(0, pool_->IdleSocketCount());
5466
5467 auth_helper.RestartWithAuth();
5468 // The callback should be called asynchronously.
5469 EXPECT_FALSE(auth_helper.have_result());
5470
5471 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265472 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105473 EXPECT_EQ(0, pool_->IdleSocketCount());
5474}
5475
5476TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5477 CreatePool(1, 1);
5478 connect_job_factory_->set_job_type(
5479 TestConnectJob::kMockAuthChallengeTwiceJob);
5480
5481 TestAuthHelper auth_helper;
5482 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265483 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015484 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395485 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105486
5487 auth_helper.WaitForAuth();
5488 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265489 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105490 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015491 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395492 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105493
5494 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265495 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015496 EXPECT_EQ(2, auth_helper.auth_count());
5497 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395498 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015499
Matt Menkeb57663b32019-03-01 17:17:105500 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265501 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105502 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015503 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395504 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105505
5506 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5507 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265508 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5509 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395510 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105511 EXPECT_EQ(0, pool_->IdleSocketCount());
5512}
5513
5514TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5515 CreatePool(1, 1);
5516 connect_job_factory_->set_job_type(
5517 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5518
5519 TestAuthHelper auth_helper;
5520 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265521 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105522
5523 auth_helper.WaitForAuth();
5524 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265525 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105526 EXPECT_EQ(1, auth_helper.auth_count());
5527
5528 auth_helper.WaitForAuth();
5529 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265530 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105531 EXPECT_EQ(2, auth_helper.auth_count());
5532
5533 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5534 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265535 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105536 EXPECT_EQ(0, pool_->IdleSocketCount());
5537}
5538
5539// Makes sure that when a bound request is destroyed, a new ConnectJob is
5540// created, if needed.
5541TEST_F(ClientSocketPoolBaseTest,
5542 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5543 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5544 connect_job_factory_->set_job_type(
5545 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5546
5547 // First request creates a ConnectJob.
5548 TestAuthHelper auth_helper1;
5549 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265550 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105551
5552 // A second request come in, but no new ConnectJob is needed, since the limit
5553 // has been reached.
5554 TestAuthHelper auth_helper2;
5555 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265556 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105557
5558 // Run until the auth callback for the first request is invoked.
5559 auth_helper1.WaitForAuth();
5560 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265561 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5562 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395563 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105564
5565 // Make connect jobs succeed, then cancel the first request, which should
5566 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5567 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5568 auth_helper1.handle()->Reset();
5569 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265570 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105571
5572 // The second ConnectJob should succeed.
5573 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5574 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265575 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105576}
5577
5578// Makes sure that when a bound request is destroyed, a new ConnectJob is
5579// created for another group, if needed.
5580TEST_F(ClientSocketPoolBaseTest,
5581 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5582 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5583 connect_job_factory_->set_job_type(
5584 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5585
5586 // First request creates a ConnectJob.
5587 TestAuthHelper auth_helper1;
5588 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265589 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105590
5591 // A second request come in, but no new ConnectJob is needed, since the limit
5592 // has been reached.
5593 TestAuthHelper auth_helper2;
5594 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395595 ClientSocketPool::RespectLimits::ENABLED,
5596 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265597 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5598 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105599
5600 // Run until the auth callback for the first request is invoked.
5601 auth_helper1.WaitForAuth();
5602 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265603 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5604 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395605 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265606 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5607 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395608 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105609
5610 // Make connect jobs succeed, then cancel the first request, which should
5611 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5612 // other group.
5613 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5614 auth_helper1.handle()->Reset();
5615 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265616 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5617 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105618
5619 // The second ConnectJob should succeed.
5620 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5621 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265622 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5623 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105624}
5625
5626// Test that once an auth challenge is bound, that's the request that gets all
5627// subsequent calls and the socket itself.
5628TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5629 CreatePool(1, 1);
5630 connect_job_factory_->set_job_type(
5631 TestConnectJob::kMockAuthChallengeTwiceJob);
5632
5633 // First request creates a ConnectJob.
5634 TestAuthHelper auth_helper1;
5635 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265636 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105637
5638 // A second, higher priority request is made.
5639 TestAuthHelper auth_helper2;
5640 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265641 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105642
5643 // Run until the auth callback for the second request is invoked.
5644 auth_helper2.WaitForAuth();
5645 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265646 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5647 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395648 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105649
5650 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5651 // ConnectJob.
5652 TestAuthHelper auth_helper3;
5653 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265654 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105655
5656 // Start a higher job that ignores limits, creating a hanging socket. It
5657 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5658 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5659 TestAuthHelper auth_helper4;
5660 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5661 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265662 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105663
5664 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5665 // again.
5666 auth_helper2.RestartWithAuth();
5667 auth_helper2.WaitForAuth();
5668 EXPECT_EQ(0, auth_helper1.auth_count());
5669 EXPECT_FALSE(auth_helper1.have_result());
5670 EXPECT_EQ(2, auth_helper2.auth_count());
5671 EXPECT_FALSE(auth_helper2.have_result());
5672 EXPECT_EQ(0, auth_helper3.auth_count());
5673 EXPECT_FALSE(auth_helper3.have_result());
5674 EXPECT_EQ(0, auth_helper4.auth_count());
5675 EXPECT_FALSE(auth_helper4.have_result());
5676
5677 // Advance auth again, and |auth_helper2| should get the socket.
5678 auth_helper2.RestartWithAuth();
5679 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5680 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5681 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265682 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5683 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105684 EXPECT_EQ(0, auth_helper1.auth_count());
5685 EXPECT_FALSE(auth_helper1.have_result());
5686 EXPECT_EQ(0, auth_helper3.auth_count());
5687 EXPECT_FALSE(auth_helper3.have_result());
5688 EXPECT_EQ(0, auth_helper4.auth_count());
5689 EXPECT_FALSE(auth_helper4.have_result());
5690
5691 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5692 // socket request should be able to claim it.
5693 auth_helper2.handle()->Reset();
5694 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5695 EXPECT_EQ(0, auth_helper1.auth_count());
5696 EXPECT_FALSE(auth_helper1.have_result());
5697 EXPECT_EQ(0, auth_helper3.auth_count());
5698 EXPECT_FALSE(auth_helper3.have_result());
5699 EXPECT_EQ(0, auth_helper4.auth_count());
5700}
5701
David Benjaminbac8dff2019-08-07 01:30:415702enum class RefreshType {
5703 kServer,
5704 kProxy,
5705};
5706
5707// Common base class to test RefreshGroup() when called from either
5708// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5709//
5710// Tests which test behavior specific to one or the other case should use
5711// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5712// when the pool's proxy matches.
5713class ClientSocketPoolBaseRefreshTest
5714 : public ClientSocketPoolBaseTest,
5715 public testing::WithParamInterface<RefreshType> {
5716 public:
5717 void CreatePoolForRefresh(int max_sockets,
5718 int max_sockets_per_group,
5719 bool enable_backup_connect_jobs = false) {
5720 switch (GetParam()) {
5721 case RefreshType::kServer:
5722 CreatePool(max_sockets, max_sockets_per_group,
5723 enable_backup_connect_jobs);
5724 break;
5725 case RefreshType::kProxy:
5726 CreatePoolWithIdleTimeouts(
5727 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5728 ClientSocketPool::used_idle_socket_timeout(),
5729 enable_backup_connect_jobs,
Eric Orth5ccc3f02021-09-23 00:01:575730 PacResultElementToProxyServer("HTTPS myproxy:70"));
David Benjaminbac8dff2019-08-07 01:30:415731 break;
5732 }
5733 }
5734
5735 static ClientSocketPool::GroupId GetGroupId() {
Eric Ortha2e7773212021-06-22 21:49:555736 return TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415737 }
5738
David Benjamin6dd7e882019-10-10 02:35:235739 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5740 // Note this GroupId will match GetGroupId() unless
5741 // kPartitionConnectionsByNetworkIsolationKey is enabled.
Matt Menke4807a9a2020-11-21 00:14:415742 const SchemefulSite kSite(GURL("https://b/"));
5743 const NetworkIsolationKey kNetworkIsolationKey(kSite, kSite);
Eric Ortha2e7773212021-06-22 21:49:555744 return TestGroupId("a", 443, url::kHttpsScheme,
David Benjamin6dd7e882019-10-10 02:35:235745 PrivacyMode::PRIVACY_MODE_DISABLED,
5746 kNetworkIsolationKey);
5747 }
5748
David Benjaminbac8dff2019-08-07 01:30:415749 void OnSSLConfigForServerChanged() {
5750 switch (GetParam()) {
5751 case RefreshType::kServer:
5752 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5753 break;
5754 case RefreshType::kProxy:
5755 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5756 break;
5757 }
5758 }
5759};
5760
5761INSTANTIATE_TEST_SUITE_P(RefreshType,
5762 ClientSocketPoolBaseRefreshTest,
5763 ::testing::Values(RefreshType::kServer,
5764 RefreshType::kProxy));
5765
5766TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5767 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5768 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245769
5770 // First job will be waiting until it gets aborted.
5771 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5772
5773 ClientSocketHandle handle;
5774 TestCompletionCallback callback;
5775 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525776 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285777 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5778 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5779 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245780 IsError(ERR_IO_PENDING));
5781
5782 // Switch connect job types, so creating a new ConnectJob will result in
5783 // success.
5784 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5785
David Benjaminbac8dff2019-08-07 01:30:415786 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245787 EXPECT_EQ(OK, callback.WaitForResult());
5788 ASSERT_TRUE(handle.socket());
5789 EXPECT_EQ(0, pool_->IdleSocketCount());
5790 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5791 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5792 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5793 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5794}
5795
David Benjaminbac8dff2019-08-07 01:30:415796TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235797 base::test::ScopedFeatureList feature_list;
5798 feature_list.InitAndEnableFeature(
5799 features::kPartitionConnectionsByNetworkIsolationKey);
5800
David Benjaminbac8dff2019-08-07 01:30:415801 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5802 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235803 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245804
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:215805 EXPECT_EQ(
5806 OK, pool_->RequestSockets(kGroupId, params_, absl::nullopt, 2,
5807 CompletionOnceCallback(), NetLogWithSource()));
5808
5809 EXPECT_EQ(
5810 OK, pool_->RequestSockets(kGroupIdInPartition, params_, absl::nullopt, 2,
5811 CompletionOnceCallback(), NetLogWithSource()));
Matt Menkebf3c767d2019-04-15 23:28:245812 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235813 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5814 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245815 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235816 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245817
David Benjaminbac8dff2019-08-07 01:30:415818 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245819 EXPECT_EQ(0, pool_->IdleSocketCount());
5820 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235821 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245822}
5823
5824TEST_F(ClientSocketPoolBaseTest,
5825 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5826 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415827 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555828 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415829 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555830 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245831
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:215832 EXPECT_EQ(
5833 OK, pool_->RequestSockets(kOtherGroupId, params_, absl::nullopt, 2,
5834 CompletionOnceCallback(), NetLogWithSource()));
Matt Menkebf3c767d2019-04-15 23:28:245835 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5836 EXPECT_EQ(2, pool_->IdleSocketCount());
5837 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5838
David Benjaminbac8dff2019-08-07 01:30:415839 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245840 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5841 EXPECT_EQ(2, pool_->IdleSocketCount());
5842 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5843}
5844
David Benjaminbac8dff2019-08-07 01:30:415845TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5846 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5847 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245848
5849 ClientSocketHandle handle;
5850 TestCompletionCallback callback;
5851 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525852 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285853 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5854 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5855 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245856 IsOk());
5857 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5858 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5859
David Benjaminbac8dff2019-08-07 01:30:415860 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245861
5862 handle.Reset();
5863 EXPECT_EQ(0, pool_->IdleSocketCount());
5864 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5865}
5866
5867TEST_F(ClientSocketPoolBaseTest,
5868 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5869 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415870 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555871 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415872 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555873 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245874
5875 ClientSocketHandle handle;
5876 TestCompletionCallback callback;
5877 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525878 handle.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285879 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5880 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5881 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245882 IsOk());
5883 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5884 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5885
David Benjaminbac8dff2019-08-07 01:30:415886 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245887
5888 handle.Reset();
5889 EXPECT_EQ(1, pool_->IdleSocketCount());
5890 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5891 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5892}
5893
David Benjaminbac8dff2019-08-07 01:30:415894TEST_P(ClientSocketPoolBaseRefreshTest,
5895 RefreshGroupReplacesBoundConnectJobOnConnect) {
5896 CreatePoolForRefresh(1, 1);
5897 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245898 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5899
5900 TestAuthHelper auth_helper;
5901 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5902 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5903 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5904
5905 auth_helper.WaitForAuth();
5906
5907 // This should update the generation, but not cancel the old ConnectJob - it's
5908 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415909 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245910
5911 // Providing auth credentials and restarting the request with them will cause
5912 // the ConnectJob to complete successfully, but the result will be discarded
5913 // because of the generation mismatch.
5914 auth_helper.RestartWithAuth();
5915
5916 // Despite using ConnectJobs that simulate a single challenge, a second
5917 // challenge will be seen, due to using a new ConnectJob.
5918 auth_helper.WaitForAuth();
5919 auth_helper.RestartWithAuth();
5920
5921 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5922 EXPECT_TRUE(auth_helper.handle()->socket());
5923 EXPECT_EQ(2, auth_helper.auth_count());
5924
5925 // When released, the socket will be returned to the socket pool, and
5926 // available for reuse.
5927 auth_helper.handle()->Reset();
5928 EXPECT_EQ(1, pool_->IdleSocketCount());
5929 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5930 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5931}
5932
David Benjaminbac8dff2019-08-07 01:30:415933TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5934 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5935 kUnusedIdleSocketTimeout,
5936 ClientSocketPool::used_idle_socket_timeout(),
5937 false /* no backup connect jobs */,
Eric Orth5ccc3f02021-09-23 00:01:575938 PacResultElementToProxyServer("HTTPS myproxy:70"));
David Benjaminbac8dff2019-08-07 01:30:415939
5940 const ClientSocketPool::GroupId kGroupId1 =
Eric Ortha2e7773212021-06-22 21:49:555941 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415942 const ClientSocketPool::GroupId kGroupId2 =
Eric Ortha2e7773212021-06-22 21:49:555943 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415944 const ClientSocketPool::GroupId kGroupId3 =
Eric Ortha2e7773212021-06-22 21:49:555945 TestGroupId("c", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415946
5947 // Make three sockets in three different groups. The third socket is released
5948 // to the pool as idle.
5949 ClientSocketHandle handle1, handle2, handle3;
5950 TestCompletionCallback callback;
5951 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525952 handle1.Init(kGroupId1, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415953 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5954 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5955 pool_.get(), NetLogWithSource()),
5956 IsOk());
5957 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525958 handle2.Init(kGroupId2, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415959 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5960 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5961 pool_.get(), NetLogWithSource()),
5962 IsOk());
5963 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525964 handle3.Init(kGroupId3, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415965 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5966 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5967 pool_.get(), NetLogWithSource()),
5968 IsOk());
5969 handle3.Reset();
5970 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5971 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5972 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5973 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5974 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5975 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5976
5977 // Changes to some other proxy do not affect the pool. The idle socket remains
5978 // alive and closing |handle2| makes the socket available for the pool.
5979 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5980
5981 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5982 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5983 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5984 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5985 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5986 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5987
5988 handle2.Reset();
5989 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5990 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5991
5992 // Changes to the matching proxy refreshes all groups.
5993 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5994
5995 // Idle sockets are closed.
5996 EXPECT_EQ(0, pool_->IdleSocketCount());
5997 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
5998 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
5999
6000 // The active socket, however, continues to be active.
6001 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
6002 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
6003
6004 // Closing it does not make it available for the pool.
6005 handle1.Reset();
6006 EXPECT_EQ(0, pool_->IdleSocketCount());
6007 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
6008}
6009
6010TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
6011 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
6012
Eric Ortha2e7773212021-06-22 21:49:556013 const ClientSocketPool::GroupId kGroupId = TestGroupId(
6014 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_DISABLED);
6015 const ClientSocketPool::GroupId kGroupIdPrivacy = TestGroupId(
6016 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_ENABLED);
David Benjaminbac8dff2019-08-07 01:30:416017 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:556018 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:416019
6020 // Make a socket in each groups.
6021 ClientSocketHandle handle1, handle2, handle3;
6022 TestCompletionCallback callback;
6023 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526024 handle1.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416025 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6026 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6027 pool_.get(), NetLogWithSource()),
6028 IsOk());
6029 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526030 handle2.Init(kGroupIdPrivacy, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416031 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6032 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6033 pool_.get(), NetLogWithSource()),
6034 IsOk());
6035 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526036 handle3.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416037 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6038 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6039 pool_.get(), NetLogWithSource()),
6040 IsOk());
6041 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
6042 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
6043 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6044 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
6045 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6046 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
6047
6048 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
6049
6050 // Active sockets continue to be active.
6051 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
6052 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
6053 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6054 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
6055 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6056 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
6057
6058 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
6059 // are unusable.
6060 handle1.Reset();
6061 handle2.Reset();
6062 handle3.Reset();
6063 EXPECT_EQ(1, pool_->IdleSocketCount());
6064 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
6065 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6066 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6067 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
6068}
6069
[email protected]f6d1d6eb2009-06-24 20:16:096070} // namespace
6071
6072} // namespace net