blob: b17eccad0d141201ecd92a095519ba3fcafbaabc [file] [log] [blame]
Avi Drissman64595482022-09-14 20:52:291// Copyright 2012 The Chromium Authors
[email protected]f6d1d6eb2009-06-24 20:16:092// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
tbansalf82cc8e2015-10-14 20:05:495#include <stdint.h>
Daniel Cheng5feb16f2022-02-28 06:52:076
dchengc7eeda422015-12-26 03:56:487#include <utility>
[email protected]51fdc7c2012-04-10 19:19:488#include <vector>
9
Hans Wennborg0924470b2020-04-27 21:08:0510#include "base/check_op.h"
Avi Drissman41c4a412023-01-11 22:45:3711#include "base/functional/bind.h"
12#include "base/functional/callback.h"
13#include "base/functional/callback_helpers.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"
Gabriel Charetted87f10f2022-03-31 00:44:2225#include "base/time/time.h"
[email protected]f3a1c642011-07-12 19:15:0326#include "base/values.h"
Matt Menke166443c2019-05-24 18:45:5927#include "net/base/features.h"
Eric Ortha2e7773212021-06-22 21:49:5528#include "net/base/host_port_pair.h"
[email protected]034df0f32013-01-07 23:17:4829#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5930#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0631#include "net/base/net_errors.h"
Brianna Goldsteina7593fca2022-09-28 02:59:3232#include "net/base/network_anonymization_key.h"
Matt Menkebdf777802019-04-22 19:38:5933#include "net/base/privacy_mode.h"
Matt Menkeaafff542019-04-22 22:09:3634#include "net/base/proxy_server.h"
Eric Orth5ccc3f02021-09-23 00:01:5735#include "net/base/proxy_string_util.h"
[email protected]ac790b42009-12-02 04:31:3136#include "net/base/request_priority.h"
Matt Menke4807a9a2020-11-21 00:14:4137#include "net/base/schemeful_site.h"
[email protected]f6d1d6eb2009-06-24 20:16:0938#include "net/base/test_completion_callback.h"
dalykedd30d982019-12-16 15:31:1039#include "net/dns/public/resolve_error_info.h"
Ben Schwartz3ff4dc1e62021-04-27 21:15:2340#include "net/dns/public/secure_dns_policy.h"
[email protected]277d5942010-08-11 21:02:3541#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5142#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0743#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0044#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1945#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0046#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5647#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4648#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0949#include "net/socket/client_socket_factory.h"
50#include "net/socket/client_socket_handle.h"
Eric Ortha9b8be02021-06-29 23:09:0851#include "net/socket/connect_job_factory.h"
tfarina5dd13c22016-11-16 12:08:2652#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2853#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5454#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1755#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4456#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1057#include "net/socket/stream_socket.h"
Daniel Cheng5feb16f2022-02-28 06:52:0758#include "net/socket/transport_client_socket_pool.h"
Matt Menke9fa17d52019-03-25 19:12:2659#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5160#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0161#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4062#include "net/test/test_with_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2863#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3864#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4865#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0966#include "testing/gtest/include/gtest/gtest.h"
Anton Bikineev068d2912021-05-15 20:43:5267#include "third_party/abseil-cpp/absl/types/optional.h"
Eric Ortha2e7773212021-06-22 21:49:5568#include "url/scheme_host_port.h"
69#include "url/url_constants.h"
[email protected]f6d1d6eb2009-06-24 20:16:0970
robpercival214763f2016-07-01 23:27:0171using net::test::IsError;
72using net::test::IsOk;
73
[email protected]51fdc7c2012-04-10 19:19:4874using ::testing::Invoke;
75using ::testing::Return;
76
[email protected]f6d1d6eb2009-06-24 20:16:0977namespace net {
78
79namespace {
80
[email protected]211d21722009-07-22 15:48:5381const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2082const int kDefaultMaxSocketsPerGroup = 2;
Peter Kastinge5a38ed2021-10-02 03:06:3583constexpr base::TimeDelta kUnusedIdleSocketTimeout = base::Seconds(10);
[email protected]0b7648c2009-07-06 20:14:0184
Matt Menkebdf777802019-04-22 19:38:5985ClientSocketPool::GroupId TestGroupId(
Eric Ortha2e7773212021-06-22 21:49:5586 base::StringPiece host,
Matt Menkebdf777802019-04-22 19:38:5987 int port = 80,
Eric Ortha2e7773212021-06-22 21:49:5588 base::StringPiece scheme = url::kHttpScheme,
Matt Menke166443c2019-05-24 18:45:5989 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
Brianna Goldsteina7593fca2022-09-28 02:59:3290 NetworkAnonymizationKey network_anonymization_key =
91 NetworkAnonymizationKey()) {
Eric Ortha2e7773212021-06-22 21:49:5592 return ClientSocketPool::GroupId(url::SchemeHostPort(scheme, host, port),
Brianna Goldsteina7593fca2022-09-28 02:59:3293 privacy_mode, network_anonymization_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.
Sean Maher5b9af51f2022-11-21 15:32:47384 base::SingleThreadTaskRunner::GetCurrentDefault()->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);
Sean Maher5b9af51f2022-11-21 15:32:47393 base::SingleThreadTaskRunner::GetCurrentDefault()->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);
Sean Maher5b9af51f2022-11-21 15:32:47410 base::SingleThreadTaskRunner::GetCurrentDefault()->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;
Sean Maher5b9af51f2022-11-21 15:32:47424 base::SingleThreadTaskRunner::GetCurrentDefault()->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) {
Sean Maher5b9af51f2022-11-21 15:32:47485 base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
Matt Menkeb57663b32019-03-01 17:17:10486 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,
Brianna Goldsteinabb3aac2022-10-07 12:06:00555 const NetworkAnonymizationKey& network_anonymization_key,
Eric Ortha9b8be02021-06-29 23:09:08556 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_;
Matt Reichhoff0049a0b72021-10-20 20:44:26716 RecordingNetLogObserver net_log_observer_;
Tom Sepez5bb7697a2023-01-16 20:48:52717
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_;
Tom Sepez5bb7697a2023-01-16 20:48:52720
721 // Must outlive `connect_job_factory_`
Matt Menke9fa17d52019-03-25 19:12:26722 std::unique_ptr<TransportClientSocketPool> pool_;
Tom Sepez5bb7697a2023-01-16 20:48:52723
724 raw_ptr<TestConnectJobFactory> connect_job_factory_;
[email protected]2431756e2010-09-29 20:26:13725 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09726};
727
[email protected]5fc08e32009-07-15 17:09:57728TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53729 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20730
[email protected]6ecf2b92011-12-15 01:14:52731 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06732 ClientSocketHandle handle;
Matt Reichhoff0049a0b72021-10-20 20:44:26733 NetLogWithSource net_log_with_source =
734 NetLogWithSource::Make(NetLogSourceType::NONE);
735
[email protected]034df0f32013-01-07 23:17:48736 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53737
Matt Menkef09e64c2019-04-23 22:16:28738 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:52739 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28740 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
741 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:26742 pool_.get(), net_log_with_source));
[email protected]f6d1d6eb2009-06-24 20:16:09743 EXPECT_TRUE(handle.is_initialized());
744 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48745 TestLoadTimingInfoConnectedNotReused(handle);
746
[email protected]f6d1d6eb2009-06-24 20:16:09747 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48748 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30749
Matt Reichhoff0049a0b72021-10-20 20:44:26750 auto entries =
751 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:40752
Matt Menke9fa17d52019-03-25 19:12:26753 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53754 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26755 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00756 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26757 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
758 EXPECT_TRUE(LogContainsEvent(
759 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
760 NetLogEventPhase::NONE));
761 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00762 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
763 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26764 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09765}
766
[email protected]ab838892009-06-30 18:49:05767TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53768 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20769
[email protected]ab838892009-06-30 18:49:05770 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Reichhoff0049a0b72021-10-20 20:44:26771 NetLogWithSource net_log_with_source =
772 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]9e743cd2010-03-16 07:03:53773
[email protected]2431756e2010-09-29 20:26:13774 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52775 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18776 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13777 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51778 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50779 EXPECT_EQ(
780 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:52781 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28782 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
783 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:26784 pool_.get(), net_log_with_source));
[email protected]2431756e2010-09-29 20:26:13785 EXPECT_FALSE(handle.socket());
786 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51787 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48788 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30789
Matt Reichhoff0049a0b72021-10-20 20:44:26790 auto entries =
791 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:40792
Matt Menke9fa17d52019-03-25 19:12:26793 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17794 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26795 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00796 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26797 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
798 EXPECT_TRUE(LogContainsEvent(
799 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
800 NetLogEventPhase::NONE));
801 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09802}
803
Matt Menke433de6d2020-03-04 00:24:11804// Test releasing an open socket into the socket pool, telling the socket pool
805// to close the socket.
806TEST_F(ClientSocketPoolBaseTest, ReleaseAndCloseConnection) {
807 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
808
809 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
810 ASSERT_TRUE(request(0)->handle()->socket());
811 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
812 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
813
814 EXPECT_EQ(0, pool_->IdleSocketCount());
815 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
816
817 ExpectSocketClosedWithReason(
818 source, TransportClientSocketPool::kClosedConnectionReturnedToPool);
819}
820
821TEST_F(ClientSocketPoolBaseTest, SocketWithUnreadDataReturnedToPool) {
822 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
823 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
824
825 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
826 ASSERT_TRUE(request(0)->handle()->socket());
827 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
828 EXPECT_TRUE(request(0)->handle()->socket()->IsConnected());
829 EXPECT_FALSE(request(0)->handle()->socket()->IsConnectedAndIdle());
830 ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE);
831
832 EXPECT_EQ(0, pool_->IdleSocketCount());
833 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
834
835 ExpectSocketClosedWithReason(
836 source, TransportClientSocketPool::kDataReceivedUnexpectedly);
837}
838
Matt Menkef6edce752019-03-19 17:21:56839// Make sure different groups do not share sockets.
840TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59841 base::test::ScopedFeatureList feature_list;
842 feature_list.InitAndEnableFeature(
843 features::kPartitionConnectionsByNetworkIsolationKey);
844
Matt Menkef6edce752019-03-19 17:21:56845 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
846
847 const HostPortPair kHostPortPairs[] = {
848 {"a", 80},
849 {"a", 443},
850 {"b", 80},
851 };
852
Eric Ortha2e7773212021-06-22 21:49:55853 const char* const kSchemes[] = {
854 url::kHttpScheme,
855 url::kHttpsScheme,
Matt Menkef6edce752019-03-19 17:21:56856 };
857
Matt Menkebdf777802019-04-22 19:38:59858 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
859 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56860
Matt Menke4807a9a2020-11-21 00:14:41861 const SchemefulSite kSiteA(GURL("http://a.test/"));
862 const SchemefulSite kSiteB(GURL("http://b.test/"));
Brianna Goldsteina7593fca2022-09-28 02:59:32863 const NetworkAnonymizationKey kNetworkAnonymizationKeys[] = {
864 NetworkAnonymizationKey(kSiteA, kSiteA, /*is_cross_site=*/false),
865 NetworkAnonymizationKey(kSiteB, kSiteB, /*is_cross_site=*/false),
Matt Menke166443c2019-05-24 18:45:59866 };
867
Ben Schwartz3ff4dc1e62021-04-27 21:15:23868 const SecureDnsPolicy kSecureDnsPolicys[] = {SecureDnsPolicy::kAllow,
869 SecureDnsPolicy::kDisable};
dalyk5f48a132019-10-14 15:20:19870
Matt Menkef6edce752019-03-19 17:21:56871 int total_idle_sockets = 0;
872
873 // Walk through each GroupId, making sure that requesting a socket for one
874 // group does not return a previously connected socket for another group.
875 for (const auto& host_port_pair : kHostPortPairs) {
876 SCOPED_TRACE(host_port_pair.ToString());
Eric Ortha2e7773212021-06-22 21:49:55877 for (const char* scheme : kSchemes) {
878 SCOPED_TRACE(scheme);
Matt Menkef6edce752019-03-19 17:21:56879 for (const auto& privacy_mode : kPrivacyModes) {
880 SCOPED_TRACE(privacy_mode);
Brianna Goldsteina7593fca2022-09-28 02:59:32881 for (const auto& network_anonymization_key :
882 kNetworkAnonymizationKeys) {
883 SCOPED_TRACE(network_anonymization_key.ToDebugString());
Ben Schwartz3ff4dc1e62021-04-27 21:15:23884 for (const auto& secure_dns_policy : kSecureDnsPolicys) {
885 SCOPED_TRACE(static_cast<int>(secure_dns_policy));
Matt Menkef6edce752019-03-19 17:21:56886
dalyk5f48a132019-10-14 15:20:19887 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56888
dalyk5f48a132019-10-14 15:20:19889 ClientSocketPool::GroupId group_id(
Eric Ortha2e7773212021-06-22 21:49:55890 url::SchemeHostPort(scheme, host_port_pair.host(),
891 host_port_pair.port()),
Brianna Goldsteina7593fca2022-09-28 02:59:32892 privacy_mode, network_anonymization_key, secure_dns_policy);
Matt Menkef6edce752019-03-19 17:21:56893
dalyk5f48a132019-10-14 15:20:19894 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56895
dalyk5f48a132019-10-14 15:20:19896 TestCompletionCallback callback;
897 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56898
dalyk5f48a132019-10-14 15:20:19899 // Since the group is empty, requesting a socket should not complete
900 // synchronously.
Anton Bikineev068d2912021-05-15 20:43:52901 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19902 DEFAULT_PRIORITY, SocketTag(),
903 ClientSocketPool::RespectLimits::ENABLED,
904 callback.callback(),
905 ClientSocketPool::ProxyAuthCallback(),
906 pool_.get(), NetLogWithSource()),
907 IsError(ERR_IO_PENDING));
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 EXPECT_THAT(callback.WaitForResult(), IsOk());
912 EXPECT_TRUE(handle.socket());
913 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
914 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56915
dalyk5f48a132019-10-14 15:20:19916 // Return socket to pool.
917 handle.Reset();
918 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56919
dalyk5f48a132019-10-14 15:20:19920 // Requesting a socket again should return the same socket as
921 // before, so should complete synchronously.
Anton Bikineev068d2912021-05-15 20:43:52922 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19923 DEFAULT_PRIORITY, SocketTag(),
924 ClientSocketPool::RespectLimits::ENABLED,
925 callback.callback(),
926 ClientSocketPool::ProxyAuthCallback(),
927 pool_.get(), NetLogWithSource()),
928 IsOk());
929 EXPECT_TRUE(handle.socket());
930 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56931
dalyk5f48a132019-10-14 15:20:19932 // Return socket to pool again.
933 handle.Reset();
934 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56935
dalyk5f48a132019-10-14 15:20:19936 ++total_idle_sockets;
937 }
Matt Menke166443c2019-05-24 18:45:59938 }
Matt Menkef6edce752019-03-19 17:21:56939 }
940 }
941 }
942}
943
[email protected]211d21722009-07-22 15:48:53944TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
945 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
946
[email protected]9e743cd2010-03-16 07:03:53947 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30948
Matt Menkec6b3edf72019-03-19 17:00:39949 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
950 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
951 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
952 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53953
[email protected]2431756e2010-09-29 20:26:13954 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53955 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13956 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53957
Matt Menkec6b3edf72019-03-19 17:00:39958 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
959 IsError(ERR_IO_PENDING));
960 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
961 IsError(ERR_IO_PENDING));
962 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
963 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53964
[email protected]2431756e2010-09-29 20:26:13965 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53966
[email protected]2431756e2010-09-29 20:26:13967 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53968 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13969 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53970
971 EXPECT_EQ(1, GetOrderOfRequest(1));
972 EXPECT_EQ(2, GetOrderOfRequest(2));
973 EXPECT_EQ(3, GetOrderOfRequest(3));
974 EXPECT_EQ(4, GetOrderOfRequest(4));
975 EXPECT_EQ(5, GetOrderOfRequest(5));
976 EXPECT_EQ(6, GetOrderOfRequest(6));
977 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17978
979 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13980 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53981}
982
983TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
984 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
985
[email protected]9e743cd2010-03-16 07:03:53986 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30987
[email protected]211d21722009-07-22 15:48:53988 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39989 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
990 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
991 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
992 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53993
[email protected]2431756e2010-09-29 20:26:13994 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53995 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13996 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53997
998 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:39999 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1000 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531001
[email protected]2431756e2010-09-29 20:26:131002 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531003
[email protected]2431756e2010-09-29 20:26:131004 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531005 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131006 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531007
1008 EXPECT_EQ(1, GetOrderOfRequest(1));
1009 EXPECT_EQ(2, GetOrderOfRequest(2));
1010 EXPECT_EQ(3, GetOrderOfRequest(3));
1011 EXPECT_EQ(4, GetOrderOfRequest(4));
1012 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:171013
1014 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131015 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531016}
1017
1018TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
1019 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1020
Matt Menkec6b3edf72019-03-19 17:00:391021 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
1022 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
1023 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1024 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:531025
[email protected]2431756e2010-09-29 20:26:131026 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531027 client_socket_factory_.allocation_count());
1028
Matt Menkec6b3edf72019-03-19 17:00:391029 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
1030 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1031 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531032
[email protected]2431756e2010-09-29 20:26:131033 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531034
[email protected]2431756e2010-09-29 20:26:131035 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531036
1037 // First 4 requests don't have to wait, and finish in order.
1038 EXPECT_EQ(1, GetOrderOfRequest(1));
1039 EXPECT_EQ(2, GetOrderOfRequest(2));
1040 EXPECT_EQ(3, GetOrderOfRequest(3));
1041 EXPECT_EQ(4, GetOrderOfRequest(4));
1042
Matt Menkec6b3edf72019-03-19 17:00:391043 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1044 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531045 EXPECT_EQ(7, GetOrderOfRequest(5));
1046 EXPECT_EQ(6, GetOrderOfRequest(6));
1047 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171048
1049 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131050 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531051}
1052
rdsmith29dbad12017-02-17 02:22:181053// Test reprioritizing a request before completion doesn't interfere with
1054// its completion.
1055TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1056 CreatePool(kDefaultMaxSockets, 1);
1057
Matt Menkec6b3edf72019-03-19 17:00:391058 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1059 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181060 EXPECT_TRUE(request(0)->handle()->socket());
1061 EXPECT_FALSE(request(1)->handle()->socket());
1062
Lily Chenecebf932018-11-02 17:15:431063 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181064
1065 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1066
1067 EXPECT_TRUE(request(1)->handle()->socket());
1068}
1069
1070// Reprioritize a request up past another one and make sure that changes the
1071// completion order.
1072TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1073 CreatePool(kDefaultMaxSockets, 1);
1074
Matt Menkec6b3edf72019-03-19 17:00:391075 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1076 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1077 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181078 EXPECT_TRUE(request(0)->handle()->socket());
1079 EXPECT_FALSE(request(1)->handle()->socket());
1080 EXPECT_FALSE(request(2)->handle()->socket());
1081
1082 request(2)->handle()->SetPriority(HIGHEST);
1083
1084 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1085
1086 EXPECT_EQ(1, GetOrderOfRequest(1));
1087 EXPECT_EQ(3, GetOrderOfRequest(2));
1088 EXPECT_EQ(2, GetOrderOfRequest(3));
1089}
1090
1091// Reprioritize a request without changing relative priorities and check
1092// that the order doesn't change.
1093TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1094 CreatePool(kDefaultMaxSockets, 1);
1095
Matt Menkec6b3edf72019-03-19 17:00:391096 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1097 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1098 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181099 EXPECT_TRUE(request(0)->handle()->socket());
1100 EXPECT_FALSE(request(1)->handle()->socket());
1101 EXPECT_FALSE(request(2)->handle()->socket());
1102
1103 request(2)->handle()->SetPriority(MEDIUM);
1104
1105 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1106
1107 EXPECT_EQ(1, GetOrderOfRequest(1));
1108 EXPECT_EQ(2, GetOrderOfRequest(2));
1109 EXPECT_EQ(3, GetOrderOfRequest(3));
1110}
1111
1112// Reprioritize a request past down another one and make sure that changes the
1113// completion order.
1114TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1115 CreatePool(kDefaultMaxSockets, 1);
1116
Matt Menkec6b3edf72019-03-19 17:00:391117 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1118 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1119 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181120 EXPECT_TRUE(request(0)->handle()->socket());
1121 EXPECT_FALSE(request(1)->handle()->socket());
1122 EXPECT_FALSE(request(2)->handle()->socket());
1123
1124 request(1)->handle()->SetPriority(LOW);
1125
1126 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1127
1128 EXPECT_EQ(1, GetOrderOfRequest(1));
1129 EXPECT_EQ(3, GetOrderOfRequest(2));
1130 EXPECT_EQ(2, GetOrderOfRequest(3));
1131}
1132
1133// Reprioritize a request to the same level as another and confirm it is
1134// put after the old request.
1135TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1136 CreatePool(kDefaultMaxSockets, 1);
1137
Matt Menkec6b3edf72019-03-19 17:00:391138 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1139 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1140 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181141 EXPECT_TRUE(request(0)->handle()->socket());
1142 EXPECT_FALSE(request(1)->handle()->socket());
1143 EXPECT_FALSE(request(2)->handle()->socket());
1144
1145 request(1)->handle()->SetPriority(MEDIUM);
1146
1147 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1148
1149 EXPECT_EQ(1, GetOrderOfRequest(1));
1150 EXPECT_EQ(3, GetOrderOfRequest(2));
1151 EXPECT_EQ(2, GetOrderOfRequest(3));
1152}
1153
[email protected]211d21722009-07-22 15:48:531154TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1155 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1156
Matt Menkec6b3edf72019-03-19 17:00:391157 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1158 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1159 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1160 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531161
[email protected]2431756e2010-09-29 20:26:131162 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531163 client_socket_factory_.allocation_count());
1164
Matt Menkec6b3edf72019-03-19 17:00:391165 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1166 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1167 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531168
[email protected]2431756e2010-09-29 20:26:131169 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531170
[email protected]2431756e2010-09-29 20:26:131171 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531172 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131173 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531174
1175 // First 4 requests don't have to wait, and finish in order.
1176 EXPECT_EQ(1, GetOrderOfRequest(1));
1177 EXPECT_EQ(2, GetOrderOfRequest(2));
1178 EXPECT_EQ(3, GetOrderOfRequest(3));
1179 EXPECT_EQ(4, GetOrderOfRequest(4));
1180
1181 // Request ("b", 7) has the highest priority, but we can't make new socket for
1182 // group "b", because it has reached the per-group limit. Then we make
1183 // socket for ("c", 6), because it has higher priority than ("a", 4),
1184 // and we still can't make a socket for group "b".
1185 EXPECT_EQ(5, GetOrderOfRequest(5));
1186 EXPECT_EQ(6, GetOrderOfRequest(6));
1187 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171188
1189 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131190 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531191}
1192
1193// Make sure that we count connecting sockets against the total limit.
1194TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1195 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1196
Matt Menkec6b3edf72019-03-19 17:00:391197 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1198 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1199 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531200
1201 // Create one asynchronous request.
1202 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391203 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1204 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531205
[email protected]6b175382009-10-13 06:47:471206 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1207 // actually become pending until 2ms after they have been created. In order
1208 // to flush all tasks, we need to wait so that we know there are no
1209 // soon-to-be-pending tasks waiting.
Peter Kastinge5a38ed2021-10-02 03:06:351210 FastForwardBy(base::Milliseconds(10));
[email protected]6b175382009-10-13 06:47:471211
[email protected]211d21722009-07-22 15:48:531212 // The next synchronous request should wait for its turn.
1213 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391214 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1215 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531216
[email protected]2431756e2010-09-29 20:26:131217 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531218
[email protected]2431756e2010-09-29 20:26:131219 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531220 client_socket_factory_.allocation_count());
1221
1222 EXPECT_EQ(1, GetOrderOfRequest(1));
1223 EXPECT_EQ(2, GetOrderOfRequest(2));
1224 EXPECT_EQ(3, GetOrderOfRequest(3));
1225 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171226 EXPECT_EQ(5, GetOrderOfRequest(5));
1227
1228 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131229 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531230}
1231
[email protected]6427fe22010-04-16 22:27:411232TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1233 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1234 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1235
Matt Menkec6b3edf72019-03-19 17:00:391236 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1237 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1238 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1239 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411240
1241 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1242
1243 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1244
Matt Menkec6b3edf72019-03-19 17:00:391245 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1246 IsError(ERR_IO_PENDING));
1247 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1248 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411249
1250 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1251
[email protected]2431756e2010-09-29 20:26:131252 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411253 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131254 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411255 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131256 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1257 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411258 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1259}
1260
[email protected]d7027bb2010-05-10 18:58:541261TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1262 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1263 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1264
[email protected]6ecf2b92011-12-15 01:14:521265 TestCompletionCallback callback;
Peter Kastinge20797db2022-08-18 19:44:141266 ClientSocketHandle stalled_handle;
1267 EXPECT_EQ(ERR_IO_PENDING,
1268 stalled_handle.Init(
1269 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
1270 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1271 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1272 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541273
1274 ClientSocketHandle handles[4];
Tsuyoshi Horo17ef47d02022-06-30 10:58:271275 for (auto& handle : handles) {
1276 EXPECT_EQ(
1277 ERR_IO_PENDING,
1278 handle.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
1279 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1280 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1281 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541282 }
1283
1284 // One will be stalled, cancel all the handles now.
1285 // This should hit the OnAvailableSocketSlot() code where we previously had
1286 // stalled groups, but no longer have any.
Tsuyoshi Horo17ef47d02022-06-30 10:58:271287 for (auto& handle : handles)
1288 handle.Reset();
[email protected]d7027bb2010-05-10 18:58:541289}
1290
[email protected]eb5a99382010-07-11 03:18:261291TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541292 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1293 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1294
[email protected]eb5a99382010-07-11 03:18:261295 {
1296 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521297 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261298 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Eric Ortha2e7773212021-06-22 21:49:551299 EXPECT_EQ(OK, handles[i].Init(TestGroupId("a" + base::NumberToString(i)),
1300 params_, absl::nullopt, DEFAULT_PRIORITY,
1301 SocketTag(),
1302 ClientSocketPool::RespectLimits::ENABLED,
1303 callbacks[i].callback(),
1304 ClientSocketPool::ProxyAuthCallback(),
1305 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261306 }
1307
1308 // Force a stalled group.
1309 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521310 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201311 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391312 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521313 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281314 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1315 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1316 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261317
1318 // Cancel the stalled request.
1319 stalled_handle.Reset();
1320
1321 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1322 EXPECT_EQ(0, pool_->IdleSocketCount());
1323
1324 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541325 }
1326
[email protected]43a21b82010-06-10 21:30:541327 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1328 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261329}
[email protected]43a21b82010-06-10 21:30:541330
[email protected]eb5a99382010-07-11 03:18:261331TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1332 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1333 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1334
1335 {
1336 ClientSocketHandle handles[kDefaultMaxSockets];
1337 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521338 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201339 EXPECT_EQ(ERR_IO_PENDING,
Eric Ortha2e7773212021-06-22 21:49:551340 handles[i].Init(
1341 TestGroupId("a" + base::NumberToString(i)), params_,
1342 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1343 ClientSocketPool::RespectLimits::ENABLED,
1344 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1345 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261346 }
1347
1348 // Force a stalled group.
1349 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1350 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521351 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201352 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391353 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521354 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281355 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1356 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1357 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261358
1359 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261360 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1361 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1362 TestGroupId("foo")));
1363 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1364 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261365
1366 // Cancel the stalled request.
1367 handles[0].Reset();
1368
[email protected]eb5a99382010-07-11 03:18:261369 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261370 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1371 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1372 TestGroupId("foo")));
1373 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1374 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261375
1376 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011377 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261378
1379 EXPECT_EQ(kDefaultMaxSockets + 1,
1380 client_socket_factory_.allocation_count());
1381 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261382 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1383 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1384 TestGroupId("foo")));
1385 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1386 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261387
1388 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541389 }
1390
[email protected]eb5a99382010-07-11 03:18:261391 EXPECT_EQ(1, pool_->IdleSocketCount());
1392}
[email protected]43a21b82010-06-10 21:30:541393
[email protected]eb5a99382010-07-11 03:18:261394TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1395 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1396 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541397
[email protected]eb5a99382010-07-11 03:18:261398 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521399 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261400 {
[email protected]51fdc7c2012-04-10 19:19:481401 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261402 ClientSocketHandle handles[kDefaultMaxSockets];
1403 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:391404 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281405 OK, handles[i].Init(
Eric Ortha2e7773212021-06-22 21:49:551406 TestGroupId(base::StringPrintf("take-2-%d", i)), params_,
Anton Bikineev068d2912021-05-15 20:43:521407 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:281408 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1409 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1410 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261411 }
1412
1413 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1414 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481415 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261416
1417 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201418 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391419 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521420 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281421 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1422 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1423 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481424 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261425
1426 // Dropping out of scope will close all handles and return them to idle.
1427 }
[email protected]43a21b82010-06-10 21:30:541428
1429 // But if we wait for it, the released idle sockets will be closed in
1430 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011431 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261432
1433 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1434 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541435}
1436
1437// Regression test for http://crbug.com/40952.
1438TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261439 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1440 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541441 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1442
1443 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1444 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521445 TestCompletionCallback callback;
Eric Ortha2e7773212021-06-22 21:49:551446 EXPECT_EQ(
1447 OK,
1448 handle.Init(TestGroupId("a" + base::NumberToString(i)), params_,
1449 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1450 ClientSocketPool::RespectLimits::ENABLED,
1451 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1452 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541453 }
1454
1455 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281456 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541457
1458 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1459 // reuse a socket.
1460 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1461 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521462 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541463
Eric Ortha2e7773212021-06-22 21:49:551464 // "a0" is special here, since it should be the first entry in the sorted map,
[email protected]43a21b82010-06-10 21:30:541465 // which is the one which we would close an idle socket for. We shouldn't
1466 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391467 EXPECT_EQ(OK, handle.Init(
Eric Ortha2e7773212021-06-22 21:49:551468 TestGroupId("a0"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281469 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391470 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1471 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541472
1473 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1474 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1475}
1476
[email protected]ab838892009-06-30 18:49:051477TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531478 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091479
Matt Menkec6b3edf72019-03-19 17:00:391480 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1481 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1482 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1483 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1484 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1485 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1486 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1487 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091488
[email protected]2431756e2010-09-29 20:26:131489 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201490 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1491 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131492 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1493 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091494
[email protected]c9d6a1d2009-07-14 16:15:201495 EXPECT_EQ(1, GetOrderOfRequest(1));
1496 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031497 EXPECT_EQ(8, GetOrderOfRequest(3));
1498 EXPECT_EQ(6, GetOrderOfRequest(4));
1499 EXPECT_EQ(4, GetOrderOfRequest(5));
1500 EXPECT_EQ(3, GetOrderOfRequest(6));
1501 EXPECT_EQ(5, GetOrderOfRequest(7));
1502 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171503
1504 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131505 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091506}
1507
[email protected]ab838892009-06-30 18:49:051508TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531509 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091510
Matt Menkec6b3edf72019-03-19 17:00:391511 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1512 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1513 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1514 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1515 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1516 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1517 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091518
[email protected]2431756e2010-09-29 20:26:131519 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091520
[email protected]2431756e2010-09-29 20:26:131521 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011522 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201523
[email protected]2431756e2010-09-29 20:26:131524 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201525 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131526 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1527 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091528}
1529
Matt Menke7eb405e2019-04-25 20:48:211530TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1531 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1532
1533 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1534 ClientSocketHandle handle;
1535 TestCompletionCallback callback;
1536 EXPECT_EQ(
1537 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521538 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke7eb405e2019-04-25 20:48:211539 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1540 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1541 pool_.get(), NetLogWithSource()));
1542
1543 EXPECT_THAT(callback.WaitForResult(), IsOk());
1544 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1545 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1546 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1547 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1548
1549 handle.ResetAndCloseSocket();
1550 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1551}
1552
Matt Menke99251ea42019-04-25 22:59:021553// This test will start up a socket request and then call Reset() on the handle.
1554// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211555TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531556 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201557
[email protected]ab838892009-06-30 18:49:051558 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131559 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521560 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501561 EXPECT_EQ(
1562 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521563 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281564 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1565 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1566 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131567 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211568 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1569 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1570}
1571
Matt Menke99251ea42019-04-25 22:59:021572// This test will start up a socket request and then call ResetAndCloseSocket()
1573// on the handle. The pending ConnectJob or connected socket should be
1574// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211575TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1576 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1577
Matt Menke99251ea42019-04-25 22:59:021578 // When true, the socket connects before it's canceled.
1579 for (bool cancel_when_callback_pending : {false, true}) {
1580 if (cancel_when_callback_pending) {
1581 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1582 } else {
1583 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1584 }
1585 ClientSocketHandle handle;
1586 TestCompletionCallback callback;
1587 EXPECT_EQ(
1588 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521589 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021590 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1591 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1592 pool_.get(), NetLogWithSource()));
1593 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1594 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1595
1596 if (cancel_when_callback_pending) {
1597 client_socket_factory_.SignalJobs();
1598 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1599 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1600 }
1601
1602 handle.ResetAndCloseSocket();
1603 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1604 }
Matt Menke7eb405e2019-04-25 20:48:211605}
1606
1607TEST_F(ClientSocketPoolBaseTest,
1608 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1609 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1610
Matt Menke99251ea42019-04-25 22:59:021611 // When true, the sockets connect before they're canceled.
1612 for (bool cancel_when_callback_pending : {false, true}) {
1613 if (cancel_when_callback_pending) {
1614 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1615 } else {
1616 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1617 }
Matt Menke7eb405e2019-04-25 20:48:211618
Matt Menke99251ea42019-04-25 22:59:021619 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1620 TestCompletionCallback callback;
1621 // Make |kDefaultMaxSockets + 1| socket requests.
1622 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1623 std::unique_ptr<ClientSocketHandle> handle =
1624 std::make_unique<ClientSocketHandle>();
1625 EXPECT_EQ(ERR_IO_PENDING,
1626 handle->Init(
Anton Bikineev068d2912021-05-15 20:43:521627 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021628 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1629 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1630 pool_.get(), NetLogWithSource()));
1631 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211632 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021633 EXPECT_EQ(
1634 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1635 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1636 }
1637
1638 if (cancel_when_callback_pending) {
1639 client_socket_factory_.SignalJobs();
1640 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1641 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1642 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1643 }
1644
1645 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1646 // or close a socket, since there are more requests than ConnectJobs or
1647 // sockets.
1648 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1649 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1650 if (cancel_when_callback_pending) {
1651 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1652 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1653 } else {
1654 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211655 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1656 }
Matt Menke99251ea42019-04-25 22:59:021657
1658 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1659 // or close a socket.
1660 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1661 handles[i]->ResetAndCloseSocket();
1662 if (i > 0) {
1663 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1664 if (cancel_when_callback_pending) {
1665 EXPECT_EQ(i,
1666 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1667 } else {
1668 EXPECT_EQ(static_cast<size_t>(i),
1669 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1670 }
1671 } else {
1672 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1673 }
1674 }
Matt Menke7eb405e2019-04-25 20:48:211675 }
[email protected]f6d1d6eb2009-06-24 20:16:091676}
1677
[email protected]ab838892009-06-30 18:49:051678TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531679 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201680
[email protected]ab838892009-06-30 18:49:051681 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061682 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521683 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091684
Matt Menke28ac03e2019-02-25 22:25:501685 EXPECT_EQ(
1686 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521687 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281688 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1689 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1690 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091691
1692 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211693 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1694 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091695
Matt Menke7eb405e2019-04-25 20:48:211696 // This will create a second ConnectJob, since the other ConnectJob was
1697 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521698 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501699 EXPECT_EQ(
1700 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521701 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281702 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501703 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1704 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091705
Matt Menke7eb405e2019-04-25 20:48:211706 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1707 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1708
robpercival214763f2016-07-01 23:27:011709 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091710 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211711 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1712 // One ConnectJob completed, and its socket is now assigned to |handle|.
1713 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1714 // The other ConnectJob should have either completed, or still be connecting.
1715 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1716 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091717
1718 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211719 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1720 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1721 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1722 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091723}
1724
[email protected]ab838892009-06-30 18:49:051725TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531726 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091727
Matt Menkec6b3edf72019-03-19 17:00:391728 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1729 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1730 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1731 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1732 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1733 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1734 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091735
1736 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201737 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131738 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1739 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091740
[email protected]2431756e2010-09-29 20:26:131741 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091742
[email protected]c9d6a1d2009-07-14 16:15:201743 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1744 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131745 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1746 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091747
[email protected]c9d6a1d2009-07-14 16:15:201748 EXPECT_EQ(1, GetOrderOfRequest(1));
1749 EXPECT_EQ(2, GetOrderOfRequest(2));
1750 EXPECT_EQ(5, GetOrderOfRequest(3));
1751 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131752 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1753 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201754 EXPECT_EQ(4, GetOrderOfRequest(6));
1755 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171756
1757 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131758 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091759}
1760
mmenke33d24423d2015-05-19 19:41:091761// Function to be used as a callback on socket request completion. It first
1762// disconnects the successfully connected socket from the first request, and
1763// then reuses the ClientSocketHandle to request another socket.
1764//
1765// |nested_callback| is called with the result of the second socket request.
1766void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261767 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091768 TestConnectJobFactory* test_connect_job_factory,
1769 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411770 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091771 int first_request_result) {
robpercival214763f2016-07-01 23:27:011772 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091773
1774 test_connect_job_factory->set_job_type(next_job_type);
1775
1776 // Don't allow reuse of the socket. Disconnect it and then release it.
1777 if (handle->socket())
1778 handle->socket()->Disconnect();
1779 handle->Reset();
1780
mmenke33d24423d2015-05-19 19:41:091781 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501782 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031783 TestGroupId("a"),
Anton Bikineev068d2912021-05-15 20:43:521784 ClientSocketPool::SocketParams::CreateForHttpForTesting(), absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:281785 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031786 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1787 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091788 if (rv != ERR_IO_PENDING) {
1789 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411790 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091791 } else {
1792 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521793 }
mmenke33d24423d2015-05-19 19:41:091794}
[email protected]f6d1d6eb2009-06-24 20:16:091795
mmenke33d24423d2015-05-19 19:41:091796// Tests the case where a second socket is requested in a completion callback,
1797// and the second socket connects asynchronously. Reuses the same
1798// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581799TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531800 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201801
[email protected]0b7648c2009-07-06 20:14:011802 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061803 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091804 TestCompletionCallback second_result_callback;
1805 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521806 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541807 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501808 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1809 connect_job_factory_, TestConnectJob::kMockPendingJob,
1810 &second_result_callback),
1811 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011812 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091813
robpercival214763f2016-07-01 23:27:011814 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581815}
[email protected]f6d1d6eb2009-06-24 20:16:091816
mmenke33d24423d2015-05-19 19:41:091817// Tests the case where a second socket is requested in a completion callback,
1818// and the second socket connects synchronously. Reuses the same
1819// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581820TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531821 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201822
[email protected]0b7648c2009-07-06 20:14:011823 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061824 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091825 TestCompletionCallback second_result_callback;
1826 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521827 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541828 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501829 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1830 connect_job_factory_, TestConnectJob::kMockPendingJob,
1831 &second_result_callback),
1832 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011833 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581834
robpercival214763f2016-07-01 23:27:011835 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091836}
1837
1838// Make sure that pending requests get serviced after active requests get
1839// cancelled.
[email protected]ab838892009-06-30 18:49:051840TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531841 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201842
[email protected]0b7648c2009-07-06 20:14:011843 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091844
Matt Menkec6b3edf72019-03-19 17:00:391845 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1846 IsError(ERR_IO_PENDING));
1847 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1848 IsError(ERR_IO_PENDING));
1849 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1850 IsError(ERR_IO_PENDING));
1851 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1852 IsError(ERR_IO_PENDING));
1853 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1854 IsError(ERR_IO_PENDING));
1855 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1856 IsError(ERR_IO_PENDING));
1857 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1858 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091859
[email protected]c9d6a1d2009-07-14 16:15:201860 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1861 // Let's cancel them.
1862 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131863 ASSERT_FALSE(request(i)->handle()->is_initialized());
1864 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091865 }
1866
[email protected]f6d1d6eb2009-06-24 20:16:091867 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131868 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011869 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131870 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091871 }
1872
[email protected]2431756e2010-09-29 20:26:131873 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1874 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091875}
1876
1877// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051878TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531879 const size_t kMaxSockets = 5;
1880 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201881
[email protected]0b7648c2009-07-06 20:14:011882 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091883
[email protected]211d21722009-07-22 15:48:531884 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1885 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091886
1887 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531888 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391889 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1890 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091891
[email protected]211d21722009-07-22 15:48:531892 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011893 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091894}
1895
mmenke9d72fe42017-05-18 22:36:071896// Make sure that pending requests that complete synchronously get serviced
1897// after active requests fail. See https://crbug.com/723748
1898TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1899 const size_t kNumberOfRequests = 10;
1900 const size_t kMaxSockets = 1;
1901 CreatePool(kMaxSockets, kMaxSockets);
1902
1903 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1904
Matt Menkec6b3edf72019-03-19 17:00:391905 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1906 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071907
1908 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1909
1910 // Queue up all the other requests
1911 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391912 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1913 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071914
1915 // Make sure all requests fail, instead of hanging.
1916 for (size_t i = 0; i < kNumberOfRequests; ++i)
1917 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1918}
1919
[email protected]5fc08e32009-07-15 17:09:571920TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531921 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571922
1923 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1924
[email protected]2431756e2010-09-29 20:26:131925 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521926 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501927 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521928 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501929 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1930 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011931 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571932
1933 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131934 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571935
Anton Bikineev068d2912021-05-15 20:43:521936 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281937 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501938 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1939 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011940 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1941 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571942
[email protected]2431756e2010-09-29 20:26:131943 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481944 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571945 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1946}
1947
xunjieli26619e72016-11-23 19:39:551948TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
Matt Menke433de6d2020-03-04 00:24:111949 const char kReason[] = "Really nifty reason";
1950
xunjieli26619e72016-11-23 19:39:551951 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1952 ClientSocketHandle handle;
1953 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261954 int rv =
1955 handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
1956 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1957 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1958 NetLogWithSource::Make(NetLogSourceType::NONE));
xunjieli26619e72016-11-23 19:39:551959 EXPECT_THAT(rv, IsOk());
Matt Menke433de6d2020-03-04 00:24:111960 ASSERT_TRUE(handle.socket());
1961 NetLogSource source = handle.socket()->NetLog().source();
xunjieli26619e72016-11-23 19:39:551962 handle.Reset();
1963 EXPECT_EQ(1, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111964 pool_->CloseIdleSockets(kReason);
1965 ExpectSocketClosedWithReason(source, kReason);
xunjieli26619e72016-11-23 19:39:551966}
1967
xunjieli92feb332017-03-03 17:19:231968TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231969 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1970 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261971 NetLogWithSource net_log_with_source =
1972 NetLogWithSource::Make(NetLogSourceType::NONE);
xunjieli92feb332017-03-03 17:19:231973 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501974 int rv = handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:521975 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501976 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261977 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231978 EXPECT_THAT(rv, IsOk());
1979 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:521980 rv = handle2.Init(TestGroupId("a"), 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 ClientSocketHandle handle3;
Anton Bikineev068d2912021-05-15 20:43:521985 rv = handle3.Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281986 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501987 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261988 pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231989 EXPECT_THAT(rv, IsOk());
1990 handle1.Reset();
1991 handle2.Reset();
1992 handle3.Reset();
1993 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111994 pool_->CloseIdleSocketsInGroup(TestGroupId("a"), "Very good reason");
xunjieli92feb332017-03-03 17:19:231995 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231996}
1997
xunjieli26619e72016-11-23 19:39:551998TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551999 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2000 ClientSocketHandle handle;
2001 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262002 NetLogWithSource net_log_with_source =
2003 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502004 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522005 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502006 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262007 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
xunjieli26619e72016-11-23 19:39:552008 EXPECT_THAT(rv, IsOk());
2009 StreamSocket* socket = handle.socket();
Matt Menke433de6d2020-03-04 00:24:112010 ASSERT_TRUE(socket);
xunjieli26619e72016-11-23 19:39:552011 handle.Reset();
2012 EXPECT_EQ(1, pool_->IdleSocketCount());
2013
2014 // Disconnect socket now to make the socket unusable.
Matt Menke433de6d2020-03-04 00:24:112015 NetLogSource source = socket->NetLog().source();
xunjieli26619e72016-11-23 19:39:552016 socket->Disconnect();
2017 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:522018 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282019 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502020 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262021 pool_.get(), net_log_with_source);
xunjieli26619e72016-11-23 19:39:552022 EXPECT_THAT(rv, IsOk());
2023 EXPECT_FALSE(handle2.is_reused());
Matt Menke433de6d2020-03-04 00:24:112024
2025 // This is admittedly not an accurate error in this case, but normally code
2026 // doesn't secretly keep a raw pointers to sockets returned to the socket pool
2027 // and close them out of band, so discovering an idle socket was closed when
2028 // trying to reuse it normally means it was closed by the remote side.
2029 ExpectSocketClosedWithReason(
2030 source, TransportClientSocketPool::kRemoteSideClosedConnection);
xunjieli26619e72016-11-23 19:39:552031}
2032
[email protected]2b7523d2009-07-29 20:29:232033// Regression test for http://crbug.com/17985.
2034TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
2035 const int kMaxSockets = 3;
2036 const int kMaxSocketsPerGroup = 2;
2037 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
2038
[email protected]ac790b42009-12-02 04:31:312039 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:232040
Matt Menkec6b3edf72019-03-19 17:00:392041 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2042 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232043
2044 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:392045 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2046 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232047
2048 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:392049 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232050
2051 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:392052 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2053 IsError(ERR_IO_PENDING));
2054 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2055 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232056
Matt Menkec6b3edf72019-03-19 17:00:392057 // Release the first two sockets from TestGroupId("a"). Because this is a
2058 // keepalive, the first release will unblock the pending request for
2059 // TestGroupId("a"). The second release will unblock a request for "c",
2060 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:132061 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
2062 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:232063
2064 // Closing idle sockets should not get us into trouble, but in the bug
2065 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:392066 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke433de6d2020-03-04 00:24:112067 pool_->CloseIdleSockets("Very good reason");
[email protected]eb5a99382010-07-11 03:18:262068
[email protected]2da659e2013-05-23 20:51:342069 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282070 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232071}
2072
[email protected]4d3b05d2010-01-27 21:27:292073TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532074 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572075
2076 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132077 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522078 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262079 NetLogWithSource net_log_with_source =
2080 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502081 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522082 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502083 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262084 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012085 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392086 EXPECT_EQ(LOAD_STATE_CONNECTING,
2087 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482088 TestLoadTimingInfoNotConnected(handle);
2089
robpercival214763f2016-07-01 23:27:012090 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132091 EXPECT_TRUE(handle.is_initialized());
2092 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482093 TestLoadTimingInfoConnectedNotReused(handle);
2094
[email protected]2431756e2010-09-29 20:26:132095 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482096 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302097
Matt Reichhoff0049a0b72021-10-20 20:44:262098 auto entries =
2099 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:402100
Matt Menke9fa17d52019-03-25 19:12:262101 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172102 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262103 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002104 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262105 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2106 EXPECT_TRUE(LogContainsEvent(
2107 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2108 NetLogEventPhase::NONE));
2109 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002110 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2111 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262112 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572113}
2114
[email protected]4d3b05d2010-01-27 21:27:292115TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572116 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532117 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572118
2119 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132120 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522121 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262122 NetLogWithSource net_log_with_source =
2123 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]e60e47a2010-07-14 03:37:182124 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132125 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512126 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502127 EXPECT_EQ(
2128 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522129 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282130 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2131 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262132 pool_.get(), net_log_with_source));
Matt Menkec6b3edf72019-03-19 17:00:392133 EXPECT_EQ(LOAD_STATE_CONNECTING,
2134 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012135 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132136 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512137 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302138
Matt Reichhoff0049a0b72021-10-20 20:44:262139 auto entries =
2140 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:402141
Matt Menke9fa17d52019-03-25 19:12:262142 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172143 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262144 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002145 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262146 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2147 EXPECT_TRUE(LogContainsEvent(
2148 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2149 NetLogEventPhase::NONE));
2150 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572151}
2152
mmenke6be122f2015-03-09 22:22:472153// Check that an async ConnectJob failure does not result in creation of a new
2154// ConnectJob when there's another pending request also waiting on its own
2155// ConnectJob. See http://crbug.com/463960.
2156TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2157 CreatePool(2, 2);
2158 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2159
Matt Menkec6b3edf72019-03-19 17:00:392160 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2161 IsError(ERR_IO_PENDING));
2162 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2163 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472164
robpercival214763f2016-07-01 23:27:012165 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2166 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472167
2168 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2169}
2170
[email protected]4d3b05d2010-01-27 21:27:292171TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102172 // TODO(eroman): Add back the log expectations! Removed them because the
2173 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532174 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572175
2176 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132177 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522178 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132179 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522180 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572181
Matt Menke28ac03e2019-02-25 22:25:502182 EXPECT_EQ(
2183 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522184 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282185 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2186 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2187 pool_.get(), NetLogWithSource()));
Matt Reichhoff0049a0b72021-10-20 20:44:262188 RecordingNetLogObserver log2;
tfarina428341112016-09-22 13:38:202189 EXPECT_EQ(
2190 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522191 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282192 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502193 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2194 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572195
[email protected]2431756e2010-09-29 20:26:132196 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572197
[email protected]fd7b7c92009-08-20 19:38:302198
2199 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302200
robpercival214763f2016-07-01 23:27:012201 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132202 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302203
2204 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532205 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572206}
2207
[email protected]4d3b05d2010-01-27 21:27:292208TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342209 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2210
[email protected]17a0c6c2009-08-04 00:07:042211 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2212
Matt Menkec6b3edf72019-03-19 17:00:392213 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2214 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2215 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2216 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342217
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]2431756e2010-09-29 20:26:132221 (*requests())[2]->handle()->Reset();
2222 (*requests())[3]->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())[1]->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
[email protected]2431756e2010-09-29 20:26:132232 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432233 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262234 static_cast<int>(
2235 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342236}
2237
[email protected]5fc08e32009-07-15 17:09:572238// When requests and ConnectJobs are not coupled, the request will get serviced
2239// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292240TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532241 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572242
2243 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322244 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572245
[email protected]2431756e2010-09-29 20:26:132246 std::vector<TestSocketRequest*> request_order;
2247 size_t completion_count; // unused
2248 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502249 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522250 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502251 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2252 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012253 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2254 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572255
2256 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2257 // without a job.
2258 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2259
[email protected]2431756e2010-09-29 20:26:132260 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502261 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522262 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502263 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2264 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012265 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132266 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502267 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522268 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502269 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2270 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012271 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572272
2273 // Both Requests 2 and 3 are pending. We release socket 1 which should
2274 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332275 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342276 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282277 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332278 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012279 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332280 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572281
2282 // Signal job 2, which should service request 3.
2283
2284 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012285 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572286
Raul Tambre8335a6d2019-02-21 16:57:432287 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132288 EXPECT_EQ(&req1, request_order[0]);
2289 EXPECT_EQ(&req2, request_order[1]);
2290 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392291 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572292}
2293
2294// The requests are not coupled to the jobs. So, the requests should finish in
2295// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292296TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532297 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572298 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322299 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572300
[email protected]2431756e2010-09-29 20:26:132301 std::vector<TestSocketRequest*> request_order;
2302 size_t completion_count; // unused
2303 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502304 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522305 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502306 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2307 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012308 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572309
[email protected]2431756e2010-09-29 20:26:132310 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502311 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522312 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502313 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2314 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012315 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572316
2317 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322318 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572319
[email protected]2431756e2010-09-29 20:26:132320 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502321 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522322 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502323 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2324 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012325 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572326
robpercival214763f2016-07-01 23:27:012327 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2328 EXPECT_THAT(req2.WaitForResult(), IsOk());
2329 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572330
Raul Tambre8335a6d2019-02-21 16:57:432331 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132332 EXPECT_EQ(&req1, request_order[0]);
2333 EXPECT_EQ(&req2, request_order[1]);
2334 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572335}
2336
[email protected]03b7c8c2013-07-20 04:38:552337// Test GetLoadState in the case there's only one socket request.
2338TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532339 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552340 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572341
[email protected]2431756e2010-09-29 20:26:132342 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522343 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502344 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522345 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502346 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2347 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012348 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552349 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572350
[email protected]03b7c8c2013-07-20 04:38:552351 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2352 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2353
2354 // No point in completing the connection, since ClientSocketHandles only
2355 // expect the LoadState to be checked while connecting.
2356}
2357
2358// Test GetLoadState in the case there are two socket requests.
2359TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2360 CreatePool(2, 2);
2361 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2362
2363 ClientSocketHandle handle;
2364 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502365 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522366 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502367 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2368 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012369 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002370 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2371
2372 ClientSocketHandle handle2;
2373 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522374 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282375 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502376 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2377 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012378 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002379 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2380
Matt Menke4b69f932019-03-04 16:20:012381 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002382 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2383 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2384
Matt Menke4b69f932019-03-04 16:20:012385 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002386 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2387
Matt Menke4b69f932019-03-04 16:20:012388 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002389 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002390 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012391
2392 // Update the state of the second job.
2393 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2394
2395 // Only the state of the second request should have changed.
2396 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2397 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2398
2399 // Second job connects and the first request gets the socket. The
2400 // second handle switches to the state of the remaining ConnectJob.
2401 client_socket_factory_.SignalJob(1);
2402 EXPECT_THAT(callback.WaitForResult(), IsOk());
2403 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552404}
2405
2406// Test GetLoadState in the case the per-group limit is reached.
2407TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2408 CreatePool(2, 1);
2409 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2410
2411 ClientSocketHandle handle;
2412 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502413 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522414 TestGroupId("a"), params_, absl::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502415 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2416 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012417 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552418 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2419
2420 // Request another socket from the same pool, buth with a higher priority.
2421 // The first request should now be stalled at the socket group limit.
2422 ClientSocketHandle handle2;
2423 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522424 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:282425 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502426 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2427 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012428 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552429 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2430 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2431
2432 // The first handle should remain stalled as the other socket goes through
2433 // the connect process.
2434
2435 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2436 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2437 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2438
2439 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012440 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552441 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2442
2443 // Closing the second socket should cause the stalled handle to finally get a
2444 // ConnectJob.
2445 handle2.socket()->Disconnect();
2446 handle2.Reset();
2447 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2448}
2449
2450// Test GetLoadState in the case the per-pool limit is reached.
2451TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2452 CreatePool(2, 2);
2453 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2454
2455 ClientSocketHandle handle;
2456 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502457 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522458 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502459 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2460 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012461 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552462
2463 // Request for socket from another pool.
2464 ClientSocketHandle handle2;
2465 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522466 rv = handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282467 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502468 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2469 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012470 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552471
2472 // Request another socket from the first pool. Request should stall at the
2473 // socket pool limit.
2474 ClientSocketHandle handle3;
2475 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522476 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282477 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502478 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2479 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012480 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552481
2482 // The third handle should remain stalled as the other sockets in its group
2483 // goes through the connect process.
2484
2485 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2486 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2487
2488 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2489 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2490 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2491
2492 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012493 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552494 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2495
2496 // Closing a socket should allow the stalled handle to finally get a new
2497 // ConnectJob.
2498 handle.socket()->Disconnect();
2499 handle.Reset();
2500 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572501}
2502
Matt Menkeb57663b32019-03-01 17:17:102503TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132504 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102505 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132506
[email protected]2431756e2010-09-29 20:26:132507 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522508 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502509 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102510 ERR_CERT_COMMON_NAME_INVALID,
Anton Bikineev068d2912021-05-15 20:43:522511 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282512 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2513 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2514 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132515 EXPECT_TRUE(handle.is_initialized());
2516 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132517}
2518
Matt Menkeb57663b32019-03-01 17:17:102519TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132520 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2521
Matt Menkeb57663b32019-03-01 17:17:102522 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132523 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522524 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502525 EXPECT_EQ(
2526 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522527 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282528 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2529 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2530 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392531 EXPECT_EQ(LOAD_STATE_CONNECTING,
2532 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102533 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132534 EXPECT_TRUE(handle.is_initialized());
2535 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132536}
2537
[email protected]e60e47a2010-07-14 03:37:182538TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2539 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2540 connect_job_factory_->set_job_type(
2541 TestConnectJob::kMockAdditionalErrorStateJob);
2542
[email protected]2431756e2010-09-29 20:26:132543 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522544 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502545 EXPECT_EQ(
2546 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:522547 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282548 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2549 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2550 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132551 EXPECT_FALSE(handle.is_initialized());
2552 EXPECT_FALSE(handle.socket());
2553 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512554 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182555}
2556
2557TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2558 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2559
2560 connect_job_factory_->set_job_type(
2561 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132562 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522563 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502564 EXPECT_EQ(
2565 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522566 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282567 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2568 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2569 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392570 EXPECT_EQ(LOAD_STATE_CONNECTING,
2571 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012572 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132573 EXPECT_FALSE(handle.is_initialized());
2574 EXPECT_FALSE(handle.socket());
2575 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512576 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182577}
2578
martijn003cd612016-05-19 22:24:382579// Make sure we can reuse sockets.
2580TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412581 CreatePoolWithIdleTimeouts(
2582 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032583 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352584 base::Days(1)); // Don't time out used sockets.
[email protected]e7b1c6d2c2012-05-05 00:54:032585
2586 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2587
2588 ClientSocketHandle handle;
2589 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502590 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522591 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502592 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2593 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012594 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392595 EXPECT_EQ(LOAD_STATE_CONNECTING,
2596 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012597 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032598
2599 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352600 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382601 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482602 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032603 handle.Reset();
2604
2605 // Should now have one idle socket.
2606 ASSERT_EQ(1, pool_->IdleSocketCount());
2607
2608 // Request a new socket. This should reuse the old socket and complete
2609 // synchronously.
Matt Reichhoff0049a0b72021-10-20 20:44:262610 NetLogWithSource net_log_with_source =
2611 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502612 rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522613 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502614 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262615 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012616 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032617 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482618 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032619
Matt Menke9fa17d52019-03-25 19:12:262620 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392621 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262622 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032623
Matt Reichhoff0049a0b72021-10-20 20:44:262624 auto entries =
2625 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
Matt Menke9fa17d52019-03-25 19:12:262626 EXPECT_TRUE(LogContainsEvent(
2627 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2628 NetLogEventPhase::NONE));
2629 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032630 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262631 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032632}
2633
martijn003cd612016-05-19 22:24:382634// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172635TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032636 CreatePoolWithIdleTimeouts(
2637 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2638 base::TimeDelta(), // Time out unused sockets immediately
2639 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412640
2641 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2642
2643 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2644
2645 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522646 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502647 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522648 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502649 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2650 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012651 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392652 EXPECT_EQ(LOAD_STATE_CONNECTING,
2653 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412654
2655 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522656 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522657 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282658 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502659 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2660 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012661 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392662 EXPECT_EQ(LOAD_STATE_CONNECTING,
2663 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412664
2665 // Cancel one of the requests. Wait for the other, which will get the first
2666 // job. Release the socket. Run the loop again to make sure the second
2667 // socket is sitting idle and the first one is released (since ReleaseSocket()
2668 // just posts a DoReleaseSocket() task).
2669
2670 handle.Reset();
robpercival214763f2016-07-01 23:27:012671 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menke433de6d2020-03-04 00:24:112672 // Get the NetLogSource for the socket, so the time out reason can be checked
2673 // at the end of the test.
2674 NetLogSource net_log_source2 = handle2.socket()->NetLog().source();
[email protected]64770b7d2011-11-16 04:30:412675 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352676 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382677 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412678 handle2.Reset();
2679
[email protected]e7b1c6d2c2012-05-05 00:54:032680 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2681 // actually become pending until 2ms after they have been created. In order
2682 // to flush all tasks, we need to wait so that we know there are no
2683 // soon-to-be-pending tasks waiting.
Peter Kastinge5a38ed2021-10-02 03:06:352684 FastForwardBy(base::Milliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412685
[email protected]e7b1c6d2c2012-05-05 00:54:032686 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412687 ASSERT_EQ(2, pool_->IdleSocketCount());
2688
2689 // Request a new socket. This should cleanup the unused and timed out ones.
2690 // A new socket will be created rather than reusing the idle one.
Matt Reichhoff0049a0b72021-10-20 20:44:262691 NetLogWithSource net_log_with_source =
2692 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]6ecf2b92011-12-15 01:14:522693 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522694 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282695 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502696 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262697 pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012698 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2699 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412700 EXPECT_FALSE(handle.is_reused());
2701
[email protected]e7b1c6d2c2012-05-05 00:54:032702 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262703 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392704 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262705 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412706
Matt Reichhoff0049a0b72021-10-20 20:44:262707 auto entries =
2708 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]64770b7d2011-11-16 04:30:412709 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002710 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
Matt Menke433de6d2020-03-04 00:24:112711 ExpectSocketClosedWithReason(
2712 net_log_source2, TransportClientSocketPool::kIdleTimeLimitExpired);
[email protected]64770b7d2011-11-16 04:30:412713}
2714
[email protected]2041cf342010-02-19 03:15:592715// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162716// because of multiple releasing disconnected sockets.
2717TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2718 CreatePoolWithIdleTimeouts(
2719 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2720 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352721 base::Days(1)); // Don't time out used sockets.
[email protected]4f2abec2010-02-03 18:10:162722
2723 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2724
2725 // Startup 4 connect jobs. Two of them will be pending.
2726
[email protected]2431756e2010-09-29 20:26:132727 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522728 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502729 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522730 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502731 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2732 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012733 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162734
[email protected]2431756e2010-09-29 20:26:132735 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522736 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522737 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282738 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502739 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2740 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012741 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162742
[email protected]2431756e2010-09-29 20:26:132743 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522744 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522745 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282746 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502747 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2748 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012749 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162750
[email protected]2431756e2010-09-29 20:26:132751 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522752 TestCompletionCallback callback4;
Anton Bikineev068d2912021-05-15 20:43:522753 rv = handle4.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282754 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502755 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2756 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012757 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162758
2759 // Release two disconnected sockets.
2760
[email protected]2431756e2010-09-29 20:26:132761 handle.socket()->Disconnect();
2762 handle.Reset();
2763 handle2.socket()->Disconnect();
2764 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162765
robpercival214763f2016-07-01 23:27:012766 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132767 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012768 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132769 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162770}
2771
[email protected]d7027bb2010-05-10 18:58:542772// Regression test for http://crbug.com/42267.
2773// When DoReleaseSocket() is processed for one socket, it is blocked because the
2774// other stalled groups all have releasing sockets, so no progress can be made.
2775TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2776 CreatePoolWithIdleTimeouts(
2777 4 /* socket limit */, 4 /* socket limit per group */,
2778 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352779 base::Days(1)); // Don't time out used sockets.
[email protected]d7027bb2010-05-10 18:58:542780
2781 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2782
2783 // Max out the socket limit with 2 per group.
2784
[email protected]2431756e2010-09-29 20:26:132785 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522786 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132787 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522788 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542789
2790 for (int i = 0; i < 2; ++i) {
Anton Bikineev068d2912021-05-15 20:43:522791 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282792 LOWEST, SocketTag(),
2793 ClientSocketPool::RespectLimits::ENABLED,
2794 callback_a[i].callback(),
2795 ClientSocketPool::ProxyAuthCallback(),
2796 pool_.get(), NetLogWithSource()));
Anton Bikineev068d2912021-05-15 20:43:522797 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282798 LOWEST, SocketTag(),
2799 ClientSocketPool::RespectLimits::ENABLED,
2800 callback_b[i].callback(),
2801 ClientSocketPool::ProxyAuthCallback(),
2802 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542803 }
[email protected]b89f7e42010-05-20 20:37:002804
[email protected]d7027bb2010-05-10 18:58:542805 // Make 4 pending requests, 2 per group.
2806
2807 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282808 EXPECT_EQ(
2809 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522810 handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282811 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2812 callback_a[i].callback(),
2813 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2814 NetLogWithSource()));
2815 EXPECT_EQ(
2816 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522817 handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282818 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2819 callback_b[i].callback(),
2820 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2821 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542822 }
2823
2824 // Release b's socket first. The order is important, because in
2825 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2826 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2827 // first, which has a releasing socket, so it refuses to start up another
2828 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132829 handle_b[0].socket()->Disconnect();
2830 handle_b[0].Reset();
2831 handle_a[0].socket()->Disconnect();
2832 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542833
2834 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282835 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542836
[email protected]2431756e2010-09-29 20:26:132837 handle_b[1].socket()->Disconnect();
2838 handle_b[1].Reset();
2839 handle_a[1].socket()->Disconnect();
2840 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542841
2842 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012843 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2844 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542845 }
2846}
2847
[email protected]fd4fe0b2010-02-08 23:02:152848TEST_F(ClientSocketPoolBaseTest,
2849 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2850 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2851
2852 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2853
Matt Menkec6b3edf72019-03-19 17:00:392854 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2855 IsError(ERR_IO_PENDING));
2856 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2857 IsError(ERR_IO_PENDING));
2858 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2859 IsError(ERR_IO_PENDING));
2860 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2861 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152862
robpercival214763f2016-07-01 23:27:012863 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2864 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132865 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152866
2867 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132868 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012869 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152870
[email protected]2431756e2010-09-29 20:26:132871 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012872 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132873 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152874
2875 EXPECT_EQ(1, GetOrderOfRequest(1));
2876 EXPECT_EQ(2, GetOrderOfRequest(2));
2877 EXPECT_EQ(3, GetOrderOfRequest(3));
2878 EXPECT_EQ(4, GetOrderOfRequest(4));
2879
2880 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132881 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152882}
2883
[email protected]6ecf2b92011-12-15 01:14:522884class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042885 public:
Matt Menke9fa17d52019-03-25 19:12:262886 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132887 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182888 bool reset_releasing_handle)
2889 : pool_(pool),
2890 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042891 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522892
Chris Watkins7a41d3552017-12-01 02:13:272893 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042894
2895 ClientSocketHandle* handle() { return &handle_; }
2896
Bence Béky8ddc2492018-06-13 01:02:042897 CompletionOnceCallback callback() {
2898 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2899 base::Unretained(this));
2900 }
[email protected]4f1e4982010-03-02 18:31:042901
2902 private:
[email protected]6ecf2b92011-12-15 01:14:522903 void OnComplete(int result) {
2904 SetResult(result);
2905 if (reset_releasing_handle_)
2906 handle_.Reset();
2907
Matt Menkec6b3edf72019-03-19 17:00:392908 EXPECT_EQ(
2909 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032910 handle2_.Init(
2911 TestGroupId("a"),
2912 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:522913 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032914 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2915 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522916 }
2917
Keishi Hattori0e45c022021-11-27 09:25:522918 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]e60e47a2010-07-14 03:37:182919 int expected_result_;
2920 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042921 ClientSocketHandle handle_;
2922 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042923};
2924
[email protected]e60e47a2010-07-14 03:37:182925
2926TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2927 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2928
Matt Menkec6b3edf72019-03-19 17:00:392929 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2930 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2931 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182932
[email protected]2431756e2010-09-29 20:26:132933 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182934 client_socket_factory_.allocation_count());
2935
2936 connect_job_factory_->set_job_type(
2937 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2938 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282939 EXPECT_EQ(ERR_IO_PENDING,
2940 req.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522941 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282942 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2943 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2944 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182945 // The next job should complete synchronously
2946 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2947
robpercival214763f2016-07-01 23:27:012948 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182949 EXPECT_FALSE(req.handle()->is_initialized());
2950 EXPECT_FALSE(req.handle()->socket());
2951 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512952 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182953}
2954
[email protected]b6501d3d2010-06-03 23:53:342955// http://crbug.com/44724 regression test.
2956// We start releasing the pool when we flush on network change. When that
2957// happens, the only active references are in the ClientSocketHandles. When a
2958// ConnectJob completes and calls back into the last ClientSocketHandle, that
2959// callback can release the last reference and delete the pool. After the
2960// callback finishes, we go back to the stack frame within the now-deleted pool.
2961// Executing any code that refers to members of the now-deleted pool can cause
2962// crashes.
2963TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2964 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2965 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2966
2967 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522968 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502969 EXPECT_EQ(
2970 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522971 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282972 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2973 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2974 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342975
Matt Menke433de6d2020-03-04 00:24:112976 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]b6501d3d2010-06-03 23:53:342977
2978 // We'll call back into this now.
2979 callback.WaitForResult();
2980}
2981
[email protected]a7e38572010-06-07 18:22:242982TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2983 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2984 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2985
2986 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522987 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502988 EXPECT_EQ(
2989 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522990 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282991 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2992 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2993 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012994 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242995 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:112996 NetLogSource source = handle.socket()->NetLog().source();
[email protected]a7e38572010-06-07 18:22:242997
Matt Menke433de6d2020-03-04 00:24:112998 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]a7e38572010-06-07 18:22:242999
3000 handle.Reset();
fdoray5eeb7642016-06-22 16:11:283001 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:243002
Matt Menke28ac03e2019-02-25 22:25:503003 EXPECT_EQ(
3004 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523005 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283006 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3007 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3008 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013009 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243010 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113011
3012 ExpectSocketClosedWithReason(
3013 source, TransportClientSocketPool::kSocketGenerationOutOfDate);
[email protected]a7e38572010-06-07 18:22:243014}
3015
[email protected]6ecf2b92011-12-15 01:14:523016class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:143017 public:
Matt Menke9fa17d52019-03-25 19:12:263018 ConnectWithinCallback(
3019 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:193020 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:263021 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:393022 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:143023
Peter Boström293b1342021-09-22 17:31:433024 ConnectWithinCallback(const ConnectWithinCallback&) = delete;
3025 ConnectWithinCallback& operator=(const ConnectWithinCallback&) = delete;
3026
Chris Watkins7a41d3552017-12-01 02:13:273027 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:143028
3029 int WaitForNestedResult() {
3030 return nested_callback_.WaitForResult();
3031 }
3032
Bence Béky8ddc2492018-06-13 01:02:043033 CompletionOnceCallback callback() {
3034 return base::BindOnce(&ConnectWithinCallback::OnComplete,
3035 base::Unretained(this));
3036 }
[email protected]6ecf2b92011-12-15 01:14:523037
[email protected]06f92462010-08-31 19:24:143038 private:
[email protected]6ecf2b92011-12-15 01:14:523039 void OnComplete(int result) {
3040 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:283041 EXPECT_EQ(
3042 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523043 handle_.Init(group_id_, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283044 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3045 nested_callback_.callback(),
3046 ClientSocketPool::ProxyAuthCallback(), pool_,
3047 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:523048 }
3049
Matt Menkec6b3edf72019-03-19 17:00:393050 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:193051 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Keishi Hattori0e45c022021-11-27 09:25:523052 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]06f92462010-08-31 19:24:143053 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:523054 TestCompletionCallback nested_callback_;
[email protected]06f92462010-08-31 19:24:143055};
3056
3057TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
3058 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3059
3060 // First job will be waiting until it gets aborted.
3061 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3062
3063 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:393064 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:503065 EXPECT_EQ(
3066 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523067 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283068 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3069 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3070 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:143071
3072 // Second job will be started during the first callback, and will
3073 // asynchronously complete with OK.
3074 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menke433de6d2020-03-04 00:24:113075 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
robpercival214763f2016-07-01 23:27:013076 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
3077 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:143078}
3079
Matt Menke141b87f22019-01-30 02:43:033080TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:263081 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3082 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033083
3084 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3085 ClientSocketHandle handle;
3086 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503087 EXPECT_EQ(
3088 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523089 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283090 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3091 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3092 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033093 // The backup timer fires but doesn't start a new ConnectJob while resolving
3094 // the hostname.
3095 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
Peter Kastinge5a38ed2021-10-02 03:06:353096 FastForwardBy(
3097 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033098 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3099
3100 // Once the ConnectJob has finished resolving the hostname, the backup timer
3101 // will create a ConnectJob when it fires.
3102 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
Peter Kastinge5a38ed2021-10-02 03:06:353103 FastForwardBy(
3104 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs));
Matt Menke141b87f22019-01-30 02:43:033105 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3106}
3107
3108// Test that no backup socket is created when a ConnectJob connects before it
3109// completes.
3110TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263111 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3112 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033113
3114 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3115 ClientSocketHandle handle;
3116 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503117 EXPECT_EQ(
3118 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523119 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283120 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3121 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3122 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033123 // The backup timer fires but doesn't start a new ConnectJob while resolving
3124 // the hostname.
3125 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
Peter Kastinge5a38ed2021-10-02 03:06:353126 FastForwardBy(
3127 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033128 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3129
3130 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3131 client_socket_factory_.SetJobHasEstablishedConnection(0);
Peter Kastinge5a38ed2021-10-02 03:06:353132 FastForwardBy(
3133 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033134 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3135}
3136
[email protected]25eea382010-07-10 23:55:263137// Cancel a pending socket request while we're at max sockets,
3138// and verify that the backup socket firing doesn't cause a crash.
3139TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3140 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263141 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3142 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263143
[email protected]4baaf9d2010-08-31 15:15:443144 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3145 // timer.
[email protected]25eea382010-07-10 23:55:263146 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3147 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523148 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503149 EXPECT_EQ(
3150 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523151 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283152 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3153 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3154 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263155
3156 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3157 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3158 ClientSocketHandle handles[kDefaultMaxSockets];
3159 for (int i = 1; i < kDefaultMaxSockets; ++i) {
Anton Bikineev068d2912021-05-15 20:43:523160 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283161 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203162 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503163 callback.callback(),
3164 ClientSocketPool::ProxyAuthCallback(),
3165 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263166 }
3167
fdoray5eeb7642016-06-22 16:11:283168 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263169
3170 // Cancel the pending request.
3171 handle.Reset();
3172
3173 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353174 FastForwardBy(
3175 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263176
[email protected]25eea382010-07-10 23:55:263177 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3178}
3179
[email protected]3f00be82010-09-27 19:50:023180TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263181 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3182 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443183
3184 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3185 // timer.
3186 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3187 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523188 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503189 EXPECT_EQ(
3190 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523191 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283192 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3193 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3194 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263195 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3196 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3197 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3198 TestGroupId("bar")));
3199 EXPECT_EQ(
3200 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443201
3202 // Cancel the socket request. This should cancel the backup timer. Wait for
3203 // the backup time to see if it indeed got canceled.
3204 handle.Reset();
3205 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353206 FastForwardBy(
3207 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263208 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3209 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443210}
3211
[email protected]3f00be82010-09-27 19:50:023212TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263213 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3214 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023215
3216 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3217 // timer.
3218 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3219 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523220 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503221 EXPECT_EQ(
3222 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523223 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283224 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3225 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3226 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023227 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3228 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523229 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203230 EXPECT_EQ(
3231 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523232 handle2.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283233 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503234 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3235 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263236 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3237 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023238
3239 // Cancel request 1 and then complete request 2. With the requests finished,
3240 // the backup timer should be cancelled.
3241 handle.Reset();
robpercival214763f2016-07-01 23:27:013242 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023243 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353244 FastForwardBy(
3245 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023246}
3247
[email protected]eb5a99382010-07-11 03:18:263248// Test delayed socket binding for the case where we have two connects,
3249// and while one is waiting on a connect, the other frees up.
3250// The socket waiting on a connect should switch immediately to the freed
3251// up socket.
3252TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3253 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3254 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3255
3256 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523257 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503258 EXPECT_EQ(
3259 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523260 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283261 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503262 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3263 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013264 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263265
3266 // No idle sockets, no pending jobs.
3267 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263268 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263269
3270 // Create a second socket to the same host, but this one will wait.
3271 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3272 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503273 EXPECT_EQ(
3274 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523275 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283276 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503277 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3278 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263279 // No idle sockets, and one connecting job.
3280 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263281 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263282
3283 // Return the first handle to the pool. This will initiate the delayed
3284 // binding.
3285 handle1.Reset();
3286
fdoray5eeb7642016-06-22 16:11:283287 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263288
3289 // Still no idle sockets, still one pending connect job.
3290 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263291 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263292
3293 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013294 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263295
3296 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263297 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263298
3299 // Finally, signal the waiting Connect.
3300 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263301 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263302
fdoray5eeb7642016-06-22 16:11:283303 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263304}
3305
3306// Test delayed socket binding when a group is at capacity and one
3307// of the group's sockets frees up.
3308TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3309 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3310 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3311
3312 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523313 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503314 EXPECT_EQ(
3315 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523316 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283317 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503318 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3319 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013320 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263321
3322 // No idle sockets, no pending jobs.
3323 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263324 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263325
3326 // Create a second socket to the same host, but this one will wait.
3327 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3328 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503329 EXPECT_EQ(
3330 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523331 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283332 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503333 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3334 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263335 // No idle sockets, and one connecting job.
3336 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263337 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263338
3339 // Return the first handle to the pool. This will initiate the delayed
3340 // binding.
3341 handle1.Reset();
3342
fdoray5eeb7642016-06-22 16:11:283343 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263344
3345 // Still no idle sockets, still one pending connect job.
3346 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263347 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263348
3349 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013350 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263351
3352 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263353 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263354
3355 // Finally, signal the waiting Connect.
3356 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263357 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263358
fdoray5eeb7642016-06-22 16:11:283359 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263360}
3361
3362// Test out the case where we have one socket connected, one
3363// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513364// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263365// should complete, by taking the first socket's idle socket.
3366TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3367 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3368 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3369
3370 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523371 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503372 EXPECT_EQ(
3373 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523374 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283375 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503376 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3377 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013378 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263379
3380 // No idle sockets, no pending jobs.
3381 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263382 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263383
3384 // Create a second socket to the same host, but this one will wait.
3385 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3386 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503387 EXPECT_EQ(
3388 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523389 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283390 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503391 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3392 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263393 // No idle sockets, and one connecting job.
3394 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263395 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263396
3397 // Return the first handle to the pool. This will initiate the delayed
3398 // binding.
3399 handle1.Reset();
3400
fdoray5eeb7642016-06-22 16:11:283401 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263402
3403 // Still no idle sockets, still one pending connect job.
3404 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263405 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263406
3407 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013408 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263409
3410 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263411 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263412
3413 // Finally, signal the waiting Connect.
3414 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263415 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263416
fdoray5eeb7642016-06-22 16:11:283417 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263418}
3419
[email protected]2abfe90a2010-08-25 17:49:513420// Cover the case where on an available socket slot, we have one pending
3421// request that completes synchronously, thereby making the Group empty.
3422TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3423 const int kUnlimitedSockets = 100;
3424 const int kOneSocketPerGroup = 1;
3425 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3426
3427 // Make the first request asynchronous fail.
3428 // This will free up a socket slot later.
3429 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3430
3431 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523432 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203433 EXPECT_EQ(
3434 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523435 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283436 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503437 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3438 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263439 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513440
3441 // Make the second request synchronously fail. This should make the Group
3442 // empty.
3443 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3444 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523445 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513446 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3447 // when created.
tfarina428341112016-09-22 13:38:203448 EXPECT_EQ(
3449 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523450 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283451 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503452 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3453 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513454
Matt Menke9fa17d52019-03-25 19:12:263455 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513456
robpercival214763f2016-07-01 23:27:013457 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3458 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263459 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513460}
3461
[email protected]e1b54dc2010-10-06 21:27:223462TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3463 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3464
3465 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3466
3467 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523468 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203469 EXPECT_EQ(
3470 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523471 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283472 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503473 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3474 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223475
3476 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523477 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203478 EXPECT_EQ(
3479 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523480 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283481 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503482 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3483 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223484 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523485 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203486 EXPECT_EQ(
3487 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523488 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283489 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503490 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3491 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223492
robpercival214763f2016-07-01 23:27:013493 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3494 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3495 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223496
3497 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353498 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383499 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353500 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383501 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223502
3503 handle1.Reset();
3504 handle2.Reset();
3505 handle3.Reset();
3506
Matt Menkec6b3edf72019-03-19 17:00:393507 EXPECT_EQ(OK, handle1.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 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3511 pool_.get(), NetLogWithSource()));
3512 EXPECT_EQ(OK, handle2.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 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3516 pool_.get(), NetLogWithSource()));
3517 EXPECT_EQ(OK, handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:523518 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283519 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393520 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3521 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223522
3523 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3524 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3525 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3526}
3527
[email protected]2c2bef152010-10-13 00:55:033528TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3529 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3530 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3531
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213532 TestCompletionCallback preconnect_callback;
3533 EXPECT_EQ(ERR_IO_PENDING,
3534 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3535 preconnect_callback.callback(),
3536 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033537
Matt Menke9fa17d52019-03-25 19:12:263538 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3539 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3540 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3541 TestGroupId("a")));
3542 EXPECT_EQ(2u,
3543 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393544 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033545
3546 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523547 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203548 EXPECT_EQ(
3549 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523550 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283551 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503552 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3553 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033554
3555 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523556 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203557 EXPECT_EQ(
3558 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523559 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283560 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503561 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3562 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033563
Matt Menke9fa17d52019-03-25 19:12:263564 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3565 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3566 TestGroupId("a")));
3567 EXPECT_EQ(0u,
3568 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393569 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033570
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213571 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
robpercival214763f2016-07-01 23:27:013572 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3573 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033574 handle1.Reset();
3575 handle2.Reset();
3576
Matt Menke9fa17d52019-03-25 19:12:263577 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3578 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3579 TestGroupId("a")));
3580 EXPECT_EQ(0u,
3581 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393582 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033583}
3584
3585TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3586 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3587 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3588
3589 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523590 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203591 EXPECT_EQ(
3592 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523593 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283594 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503595 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3596 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033597
Matt Menke9fa17d52019-03-25 19:12:263598 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3599 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3600 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3601 TestGroupId("a")));
3602 EXPECT_EQ(0u,
3603 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393604 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033605
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213606 TestCompletionCallback preconnect_callback;
3607 EXPECT_EQ(ERR_IO_PENDING,
3608 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3609 preconnect_callback.callback(),
3610 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033611
Matt Menke9fa17d52019-03-25 19:12:263612 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3613 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3614 TestGroupId("a")));
3615 EXPECT_EQ(1u,
3616 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393617 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033618
3619 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523620 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203621 EXPECT_EQ(
3622 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523623 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283624 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503625 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3626 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033627
Matt Menke9fa17d52019-03-25 19:12:263628 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3629 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3630 TestGroupId("a")));
3631 EXPECT_EQ(0u,
3632 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393633 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033634
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213635 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
robpercival214763f2016-07-01 23:27:013636 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3637 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033638 handle1.Reset();
3639 handle2.Reset();
3640
Matt Menke9fa17d52019-03-25 19:12:263641 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3642 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3643 TestGroupId("a")));
3644 EXPECT_EQ(0u,
3645 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393646 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033647}
3648
3649TEST_F(ClientSocketPoolBaseTest,
3650 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3651 CreatePool(4, 4);
3652 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3653
3654 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523655 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203656 EXPECT_EQ(
3657 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523658 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283659 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503660 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3661 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033662
3663 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523664 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203665 EXPECT_EQ(
3666 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523667 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283668 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503669 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3670 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033671
3672 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523673 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203674 EXPECT_EQ(
3675 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523676 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283677 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503678 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3679 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033680
Matt Menke9fa17d52019-03-25 19:12:263681 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3682 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3683 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3684 TestGroupId("a")));
3685 EXPECT_EQ(0u,
3686 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393687 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033688
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213689 EXPECT_EQ(
3690 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3691 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033692
Matt Menke9fa17d52019-03-25 19:12:263693 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3694 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3695 TestGroupId("a")));
3696 EXPECT_EQ(0u,
3697 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393698 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033699
robpercival214763f2016-07-01 23:27:013700 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3701 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3702 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033703 handle1.Reset();
3704 handle2.Reset();
3705 handle3.Reset();
3706
Matt Menke9fa17d52019-03-25 19:12:263707 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3708 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3709 TestGroupId("a")));
3710 EXPECT_EQ(0u,
3711 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393712 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033713}
3714
3715TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3716 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3717 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3718
Matt Menke9fa17d52019-03-25 19:12:263719 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033720
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213721 TestCompletionCallback preconnect_callback;
3722 EXPECT_EQ(ERR_IO_PENDING,
3723 pool_->RequestSockets(
3724 TestGroupId("a"), params_, absl::nullopt, kDefaultMaxSockets,
3725 preconnect_callback.callback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033726
Matt Menke9fa17d52019-03-25 19:12:263727 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433728 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393729 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263730 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3731 EXPECT_EQ(
3732 kDefaultMaxSockets,
3733 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3734 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433735 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263736 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3737 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033738
Matt Menke9fa17d52019-03-25 19:12:263739 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033740
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213741 EXPECT_EQ(OK,
3742 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
3743 kDefaultMaxSockets, CompletionOnceCallback(),
3744 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033745
Matt Menke9fa17d52019-03-25 19:12:263746 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213747
3748 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033749}
3750
3751TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3752 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3753 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3754
Matt Menke9fa17d52019-03-25 19:12:263755 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033756
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213757 TestCompletionCallback preconnect_callback1;
3758 EXPECT_EQ(ERR_IO_PENDING,
3759 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3760 kDefaultMaxSockets - 1,
3761 preconnect_callback1.callback(),
3762 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033763
Matt Menke9fa17d52019-03-25 19:12:263764 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433765 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393766 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263767 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3768 EXPECT_EQ(
3769 kDefaultMaxSockets - 1,
3770 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3771 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433772 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263773 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3774 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483775 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033776
Matt Menke9fa17d52019-03-25 19:12:263777 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033778
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213779 TestCompletionCallback preconnect_callback2;
3780 EXPECT_EQ(ERR_IO_PENDING,
3781 pool_->RequestSockets(
3782 TestGroupId("b"), params_, absl::nullopt, kDefaultMaxSockets,
3783 preconnect_callback2.callback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033784
Matt Menke9fa17d52019-03-25 19:12:263785 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3786 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483787 EXPECT_FALSE(pool_->IsStalled());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213788
3789 EXPECT_THAT(preconnect_callback1.WaitForResult(), IsOk());
3790 EXPECT_THAT(preconnect_callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033791}
3792
3793TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3794 CreatePool(4, 4);
3795 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3796
3797 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523798 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203799 EXPECT_EQ(
3800 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523801 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283802 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503803 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3804 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013805 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033806 handle1.Reset();
3807
Matt Menke9fa17d52019-03-25 19:12:263808 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3809 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3810 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3811 TestGroupId("a")));
3812 EXPECT_EQ(0u,
3813 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393814 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033815
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213816 TestCompletionCallback preconnect_callback;
3817 EXPECT_EQ(ERR_IO_PENDING,
3818 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3819 preconnect_callback.callback(),
3820 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033821
Matt Menke9fa17d52019-03-25 19:12:263822 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3823 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3824 TestGroupId("a")));
3825 EXPECT_EQ(1u,
3826 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393827 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213828
3829 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033830}
3831
3832TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3833 CreatePool(4, 4);
3834 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3835
3836 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523837 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203838 EXPECT_EQ(
3839 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523840 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283841 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503842 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3843 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013844 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033845
Matt Menke9fa17d52019-03-25 19:12:263846 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3847 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3848 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3849 TestGroupId("a")));
3850 EXPECT_EQ(0u,
3851 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393852 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263853 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033854
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213855 TestCompletionCallback preconnect_callback;
3856 EXPECT_EQ(ERR_IO_PENDING,
3857 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3858 preconnect_callback.callback(),
3859 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033860
Matt Menke9fa17d52019-03-25 19:12:263861 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3862 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3863 TestGroupId("a")));
3864 EXPECT_EQ(1u,
3865 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393866 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263867 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213868
3869 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033870}
3871
3872TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3873 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3874 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3875
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213876 EXPECT_EQ(
3877 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3878 kDefaultMaxSocketsPerGroup,
3879 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033880
Matt Menke9fa17d52019-03-25 19:12:263881 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3882 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3883 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3884 TestGroupId("a")));
3885 EXPECT_EQ(0u,
3886 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433887 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393888 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033889
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213890 EXPECT_EQ(
3891 OK, pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
3892 kDefaultMaxSocketsPerGroup,
3893 CompletionOnceCallback(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033894
Matt Menke9fa17d52019-03-25 19:12:263895 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3896 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3897 TestGroupId("b")));
3898 EXPECT_EQ(0u,
3899 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433900 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393901 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033902}
3903
[email protected]3c819f522010-12-02 02:03:123904TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3905 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3906 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3907
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213908 EXPECT_EQ(
3909 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3910 kDefaultMaxSocketsPerGroup,
3911 CompletionOnceCallback(), NetLogWithSource()));
[email protected]3c819f522010-12-02 02:03:123912
Matt Menke9fa17d52019-03-25 19:12:263913 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523914
3915 connect_job_factory_->set_job_type(
3916 TestConnectJob::kMockAdditionalErrorStateJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213917
3918 EXPECT_EQ(
3919 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
3920 kDefaultMaxSocketsPerGroup,
3921 CompletionOnceCallback(), NetLogWithSource()));
[email protected]fd2e53e2011-01-14 20:40:523922
Matt Menke9fa17d52019-03-25 19:12:263923 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123924}
3925
[email protected]8159a1c2012-06-07 00:00:103926TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033927 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433928 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033929
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213930 TestCompletionCallback preconnect_callback;
3931 EXPECT_EQ(ERR_IO_PENDING,
3932 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3933 preconnect_callback.callback(),
3934 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033935
Matt Menke9fa17d52019-03-25 19:12:263936 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3937 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3938 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3939 TestGroupId("a")));
3940 EXPECT_EQ(2u,
3941 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3942 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393943 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033944
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213945 EXPECT_EQ(
3946 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
3947 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263948 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3949 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3950 TestGroupId("a")));
3951 EXPECT_EQ(2u,
3952 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3953 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393954 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033955
3956 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523957 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203958 EXPECT_EQ(
3959 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523960 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283961 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503962 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3963 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433964
3965 client_socket_factory_.SignalJob(0);
3966 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3967
Matt Menke9fa17d52019-03-25 19:12:263968 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3969 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3970 TestGroupId("a")));
3971 EXPECT_EQ(1u,
3972 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3973 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393974 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033975
3976 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523977 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433978 EXPECT_EQ(
3979 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523980 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283981 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503982 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3983 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433984 client_socket_factory_.SignalJob(0);
3985 EXPECT_THAT(callback2.WaitForResult(), IsOk());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:213986 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033987
Matt Menke9fa17d52019-03-25 19:12:263988 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3989 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3990 TestGroupId("a")));
3991 EXPECT_EQ(0u,
3992 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3993 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393994 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103995
[email protected]2c2bef152010-10-13 00:55:033996 handle1.Reset();
3997 handle2.Reset();
3998
Matt Menke9fa17d52019-03-25 19:12:263999 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4000 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4001 TestGroupId("a")));
4002 EXPECT_EQ(0u,
4003 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4004 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394005 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034006
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214007 EXPECT_EQ(
4008 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4009 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264010 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4011 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4012 TestGroupId("a")));
4013 EXPECT_EQ(0u,
4014 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4015 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394016 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034017}
4018
4019TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
4020 CreatePool(4, 4);
4021 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4022
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214023 TestCompletionCallback preconnect_callback1;
4024 EXPECT_EQ(ERR_IO_PENDING,
4025 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4026 preconnect_callback1.callback(),
4027 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034028
Matt Menke9fa17d52019-03-25 19:12:264029 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4030 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4031 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4032 TestGroupId("a")));
4033 EXPECT_EQ(1u,
4034 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394035 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034036
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214037 TestCompletionCallback preconnect_callback2;
4038 EXPECT_EQ(ERR_IO_PENDING,
4039 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4040 preconnect_callback2.callback(),
4041 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264042 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4043 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4044 TestGroupId("a")));
4045 EXPECT_EQ(2u,
4046 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394047 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034048
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214049 TestCompletionCallback preconnect_callback3;
4050 EXPECT_EQ(ERR_IO_PENDING,
4051 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 3,
4052 preconnect_callback3.callback(),
4053 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264054 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4055 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4056 TestGroupId("a")));
4057 EXPECT_EQ(3u,
4058 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394059 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034060
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214061 EXPECT_EQ(
4062 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4063 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264064 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4065 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4066 TestGroupId("a")));
4067 EXPECT_EQ(3u,
4068 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394069 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034070}
4071
4072TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
4073 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434074 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:034075
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214076 TestCompletionCallback preconnect_callback;
4077 EXPECT_EQ(ERR_IO_PENDING,
4078 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4079 preconnect_callback.callback(),
4080 NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034081
Matt Menke9fa17d52019-03-25 19:12:264082 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4083 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4084 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4085 TestGroupId("a")));
4086 EXPECT_EQ(1u,
4087 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394088 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034089
4090 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524091 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204092 EXPECT_EQ(
4093 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524094 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284095 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504096 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4097 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034098
Matt Menke9fa17d52019-03-25 19:12:264099 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4100 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4101 TestGroupId("a")));
4102 EXPECT_EQ(0u,
4103 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394104 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034105
Lily Chenecebf932018-11-02 17:15:434106 client_socket_factory_.SignalJobs();
4107 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214108 EXPECT_THAT(preconnect_callback.WaitForResult(), IsOk());
Lily Chenecebf932018-11-02 17:15:434109
Matt Menke9fa17d52019-03-25 19:12:264110 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4111 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4112 TestGroupId("a")));
4113 EXPECT_EQ(0u,
4114 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394115 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264116 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034117
[email protected]0dc88b32014-03-26 20:12:284118 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:484119 // starts, it has a connect start time.
4120 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:034121 handle1.Reset();
4122
Matt Menkec6b3edf72019-03-19 17:00:394123 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034124}
4125
[email protected]034df0f32013-01-07 23:17:484126// Checks that fully connected preconnect jobs have no connect times, and are
4127// marked as reused.
4128TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
4129 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4130 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214131
4132 EXPECT_EQ(
4133 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4134 CompletionOnceCallback(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484135
Matt Menke9fa17d52019-03-25 19:12:264136 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4137 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4138 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4139 TestGroupId("a")));
4140 EXPECT_EQ(0u,
4141 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394142 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484143
4144 ClientSocketHandle handle;
4145 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394146 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524147 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284148 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394149 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4150 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484151
4152 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394153 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484154
4155 TestLoadTimingInfoConnectedReused(handle);
4156 handle.Reset();
4157 TestLoadTimingInfoNotConnected(handle);
4158}
4159
[email protected]dcbe168a2010-12-02 03:14:464160// http://crbug.com/64940 regression test.
4161TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4162 const int kMaxTotalSockets = 3;
4163 const int kMaxSocketsPerGroup = 2;
4164 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434165 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464166
Matt Menkef6edce752019-03-19 17:21:564167 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464168 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4169
4170 // Set up one idle socket in "a".
4171 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524172 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204173 EXPECT_EQ(
4174 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524175 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284176 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504177 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4178 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264179 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4180 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4181 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4182 TestGroupId("a")));
4183 EXPECT_EQ(0u,
4184 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394185 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464186
Lily Chenecebf932018-11-02 17:15:434187 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014188 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264189 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4190 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4191 TestGroupId("a")));
4192 EXPECT_EQ(0u,
4193 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4194 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434195
[email protected]dcbe168a2010-12-02 03:14:464196 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394197 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464198
4199 // Set up two active sockets in "b".
4200 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524201 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204202 EXPECT_EQ(
4203 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524204 handle1.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284205 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504206 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4207 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204208 EXPECT_EQ(
4209 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524210 handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284211 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504212 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4213 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464214
Matt Menke9fa17d52019-03-25 19:12:264215 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4216 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4217 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4218 TestGroupId("b")));
4219 EXPECT_EQ(0u,
4220 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394221 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434222
4223 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014224 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4225 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394226 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264227 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4228 TestGroupId("b")));
4229 EXPECT_EQ(0u,
4230 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4231 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464232
4233 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4234 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4235 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4236 // sockets for "a", and "b" should still have 2 active sockets.
4237
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214238 EXPECT_EQ(
4239 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4240 CompletionOnceCallback(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264241 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4242 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4243 TestGroupId("a")));
4244 EXPECT_EQ(0u,
4245 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394246 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264247 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4248 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4249 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4250 TestGroupId("b")));
4251 EXPECT_EQ(0u,
4252 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394253 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264254 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464255
4256 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4257 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4258 // "a" should result in closing 1 for "b".
4259 handle1.Reset();
4260 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394261 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264262 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464263
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214264 TestCompletionCallback preconnect_callback;
4265 EXPECT_EQ(ERR_IO_PENDING,
4266 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
4267 preconnect_callback.callback(),
4268 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264269 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4270 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4271 TestGroupId("a")));
4272 EXPECT_EQ(1u,
4273 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394274 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264275 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4276 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4277 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4278 TestGroupId("b")));
4279 EXPECT_EQ(0u,
4280 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394281 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264282 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464283}
4284
[email protected]b7b8be42011-07-12 12:46:414285TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264286 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4287 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074288
4289 // Make the ConnectJob hang until it times out, shorten the timeout.
4290 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Peter Kastinge5a38ed2021-10-02 03:06:354291 connect_job_factory_->set_timeout_duration(base::Milliseconds(500));
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214292 TestCompletionCallback preconnect_callback;
4293 EXPECT_EQ(ERR_IO_PENDING,
4294 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4295 preconnect_callback.callback(),
4296 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264297 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4298 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4299 TestGroupId("a")));
4300 EXPECT_EQ(1u,
4301 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394302 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074303
[email protected]b7b8be42011-07-12 12:46:414304 // Verify the backup timer doesn't create a backup job, by making
4305 // the backup job a pending job instead of a waiting job, so it
4306 // *would* complete if it were created.
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594307 base::RunLoop loop;
[email protected]a9fc8fc2011-05-10 02:41:074308 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Sean Maher5b9af51f2022-11-21 15:32:474309 base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
Peter Kastinge5a38ed2021-10-02 03:06:354310 FROM_HERE, loop.QuitClosure(), base::Seconds(1));
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594311 loop.Run();
Matt Menke9fa17d52019-03-25 19:12:264312 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074313}
4314
[email protected]b7b8be42011-07-12 12:46:414315TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264316 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4317 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074318
4319 // Make the ConnectJob hang forever.
4320 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214321 TestCompletionCallback preconnect_callback;
4322 EXPECT_EQ(ERR_IO_PENDING,
4323 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4324 preconnect_callback.callback(),
4325 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264326 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4327 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4328 TestGroupId("a")));
4329 EXPECT_EQ(1u,
4330 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394331 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284332 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074333
4334 // Make the backup job be a pending job, so it completes normally.
4335 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4336 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524337 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504338 EXPECT_EQ(
4339 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524340 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284341 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4342 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4343 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414344 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264345 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4346 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4347 TestGroupId("a")));
4348 EXPECT_EQ(0u,
4349 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394350 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264351 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014352 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074353
4354 // The hung connect job should still be there, but everything else should be
4355 // complete.
Matt Menke9fa17d52019-03-25 19:12:264356 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4357 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4358 TestGroupId("a")));
4359 EXPECT_EQ(1u,
4360 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394361 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264362 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074363}
4364
[email protected]0dc88b32014-03-26 20:12:284365// Tests that a preconnect that starts out with unread data can still be used.
4366// http://crbug.com/334467
4367TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4368 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4369 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4370
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214371 EXPECT_EQ(
4372 OK, pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4373 CompletionOnceCallback(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284374
Matt Menke9fa17d52019-03-25 19:12:264375 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4376 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4377 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4378 TestGroupId("a")));
4379 EXPECT_EQ(0u,
4380 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394381 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284382
4383 // Fail future jobs to be sure that handle receives the preconnected socket
4384 // rather than closing it and making a new one.
4385 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4386 ClientSocketHandle handle;
4387 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394388 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524389 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284390 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394391 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4392 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284393
Matt Menke9fa17d52019-03-25 19:12:264394 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4395 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4396 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4397 TestGroupId("a")));
4398 EXPECT_EQ(0u,
4399 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394400 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264401 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284402
4403 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354404 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284405
4406 TestLoadTimingInfoConnectedReused(handle);
4407 handle.Reset();
4408
4409 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394410 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284411}
4412
Lily Chenecebf932018-11-02 17:15:434413TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4414 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4415 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4416
4417 ClientSocketHandle handle1;
4418 TestCompletionCallback callback1;
4419 EXPECT_EQ(
4420 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524421 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284422 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504423 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4424 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434425
Matt Menke9fa17d52019-03-25 19:12:264426 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4427 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4428 TestGroupId("a")));
4429 EXPECT_EQ(0u,
4430 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394431 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434432
Matt Menkec6b3edf72019-03-19 17:00:394433 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4434 &handle1));
Lily Chenecebf932018-11-02 17:15:434435}
4436
4437TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4438 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4439 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4440
4441 ClientSocketHandle handle1;
4442 TestCompletionCallback callback1;
4443 EXPECT_EQ(
4444 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524445 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284446 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504447 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4448 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434449
Matt Menke9fa17d52019-03-25 19:12:264450 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4451 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4452 TestGroupId("a")));
4453 EXPECT_EQ(0u,
4454 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394455 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434456
4457 ClientSocketHandle handle2;
4458 TestCompletionCallback callback2;
4459 EXPECT_EQ(
4460 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524461 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284462 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504463 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4464 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434465
Matt Menke9fa17d52019-03-25 19:12:264466 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4467 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4468 TestGroupId("a")));
4469 EXPECT_EQ(0u,
4470 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394471 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434472
Matt Menkec6b3edf72019-03-19 17:00:394473 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4474 &handle1));
4475 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4476 &handle2));
Lily Chenecebf932018-11-02 17:15:434477
4478 // One job completes. The other request should still have its job.
4479 client_socket_factory_.SignalJob(0);
4480 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4481
Matt Menke9fa17d52019-03-25 19:12:264482 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4483 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4484 TestGroupId("a")));
4485 EXPECT_EQ(0u,
4486 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4487 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394488 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434489
Matt Menkec6b3edf72019-03-19 17:00:394490 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4491 &handle2));
Lily Chenecebf932018-11-02 17:15:434492}
4493
4494TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4495 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4496 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4497
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:214498 TestCompletionCallback preconnect_callback;
4499 EXPECT_EQ(ERR_IO_PENDING,
4500 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
4501 preconnect_callback.callback(),
4502 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434503
Matt Menke9fa17d52019-03-25 19:12:264504 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4505 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4506 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4507 TestGroupId("a")));
4508 EXPECT_EQ(1u,
4509 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394510 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434511
4512 ClientSocketHandle handle1;
4513 TestCompletionCallback callback1;
4514 EXPECT_EQ(
4515 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524516 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284517 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504518 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4519 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434520
Matt Menke9fa17d52019-03-25 19:12:264521 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4522 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4523 TestGroupId("a")));
4524 EXPECT_EQ(0u,
4525 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394526 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434527
Matt Menkec6b3edf72019-03-19 17:00:394528 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4529 &handle1));
Lily Chenecebf932018-11-02 17:15:434530}
4531
4532TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4533 CreatePool(kDefaultMaxSockets, 1);
4534 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4535
4536 ClientSocketHandle handle1;
4537 TestCompletionCallback callback1;
4538 EXPECT_EQ(
4539 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524540 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284541 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504542 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4543 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434544
Matt Menke9fa17d52019-03-25 19:12:264545 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4546 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4547 TestGroupId("a")));
4548 EXPECT_EQ(0u,
4549 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394550 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434551
Matt Menkec6b3edf72019-03-19 17:00:394552 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4553 &handle1));
Lily Chenecebf932018-11-02 17:15:434554
4555 // Insert a higher priority request
4556 ClientSocketHandle handle2;
4557 TestCompletionCallback callback2;
4558 EXPECT_EQ(
4559 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524560 handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284561 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504562 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4563 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434564
Matt Menke9fa17d52019-03-25 19:12:264565 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4566 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4567 TestGroupId("a")));
4568 EXPECT_EQ(0u,
4569 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394570 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434571
4572 // The highest priority request should steal the job from the default priority
4573 // request.
Matt Menkec6b3edf72019-03-19 17:00:394574 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4575 &handle2));
4576 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4577 &handle1));
Lily Chenecebf932018-11-02 17:15:434578}
4579
4580TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4581 CreatePool(3, 3);
4582 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4583
4584 ClientSocketHandle handle_lowest;
4585 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284586 EXPECT_EQ(
4587 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524588 handle_lowest.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284589 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4590 callback_lowest.callback(),
4591 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4592 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434593
Matt Menke9fa17d52019-03-25 19:12:264594 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4595 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4596 TestGroupId("a")));
4597 EXPECT_EQ(0u,
4598 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394599 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434600
4601 ClientSocketHandle handle_highest;
4602 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284603 EXPECT_EQ(
4604 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524605 handle_highest.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284606 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4607 callback_highest.callback(),
4608 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4609 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434610
Matt Menke9fa17d52019-03-25 19:12:264611 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4612 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4613 TestGroupId("a")));
4614 EXPECT_EQ(0u,
4615 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394616 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434617
4618 ClientSocketHandle handle_low;
4619 TestCompletionCallback callback_low;
4620 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284621 handle_low.Init(
Anton Bikineev068d2912021-05-15 20:43:524622 TestGroupId("a"), params_, absl::nullopt, LOW, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284623 ClientSocketPool::RespectLimits::ENABLED,
4624 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4625 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434626
Matt Menke9fa17d52019-03-25 19:12:264627 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4628 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4629 TestGroupId("a")));
4630 EXPECT_EQ(0u,
4631 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394632 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434633
4634 ClientSocketHandle handle_lowest2;
4635 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284636 EXPECT_EQ(
4637 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524638 handle_lowest2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284639 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4640 callback_lowest2.callback(),
4641 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4642 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434643
Matt Menke9fa17d52019-03-25 19:12:264644 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4645 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4646 TestGroupId("a")));
4647 EXPECT_EQ(0u,
4648 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394649 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434650
4651 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394652 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4653 &handle_highest));
4654 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4655 &handle_low));
4656 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4657 &handle_lowest));
4658 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4659 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434660
4661 // Add another request with medium priority. It should steal the job from the
4662 // lowest priority request with a job.
4663 ClientSocketHandle handle_medium;
4664 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284665 EXPECT_EQ(
4666 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524667 handle_medium.Init(TestGroupId("a"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:284668 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4669 callback_medium.callback(),
4670 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4671 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434672
Matt Menke9fa17d52019-03-25 19:12:264673 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4674 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4675 TestGroupId("a")));
4676 EXPECT_EQ(0u,
4677 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394678 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4679 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4680 &handle_highest));
4681 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4682 &handle_medium));
4683 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4684 &handle_low));
4685 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4686 &handle_lowest));
4687 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4688 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434689}
4690
4691TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4692 CreatePool(kDefaultMaxSockets, 1);
4693 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4694
4695 ClientSocketHandle handle1;
4696 TestCompletionCallback callback1;
4697 EXPECT_EQ(
4698 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524699 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284700 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504701 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4702 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434703
Matt Menke9fa17d52019-03-25 19:12:264704 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4705 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4706 TestGroupId("a")));
4707 EXPECT_EQ(0u,
4708 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394709 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434710
4711 ClientSocketHandle handle2;
4712 TestCompletionCallback callback2;
4713 EXPECT_EQ(
4714 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524715 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284716 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504717 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4718 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434719
Matt Menke9fa17d52019-03-25 19:12:264720 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4721 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4722 TestGroupId("a")));
4723 EXPECT_EQ(0u,
4724 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394725 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434726
4727 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394728 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4729 &handle1));
4730 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4731 &handle2));
Lily Chenecebf932018-11-02 17:15:434732
4733 // Reprioritizing the second request places it above the first, and it steals
4734 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394735 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4736 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4737 &handle2));
4738 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4739 &handle1));
Lily Chenecebf932018-11-02 17:15:434740}
4741
4742TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4743 CreatePool(kDefaultMaxSockets, 1);
4744 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4745
4746 ClientSocketHandle handle1;
4747 TestCompletionCallback callback1;
4748 EXPECT_EQ(
4749 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524750 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284751 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504752 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4753 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434754
Matt Menke9fa17d52019-03-25 19:12:264755 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4756 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4757 TestGroupId("a")));
4758 EXPECT_EQ(0u,
4759 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394760 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434761
Matt Menkec6b3edf72019-03-19 17:00:394762 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4763 &handle1));
Lily Chenecebf932018-11-02 17:15:434764
4765 ClientSocketHandle handle2;
4766 TestCompletionCallback callback2;
4767 EXPECT_EQ(
4768 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524769 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284770 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504771 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4772 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434773
Matt Menke9fa17d52019-03-25 19:12:264774 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4775 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4776 TestGroupId("a")));
4777 EXPECT_EQ(0u,
4778 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394779 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434780
4781 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394782 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4783 &handle1));
4784 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4785 &handle2));
Lily Chenecebf932018-11-02 17:15:434786
4787 // The second request should get a job upon cancelling the first request.
4788 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264789 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4790 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4791 TestGroupId("a")));
4792 EXPECT_EQ(0u,
4793 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394794 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434795
Matt Menkec6b3edf72019-03-19 17:00:394796 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4797 &handle2));
Lily Chenecebf932018-11-02 17:15:434798}
4799
4800TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4801 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4802 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4803
4804 ClientSocketHandle handle1;
4805 TestCompletionCallback callback1;
4806 EXPECT_EQ(
4807 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524808 handle1.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284809 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504810 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4811 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434812
Matt Menke9fa17d52019-03-25 19:12:264813 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4814 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4815 TestGroupId("a")));
4816 EXPECT_EQ(0u,
4817 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394818 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434819
4820 ClientSocketHandle handle2;
4821 TestCompletionCallback callback2;
4822 EXPECT_EQ(
4823 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524824 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284825 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504826 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4827 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434828
Matt Menke9fa17d52019-03-25 19:12:264829 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4830 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4831 TestGroupId("a")));
4832 EXPECT_EQ(0u,
4833 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394834 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434835
Matt Menkec6b3edf72019-03-19 17:00:394836 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4837 &handle1));
4838 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4839 &handle2));
Lily Chenecebf932018-11-02 17:15:434840
4841 // The lower-priority job completes first. The higher-priority request should
4842 // get the socket, and the lower-priority request should get the remaining
4843 // job.
4844 client_socket_factory_.SignalJob(1);
4845 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264846 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4847 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4848 TestGroupId("a")));
4849 EXPECT_EQ(0u,
4850 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4851 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394852 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434853 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394854 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4855 &handle2));
Lily Chenecebf932018-11-02 17:15:434856}
4857
[email protected]043b68c82013-08-22 23:41:524858class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204859 public:
Matt Menke9fa17d52019-03-25 19:12:264860 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394861 const ClientSocketPool::GroupId& group_id)
Tsuyoshi Horo2ec06e002022-06-09 01:38:594862 : pool_(pool), group_id_(group_id) {
[email protected]043b68c82013-08-22 23:41:524863 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204864 }
4865
Daniel Cheng4496d0822018-04-26 21:52:154866 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204867
Matt Menke9fa17d52019-03-25 19:12:264868 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504869 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034870 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524871 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284872 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4873 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204874 }
4875
Matt Menke9fa17d52019-03-25 19:12:264876 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504877 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034878 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524879 absl::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504880 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4881 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204882 }
4883
4884 bool ReleaseOneConnection() {
4885 if (!handle_.is_initialized() || !can_release_connection_) {
4886 return false;
4887 }
4888 handle_.socket()->Disconnect();
4889 handle_.Reset();
4890 return true;
4891 }
4892
4893 void set_can_release_connection(bool can_release_connection) {
4894 can_release_connection_ = can_release_connection;
4895 }
4896
4897 MOCK_METHOD0(CloseOneIdleConnection, bool());
4898
4899 private:
Keishi Hattori0e45c022021-11-27 09:25:524900 const raw_ptr<TransportClientSocketPool> pool_;
[email protected]58e562f2013-04-22 17:32:204901 ClientSocketHandle handle_;
4902 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394903 const ClientSocketPool::GroupId group_id_;
Tsuyoshi Horo2ec06e002022-06-09 01:38:594904 bool can_release_connection_ = true;
[email protected]58e562f2013-04-22 17:32:204905};
4906
[email protected]58e562f2013-04-22 17:32:204907// Tests the basic case of closing an idle socket in a higher layered pool when
4908// a new request is issued and the lower layer pool is stalled.
4909TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4910 CreatePool(1, 1);
4911 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4912
Matt Menkec6b3edf72019-03-19 17:00:394913 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014914 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204915 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4916 .WillOnce(Invoke(&mock_layered_pool,
4917 &MockLayeredPool::ReleaseOneConnection));
4918 ClientSocketHandle handle;
4919 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504920 EXPECT_EQ(
4921 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524922 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284923 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4924 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4925 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014926 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204927}
4928
Matt Menke833678642019-03-05 22:05:514929// Tests the case that trying to close an idle socket in a higher layered pool
4930// fails.
4931TEST_F(ClientSocketPoolBaseTest,
4932 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4933 CreatePool(1, 1);
4934 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4935
Matt Menkec6b3edf72019-03-19 17:00:394936 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514937 mock_layered_pool.set_can_release_connection(false);
4938 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4939 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4940 .WillOnce(Invoke(&mock_layered_pool,
4941 &MockLayeredPool::ReleaseOneConnection));
4942 ClientSocketHandle handle;
4943 TestCompletionCallback callback;
4944 EXPECT_EQ(
4945 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524946 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284947 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4948 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4949 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514950 base::RunLoop().RunUntilIdle();
4951 EXPECT_FALSE(callback.have_result());
4952}
4953
[email protected]58e562f2013-04-22 17:32:204954// Same as above, but the idle socket is in the same group as the stalled
4955// socket, and closes the only other request in its group when closing requests
4956// in higher layered pools. This generally shouldn't happen, but it may be
4957// possible if a higher level pool issues a request and the request is
4958// subsequently cancelled. Even if it's not possible, best not to crash.
4959TEST_F(ClientSocketPoolBaseTest,
4960 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4961 CreatePool(2, 2);
4962 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4963
4964 // Need a socket in another group for the pool to be stalled (If a group
4965 // has the maximum number of connections already, it's not stalled).
4966 ClientSocketHandle handle1;
4967 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524968 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284969 DEFAULT_PRIORITY, SocketTag(),
4970 ClientSocketPool::RespectLimits::ENABLED,
4971 callback1.callback(),
4972 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4973 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204974
Matt Menkec6b3edf72019-03-19 17:00:394975 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014976 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204977 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4978 .WillOnce(Invoke(&mock_layered_pool,
4979 &MockLayeredPool::ReleaseOneConnection));
4980 ClientSocketHandle handle;
4981 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284982 EXPECT_EQ(ERR_IO_PENDING,
4983 handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524984 TestGroupId("group2"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284985 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4986 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4987 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014988 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204989}
4990
4991// Tests the case when an idle socket can be closed when a new request is
4992// issued, and the new request belongs to a group that was previously stalled.
4993TEST_F(ClientSocketPoolBaseTest,
4994 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4995 CreatePool(2, 2);
4996 std::list<TestConnectJob::JobType> job_types;
4997 job_types.push_back(TestConnectJob::kMockJob);
4998 job_types.push_back(TestConnectJob::kMockJob);
4999 job_types.push_back(TestConnectJob::kMockJob);
5000 job_types.push_back(TestConnectJob::kMockJob);
5001 connect_job_factory_->set_job_types(&job_types);
5002
5003 ClientSocketHandle handle1;
5004 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:525005 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:285006 DEFAULT_PRIORITY, SocketTag(),
5007 ClientSocketPool::RespectLimits::ENABLED,
5008 callback1.callback(),
5009 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5010 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205011
Matt Menkec6b3edf72019-03-19 17:00:395012 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:015013 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205014 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
5015 .WillRepeatedly(Invoke(&mock_layered_pool,
5016 &MockLayeredPool::ReleaseOneConnection));
5017 mock_layered_pool.set_can_release_connection(false);
5018
5019 // The third request is made when the socket pool is in a stalled state.
5020 ClientSocketHandle handle3;
5021 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:285022 EXPECT_EQ(ERR_IO_PENDING,
5023 handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:525024 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285025 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5026 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5027 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205028
5029 base::RunLoop().RunUntilIdle();
5030 EXPECT_FALSE(callback3.have_result());
5031
5032 // The fourth request is made when the pool is no longer stalled. The third
5033 // request should be serviced first, since it was issued first and has the
5034 // same priority.
5035 mock_layered_pool.set_can_release_connection(true);
5036 ClientSocketHandle handle4;
5037 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:285038 EXPECT_EQ(ERR_IO_PENDING,
5039 handle4.Init(
Anton Bikineev068d2912021-05-15 20:43:525040 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285041 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5042 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5043 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015044 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205045 EXPECT_FALSE(callback4.have_result());
5046
5047 // Closing a handle should free up another socket slot.
5048 handle1.Reset();
robpercival214763f2016-07-01 23:27:015049 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205050}
5051
5052// Tests the case when an idle socket can be closed when a new request is
5053// issued, and the new request belongs to a group that was previously stalled.
5054//
5055// The two differences from the above test are that the stalled requests are not
5056// in the same group as the layered pool's request, and the the fourth request
5057// has a higher priority than the third one, so gets a socket first.
5058TEST_F(ClientSocketPoolBaseTest,
5059 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
5060 CreatePool(2, 2);
5061 std::list<TestConnectJob::JobType> job_types;
5062 job_types.push_back(TestConnectJob::kMockJob);
5063 job_types.push_back(TestConnectJob::kMockJob);
5064 job_types.push_back(TestConnectJob::kMockJob);
5065 job_types.push_back(TestConnectJob::kMockJob);
5066 connect_job_factory_->set_job_types(&job_types);
5067
5068 ClientSocketHandle handle1;
5069 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:525070 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:285071 DEFAULT_PRIORITY, SocketTag(),
5072 ClientSocketPool::RespectLimits::ENABLED,
5073 callback1.callback(),
5074 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5075 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205076
Matt Menkec6b3edf72019-03-19 17:00:395077 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:015078 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205079 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
5080 .WillRepeatedly(Invoke(&mock_layered_pool,
5081 &MockLayeredPool::ReleaseOneConnection));
5082 mock_layered_pool.set_can_release_connection(false);
5083
5084 // The third request is made when the socket pool is in a stalled state.
5085 ClientSocketHandle handle3;
5086 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:205087 EXPECT_EQ(
5088 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525089 handle3.Init(TestGroupId("group3"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:285090 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505091 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5092 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205093
5094 base::RunLoop().RunUntilIdle();
5095 EXPECT_FALSE(callback3.have_result());
5096
5097 // The fourth request is made when the pool is no longer stalled. This
5098 // request has a higher priority than the third request, so is serviced first.
5099 mock_layered_pool.set_can_release_connection(true);
5100 ClientSocketHandle handle4;
5101 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:205102 EXPECT_EQ(
5103 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525104 handle4.Init(TestGroupId("group3"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:285105 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505106 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5107 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015108 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205109 EXPECT_FALSE(callback3.have_result());
5110
5111 // Closing a handle should free up another socket slot.
5112 handle1.Reset();
robpercival214763f2016-07-01 23:27:015113 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205114}
5115
5116TEST_F(ClientSocketPoolBaseTest,
5117 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
5118 CreatePool(1, 1);
5119 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5120
Matt Menkec6b3edf72019-03-19 17:00:395121 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:015122 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205123 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
5124 .WillRepeatedly(Invoke(&mock_layered_pool1,
5125 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:395126 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:015127 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
5128 IsOk());
[email protected]58e562f2013-04-22 17:32:205129 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
5130 .WillRepeatedly(Invoke(&mock_layered_pool2,
5131 &MockLayeredPool::ReleaseOneConnection));
5132 ClientSocketHandle handle;
5133 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:505134 EXPECT_EQ(
5135 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525136 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285137 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5138 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5139 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015140 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205141}
5142
[email protected]b021ece62013-06-11 11:06:335143// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:155144// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
5145// socket instead of a request with the same priority that was issued earlier,
5146// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:335147TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:335148 CreatePool(1, 1);
5149
5150 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395151 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5152 TestGroupId("a"), MAXIMUM_PRIORITY,
5153 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265154 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335155
5156 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5157
mmenked3641e12016-01-28 16:06:155158 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395159 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155160 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265161 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335162
mmenked3641e12016-01-28 16:06:155163 // Issue a request that ignores the limits, so a new ConnectJob is
5164 // created.
5165 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395166 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155167 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265168 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335169
robpercival214763f2016-07-01 23:27:015170 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335171 EXPECT_FALSE(request(1)->have_result());
5172}
5173
[email protected]c55fabd2013-11-04 23:26:565174// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155175// issued for a request with RespectLimits::DISABLED is not cancelled when a
5176// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565177TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565178 CreatePool(1, 1);
5179
5180 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395181 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5182 TestGroupId("a"), MAXIMUM_PRIORITY,
5183 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265184 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565185
5186 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5187
mmenked3641e12016-01-28 16:06:155188 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395189 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155190 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265191 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565192
mmenked3641e12016-01-28 16:06:155193 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5194 // created.
5195 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395196 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155197 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265198 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335199
mmenked3641e12016-01-28 16:06:155200 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335201 // should not be cancelled.
5202 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265203 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335204
robpercival214763f2016-07-01 23:27:015205 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335206 EXPECT_FALSE(request(1)->have_result());
5207}
5208
Matt Menkeb57663b32019-03-01 17:17:105209TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5210 CreatePool(1, 1);
5211
5212 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5213
5214 ClientSocketHandle handle;
5215 TestCompletionCallback callback;
5216 EXPECT_EQ(
5217 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525218 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285219 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5220 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5221 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105222
Matt Menke9fa17d52019-03-25 19:12:265223 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105224
5225 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5226 EXPECT_FALSE(handle.is_initialized());
5227 EXPECT_FALSE(handle.socket());
5228
5229 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265230 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105231}
5232
5233class TestAuthHelper {
5234 public:
5235 TestAuthHelper() = default;
Peter Boström293b1342021-09-22 17:31:435236
5237 TestAuthHelper(const TestAuthHelper&) = delete;
5238 TestAuthHelper& operator=(const TestAuthHelper&) = delete;
5239
Matt Menkeb57663b32019-03-01 17:17:105240 ~TestAuthHelper() = default;
5241
Matt Menkec6b3edf72019-03-19 17:00:395242 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195243 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265244 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395245 RequestPriority priority = DEFAULT_PRIORITY,
5246 ClientSocketPool::RespectLimits respect_limits =
5247 ClientSocketPool::RespectLimits::ENABLED,
5248 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105249 EXPECT_EQ(ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525250 handle_.Init(group_id_in, params, absl::nullopt, priority,
Matt Menkef09e64c2019-04-23 22:16:285251 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105252 base::BindRepeating(&TestAuthHelper::AuthCallback,
5253 base::Unretained(this)),
5254 pool, NetLogWithSource()));
5255 }
5256
5257 void WaitForAuth() {
5258 run_loop_ = std::make_unique<base::RunLoop>();
5259 run_loop_->Run();
5260 run_loop_.reset();
5261 }
5262
5263 void WaitForAuthAndRestartSync() {
5264 restart_sync_ = true;
5265 WaitForAuth();
5266 restart_sync_ = false;
5267 }
5268
5269 void WaitForAuthAndResetHandleSync() {
5270 reset_handle_sync_ = true;
5271 WaitForAuth();
5272 reset_handle_sync_ = false;
5273 }
5274
5275 void RestartWithAuth() {
5276 DCHECK(restart_with_auth_callback_);
5277 std::move(restart_with_auth_callback_).Run();
5278 }
5279
5280 int WaitForResult() {
5281 int result = callback_.WaitForResult();
5282 // There shouldn't be any callback waiting to be invoked once the request is
5283 // complete.
5284 EXPECT_FALSE(restart_with_auth_callback_);
5285 // The socket should only be initialized on success.
5286 EXPECT_EQ(result == OK, handle_.is_initialized());
5287 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5288 return result;
5289 }
5290
5291 ClientSocketHandle* handle() { return &handle_; }
5292 int auth_count() const { return auth_count_; }
5293 int have_result() const { return callback_.have_result(); }
5294
5295 private:
5296 void AuthCallback(const HttpResponseInfo& response,
5297 HttpAuthController* auth_controller,
5298 base::OnceClosure restart_with_auth_callback) {
5299 EXPECT_FALSE(restart_with_auth_callback_);
5300 EXPECT_TRUE(restart_with_auth_callback);
5301
5302 // Once there's a result, this method shouldn't be invoked again.
5303 EXPECT_FALSE(callback_.have_result());
5304
5305 ++auth_count_;
5306 run_loop_->Quit();
5307 if (restart_sync_) {
5308 std::move(restart_with_auth_callback).Run();
5309 return;
5310 }
5311
5312 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5313
5314 if (reset_handle_sync_) {
5315 handle_.Reset();
5316 return;
5317 }
5318 }
5319
5320 std::unique_ptr<base::RunLoop> run_loop_;
5321 base::OnceClosure restart_with_auth_callback_;
5322
5323 bool restart_sync_ = false;
5324 bool reset_handle_sync_ = false;
5325
5326 ClientSocketHandle handle_;
5327 int auth_count_ = 0;
5328 TestCompletionCallback callback_;
Matt Menkeb57663b32019-03-01 17:17:105329};
5330
5331TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5332 CreatePool(1, 1);
5333 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5334
5335 TestAuthHelper auth_helper;
5336 auth_helper.InitHandle(params_, pool_.get());
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_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395339 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105340
5341 auth_helper.WaitForAuth();
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 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265347 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015348 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395349 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105350
5351 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5352 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265353 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5354 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395355 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105356 EXPECT_EQ(0, pool_->IdleSocketCount());
5357}
5358
5359TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5360 CreatePool(1, 1);
5361 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5362
5363 TestAuthHelper auth_helper;
5364 auth_helper.InitHandle(params_, pool_.get());
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_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395367 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105368
5369 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265370 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015371 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395372 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105373
5374 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5375 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265376 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5377 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395378 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105379 EXPECT_EQ(0, pool_->IdleSocketCount());
5380}
5381
5382TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5383 CreatePool(1, 1);
5384 connect_job_factory_->set_job_type(
5385 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5386
5387 TestAuthHelper auth_helper;
5388 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265389 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105390
5391 auth_helper.WaitForAuth();
5392 auth_helper.RestartWithAuth();
5393 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5394
5395 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265396 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105397 EXPECT_EQ(0, pool_->IdleSocketCount());
5398}
5399
5400TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5401 CreatePool(1, 1);
5402 connect_job_factory_->set_job_type(
5403 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5404
5405 TestAuthHelper auth_helper;
5406 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265407 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105408
5409 auth_helper.WaitForAuthAndRestartSync();
5410 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5411
5412 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265413 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105414 EXPECT_EQ(0, pool_->IdleSocketCount());
5415}
5416
5417TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5418 CreatePool(1, 1);
5419 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5420
5421 TestAuthHelper auth_helper;
5422 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265423 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105424
5425 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265426 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105427
5428 auth_helper.handle()->Reset();
5429
5430 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265431 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105432 EXPECT_EQ(0, pool_->IdleSocketCount());
5433 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5434 EXPECT_FALSE(auth_helper.handle()->socket());
5435}
5436
5437TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5438 CreatePool(1, 1);
5439 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5440
5441 TestAuthHelper auth_helper;
5442 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265443 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105444
5445 auth_helper.WaitForAuthAndResetHandleSync();
5446 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265447 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105448 EXPECT_EQ(0, pool_->IdleSocketCount());
5449 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5450 EXPECT_FALSE(auth_helper.handle()->socket());
5451}
5452
5453TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5454 CreatePool(1, 1);
5455 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5456
5457 TestAuthHelper auth_helper;
5458 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265459 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105460
5461 auth_helper.WaitForAuth();
5462
Matt Menke433de6d2020-03-04 00:24:115463 pool_->FlushWithError(ERR_FAILED, "Network changed");
Matt Menkeb57663b32019-03-01 17:17:105464 base::RunLoop().RunUntilIdle();
5465
5466 // When flushing the socket pool, bound sockets should delay returning the
5467 // error until completion.
5468 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265469 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105470 EXPECT_EQ(0, pool_->IdleSocketCount());
5471
5472 auth_helper.RestartWithAuth();
5473 // The callback should be called asynchronously.
5474 EXPECT_FALSE(auth_helper.have_result());
5475
5476 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265477 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105478 EXPECT_EQ(0, pool_->IdleSocketCount());
5479}
5480
5481TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5482 CreatePool(1, 1);
5483 connect_job_factory_->set_job_type(
5484 TestConnectJob::kMockAuthChallengeTwiceJob);
5485
5486 TestAuthHelper auth_helper;
5487 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265488 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015489 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395490 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105491
5492 auth_helper.WaitForAuth();
5493 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265494 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105495 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015496 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395497 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105498
5499 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265500 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015501 EXPECT_EQ(2, auth_helper.auth_count());
5502 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395503 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015504
Matt Menkeb57663b32019-03-01 17:17:105505 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265506 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105507 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015508 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395509 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105510
5511 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5512 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265513 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5514 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395515 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105516 EXPECT_EQ(0, pool_->IdleSocketCount());
5517}
5518
5519TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5520 CreatePool(1, 1);
5521 connect_job_factory_->set_job_type(
5522 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5523
5524 TestAuthHelper auth_helper;
5525 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265526 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105527
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(1, auth_helper.auth_count());
5532
5533 auth_helper.WaitForAuth();
5534 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265535 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105536 EXPECT_EQ(2, auth_helper.auth_count());
5537
5538 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5539 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265540 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105541 EXPECT_EQ(0, pool_->IdleSocketCount());
5542}
5543
5544// Makes sure that when a bound request is destroyed, a new ConnectJob is
5545// created, if needed.
5546TEST_F(ClientSocketPoolBaseTest,
5547 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5548 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5549 connect_job_factory_->set_job_type(
5550 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5551
5552 // First request creates a ConnectJob.
5553 TestAuthHelper auth_helper1;
5554 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265555 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105556
5557 // A second request come in, but no new ConnectJob is needed, since the limit
5558 // has been reached.
5559 TestAuthHelper auth_helper2;
5560 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265561 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105562
5563 // Run until the auth callback for the first request is invoked.
5564 auth_helper1.WaitForAuth();
5565 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265566 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5567 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395568 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105569
5570 // Make connect jobs succeed, then cancel the first request, which should
5571 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5572 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5573 auth_helper1.handle()->Reset();
5574 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265575 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105576
5577 // The second ConnectJob should succeed.
5578 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5579 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265580 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105581}
5582
5583// Makes sure that when a bound request is destroyed, a new ConnectJob is
5584// created for another group, if needed.
5585TEST_F(ClientSocketPoolBaseTest,
5586 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5587 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5588 connect_job_factory_->set_job_type(
5589 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5590
5591 // First request creates a ConnectJob.
5592 TestAuthHelper auth_helper1;
5593 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265594 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105595
5596 // A second request come in, but no new ConnectJob is needed, since the limit
5597 // has been reached.
5598 TestAuthHelper auth_helper2;
5599 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395600 ClientSocketPool::RespectLimits::ENABLED,
5601 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265602 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5603 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105604
5605 // Run until the auth callback for the first request is invoked.
5606 auth_helper1.WaitForAuth();
5607 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265608 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5609 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395610 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265611 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5612 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395613 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105614
5615 // Make connect jobs succeed, then cancel the first request, which should
5616 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5617 // other group.
5618 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5619 auth_helper1.handle()->Reset();
5620 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265621 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5622 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105623
5624 // The second ConnectJob should succeed.
5625 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5626 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265627 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5628 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105629}
5630
5631// Test that once an auth challenge is bound, that's the request that gets all
5632// subsequent calls and the socket itself.
5633TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5634 CreatePool(1, 1);
5635 connect_job_factory_->set_job_type(
5636 TestConnectJob::kMockAuthChallengeTwiceJob);
5637
5638 // First request creates a ConnectJob.
5639 TestAuthHelper auth_helper1;
5640 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265641 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105642
5643 // A second, higher priority request is made.
5644 TestAuthHelper auth_helper2;
5645 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265646 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105647
5648 // Run until the auth callback for the second request is invoked.
5649 auth_helper2.WaitForAuth();
5650 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265651 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5652 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395653 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105654
5655 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5656 // ConnectJob.
5657 TestAuthHelper auth_helper3;
5658 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265659 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105660
5661 // Start a higher job that ignores limits, creating a hanging socket. It
5662 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5663 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5664 TestAuthHelper auth_helper4;
5665 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5666 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265667 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105668
5669 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5670 // again.
5671 auth_helper2.RestartWithAuth();
5672 auth_helper2.WaitForAuth();
5673 EXPECT_EQ(0, auth_helper1.auth_count());
5674 EXPECT_FALSE(auth_helper1.have_result());
5675 EXPECT_EQ(2, auth_helper2.auth_count());
5676 EXPECT_FALSE(auth_helper2.have_result());
5677 EXPECT_EQ(0, auth_helper3.auth_count());
5678 EXPECT_FALSE(auth_helper3.have_result());
5679 EXPECT_EQ(0, auth_helper4.auth_count());
5680 EXPECT_FALSE(auth_helper4.have_result());
5681
5682 // Advance auth again, and |auth_helper2| should get the socket.
5683 auth_helper2.RestartWithAuth();
5684 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5685 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5686 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265687 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5688 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105689 EXPECT_EQ(0, auth_helper1.auth_count());
5690 EXPECT_FALSE(auth_helper1.have_result());
5691 EXPECT_EQ(0, auth_helper3.auth_count());
5692 EXPECT_FALSE(auth_helper3.have_result());
5693 EXPECT_EQ(0, auth_helper4.auth_count());
5694 EXPECT_FALSE(auth_helper4.have_result());
5695
5696 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5697 // socket request should be able to claim it.
5698 auth_helper2.handle()->Reset();
5699 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5700 EXPECT_EQ(0, auth_helper1.auth_count());
5701 EXPECT_FALSE(auth_helper1.have_result());
5702 EXPECT_EQ(0, auth_helper3.auth_count());
5703 EXPECT_FALSE(auth_helper3.have_result());
5704 EXPECT_EQ(0, auth_helper4.auth_count());
5705}
5706
David Benjaminbac8dff2019-08-07 01:30:415707enum class RefreshType {
5708 kServer,
5709 kProxy,
5710};
5711
5712// Common base class to test RefreshGroup() when called from either
5713// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5714//
5715// Tests which test behavior specific to one or the other case should use
5716// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5717// when the pool's proxy matches.
5718class ClientSocketPoolBaseRefreshTest
5719 : public ClientSocketPoolBaseTest,
5720 public testing::WithParamInterface<RefreshType> {
5721 public:
5722 void CreatePoolForRefresh(int max_sockets,
5723 int max_sockets_per_group,
5724 bool enable_backup_connect_jobs = false) {
5725 switch (GetParam()) {
5726 case RefreshType::kServer:
5727 CreatePool(max_sockets, max_sockets_per_group,
5728 enable_backup_connect_jobs);
5729 break;
5730 case RefreshType::kProxy:
5731 CreatePoolWithIdleTimeouts(
5732 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5733 ClientSocketPool::used_idle_socket_timeout(),
5734 enable_backup_connect_jobs,
Eric Orth5ccc3f02021-09-23 00:01:575735 PacResultElementToProxyServer("HTTPS myproxy:70"));
David Benjaminbac8dff2019-08-07 01:30:415736 break;
5737 }
5738 }
5739
5740 static ClientSocketPool::GroupId GetGroupId() {
Eric Ortha2e7773212021-06-22 21:49:555741 return TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415742 }
5743
David Benjamin6dd7e882019-10-10 02:35:235744 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5745 // Note this GroupId will match GetGroupId() unless
Brianna Goldsteinabb3aac2022-10-07 12:06:005746 // kPartitionConnectionsByNetworkAnonymizationKey is enabled.
Matt Menke4807a9a2020-11-21 00:14:415747 const SchemefulSite kSite(GURL("https://b/"));
Brianna Goldsteina7593fca2022-09-28 02:59:325748 const NetworkAnonymizationKey kNetworkAnonymizationKey(
5749 kSite, kSite, /*is_cross_site=*/false);
Eric Ortha2e7773212021-06-22 21:49:555750 return TestGroupId("a", 443, url::kHttpsScheme,
David Benjamin6dd7e882019-10-10 02:35:235751 PrivacyMode::PRIVACY_MODE_DISABLED,
Brianna Goldsteina7593fca2022-09-28 02:59:325752 kNetworkAnonymizationKey);
David Benjamin6dd7e882019-10-10 02:35:235753 }
5754
David Benjaminbac8dff2019-08-07 01:30:415755 void OnSSLConfigForServerChanged() {
5756 switch (GetParam()) {
5757 case RefreshType::kServer:
5758 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5759 break;
5760 case RefreshType::kProxy:
5761 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5762 break;
5763 }
5764 }
5765};
5766
5767INSTANTIATE_TEST_SUITE_P(RefreshType,
5768 ClientSocketPoolBaseRefreshTest,
5769 ::testing::Values(RefreshType::kServer,
5770 RefreshType::kProxy));
5771
5772TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5773 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5774 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245775
5776 // First job will be waiting until it gets aborted.
5777 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5778
5779 ClientSocketHandle handle;
5780 TestCompletionCallback callback;
5781 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525782 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285783 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5784 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5785 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245786 IsError(ERR_IO_PENDING));
5787
5788 // Switch connect job types, so creating a new ConnectJob will result in
5789 // success.
5790 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5791
David Benjaminbac8dff2019-08-07 01:30:415792 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245793 EXPECT_EQ(OK, callback.WaitForResult());
5794 ASSERT_TRUE(handle.socket());
5795 EXPECT_EQ(0, pool_->IdleSocketCount());
5796 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5797 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5798 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5799 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5800}
5801
David Benjaminbac8dff2019-08-07 01:30:415802TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235803 base::test::ScopedFeatureList feature_list;
5804 feature_list.InitAndEnableFeature(
5805 features::kPartitionConnectionsByNetworkIsolationKey);
5806
David Benjaminbac8dff2019-08-07 01:30:415807 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5808 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235809 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245810
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:215811 EXPECT_EQ(
5812 OK, pool_->RequestSockets(kGroupId, params_, absl::nullopt, 2,
5813 CompletionOnceCallback(), NetLogWithSource()));
5814
5815 EXPECT_EQ(
5816 OK, pool_->RequestSockets(kGroupIdInPartition, params_, absl::nullopt, 2,
5817 CompletionOnceCallback(), NetLogWithSource()));
Matt Menkebf3c767d2019-04-15 23:28:245818 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235819 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5820 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245821 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235822 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245823
David Benjaminbac8dff2019-08-07 01:30:415824 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245825 EXPECT_EQ(0, pool_->IdleSocketCount());
5826 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235827 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245828}
5829
5830TEST_F(ClientSocketPoolBaseTest,
5831 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5832 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415833 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555834 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415835 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555836 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245837
Tsuyoshi Horo1d8eb53f2022-06-02 07:12:215838 EXPECT_EQ(
5839 OK, pool_->RequestSockets(kOtherGroupId, params_, absl::nullopt, 2,
5840 CompletionOnceCallback(), NetLogWithSource()));
Matt Menkebf3c767d2019-04-15 23:28:245841 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5842 EXPECT_EQ(2, pool_->IdleSocketCount());
5843 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5844
David Benjaminbac8dff2019-08-07 01:30:415845 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245846 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5847 EXPECT_EQ(2, pool_->IdleSocketCount());
5848 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5849}
5850
David Benjaminbac8dff2019-08-07 01:30:415851TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5852 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5853 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245854
5855 ClientSocketHandle handle;
5856 TestCompletionCallback callback;
5857 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525858 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285859 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5860 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5861 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245862 IsOk());
5863 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5864 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5865
David Benjaminbac8dff2019-08-07 01:30:415866 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245867
5868 handle.Reset();
5869 EXPECT_EQ(0, pool_->IdleSocketCount());
5870 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5871}
5872
5873TEST_F(ClientSocketPoolBaseTest,
5874 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5875 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415876 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555877 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415878 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555879 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245880
5881 ClientSocketHandle handle;
5882 TestCompletionCallback callback;
5883 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525884 handle.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285885 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5886 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5887 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245888 IsOk());
5889 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5890 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5891
David Benjaminbac8dff2019-08-07 01:30:415892 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245893
5894 handle.Reset();
5895 EXPECT_EQ(1, pool_->IdleSocketCount());
5896 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5897 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5898}
5899
David Benjaminbac8dff2019-08-07 01:30:415900TEST_P(ClientSocketPoolBaseRefreshTest,
5901 RefreshGroupReplacesBoundConnectJobOnConnect) {
5902 CreatePoolForRefresh(1, 1);
5903 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245904 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5905
5906 TestAuthHelper auth_helper;
5907 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5908 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5909 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5910
5911 auth_helper.WaitForAuth();
5912
5913 // This should update the generation, but not cancel the old ConnectJob - it's
5914 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415915 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245916
5917 // Providing auth credentials and restarting the request with them will cause
5918 // the ConnectJob to complete successfully, but the result will be discarded
5919 // because of the generation mismatch.
5920 auth_helper.RestartWithAuth();
5921
5922 // Despite using ConnectJobs that simulate a single challenge, a second
5923 // challenge will be seen, due to using a new ConnectJob.
5924 auth_helper.WaitForAuth();
5925 auth_helper.RestartWithAuth();
5926
5927 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5928 EXPECT_TRUE(auth_helper.handle()->socket());
5929 EXPECT_EQ(2, auth_helper.auth_count());
5930
5931 // When released, the socket will be returned to the socket pool, and
5932 // available for reuse.
5933 auth_helper.handle()->Reset();
5934 EXPECT_EQ(1, pool_->IdleSocketCount());
5935 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5936 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5937}
5938
David Benjaminbac8dff2019-08-07 01:30:415939TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5940 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5941 kUnusedIdleSocketTimeout,
5942 ClientSocketPool::used_idle_socket_timeout(),
5943 false /* no backup connect jobs */,
Eric Orth5ccc3f02021-09-23 00:01:575944 PacResultElementToProxyServer("HTTPS myproxy:70"));
David Benjaminbac8dff2019-08-07 01:30:415945
5946 const ClientSocketPool::GroupId kGroupId1 =
Eric Ortha2e7773212021-06-22 21:49:555947 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415948 const ClientSocketPool::GroupId kGroupId2 =
Eric Ortha2e7773212021-06-22 21:49:555949 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415950 const ClientSocketPool::GroupId kGroupId3 =
Eric Ortha2e7773212021-06-22 21:49:555951 TestGroupId("c", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415952
5953 // Make three sockets in three different groups. The third socket is released
5954 // to the pool as idle.
5955 ClientSocketHandle handle1, handle2, handle3;
5956 TestCompletionCallback callback;
5957 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525958 handle1.Init(kGroupId1, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415959 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5960 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5961 pool_.get(), NetLogWithSource()),
5962 IsOk());
5963 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525964 handle2.Init(kGroupId2, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415965 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5966 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5967 pool_.get(), NetLogWithSource()),
5968 IsOk());
5969 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525970 handle3.Init(kGroupId3, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415971 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5972 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5973 pool_.get(), NetLogWithSource()),
5974 IsOk());
5975 handle3.Reset();
5976 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5977 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5978 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5979 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5980 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5981 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5982
5983 // Changes to some other proxy do not affect the pool. The idle socket remains
5984 // alive and closing |handle2| makes the socket available for the pool.
5985 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5986
5987 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5988 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5989 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5990 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5991 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5992 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5993
5994 handle2.Reset();
5995 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5996 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5997
5998 // Changes to the matching proxy refreshes all groups.
5999 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
6000
6001 // Idle sockets are closed.
6002 EXPECT_EQ(0, pool_->IdleSocketCount());
6003 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
6004 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
6005
6006 // The active socket, however, continues to be active.
6007 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
6008 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
6009
6010 // Closing it does not make it available for the pool.
6011 handle1.Reset();
6012 EXPECT_EQ(0, pool_->IdleSocketCount());
6013 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
6014}
6015
6016TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
6017 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
6018
Eric Ortha2e7773212021-06-22 21:49:556019 const ClientSocketPool::GroupId kGroupId = TestGroupId(
6020 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_DISABLED);
6021 const ClientSocketPool::GroupId kGroupIdPrivacy = TestGroupId(
6022 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_ENABLED);
David Benjaminbac8dff2019-08-07 01:30:416023 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:556024 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:416025
6026 // Make a socket in each groups.
6027 ClientSocketHandle handle1, handle2, handle3;
6028 TestCompletionCallback callback;
6029 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526030 handle1.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416031 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6032 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6033 pool_.get(), NetLogWithSource()),
6034 IsOk());
6035 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526036 handle2.Init(kGroupIdPrivacy, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416037 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6038 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6039 pool_.get(), NetLogWithSource()),
6040 IsOk());
6041 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:526042 handle3.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:416043 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
6044 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
6045 pool_.get(), NetLogWithSource()),
6046 IsOk());
6047 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
6048 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
6049 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6050 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
6051 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6052 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
6053
6054 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
6055
6056 // Active sockets continue to be active.
6057 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
6058 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
6059 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6060 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
6061 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6062 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
6063
6064 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
6065 // are unusable.
6066 handle1.Reset();
6067 handle2.Reset();
6068 handle3.Reset();
6069 EXPECT_EQ(1, pool_->IdleSocketCount());
6070 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
6071 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6072 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6073 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
6074}
6075
[email protected]f6d1d6eb2009-06-24 20:16:096076} // namespace
6077
6078} // namespace net