blob: ad72beb3116e76792118a2a94a0a30ed7cb6e092 [file] [log] [blame]
[email protected]e34400c32012-01-24 02:49:331// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]f6d1d6eb2009-06-24 20:16:092// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Matt Menke9fa17d52019-03-25 19:12:265#include "net/socket/transport_client_socket_pool.h"
[email protected]f6d1d6eb2009-06-24 20:16:096
tbansalf82cc8e2015-10-14 20:05:497#include <stdint.h>
dchengc7eeda422015-12-26 03:56:488#include <utility>
[email protected]51fdc7c2012-04-10 19:19:489#include <vector>
10
[email protected]6ecf2b92011-12-15 01:14:5211#include "base/bind.h"
[email protected]2041cf342010-02-19 03:15:5912#include "base/callback.h"
danakjdb9ae7942020-11-11 16:01:3513#include "base/callback_helpers.h"
Hans Wennborg0924470b2020-04-27 21:08:0514#include "base/check_op.h"
Lei Zhang305c015e12021-06-04 21:07:0215#include "base/cxx17_backports.h"
skyostil4891b25b2015-06-11 11:43:4516#include "base/location.h"
[email protected]3b63f8f42011-03-28 01:54:1517#include "base/memory/ref_counted.h"
[email protected]6ea7b152011-12-21 21:21:1318#include "base/memory/weak_ptr.h"
Hans Wennborg0924470b2020-04-27 21:08:0519#include "base/notreached.h"
[email protected]034df0f32013-01-07 23:17:4820#include "base/run_loop.h"
[email protected]fc9be5802013-06-11 10:56:5121#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1522#include "base/strings/stringprintf.h"
Patrick Monette643cdf62021-10-15 19:13:4223#include "base/task/single_thread_task_runner.h"
Matt Menke166443c2019-05-24 18:45:5924#include "base/test/scoped_feature_list.h"
[email protected]f214f8792011-01-01 02:17:0825#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3526#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0327#include "base/values.h"
Matt Menke166443c2019-05-24 18:45:5928#include "net/base/features.h"
Eric Ortha2e7773212021-06-22 21:49:5529#include "net/base/host_port_pair.h"
[email protected]034df0f32013-01-07 23:17:4830#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5931#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0632#include "net/base/net_errors.h"
Matt Menke166443c2019-05-24 18:45:5933#include "net/base/network_isolation_key.h"
Matt Menkebdf777802019-04-22 19:38:5934#include "net/base/privacy_mode.h"
Matt Menkeaafff542019-04-22 22:09:3635#include "net/base/proxy_server.h"
Eric Orth5ccc3f02021-09-23 00:01:5736#include "net/base/proxy_string_util.h"
[email protected]ac790b42009-12-02 04:31:3137#include "net/base/request_priority.h"
Matt Menke4807a9a2020-11-21 00:14:4138#include "net/base/schemeful_site.h"
[email protected]f6d1d6eb2009-06-24 20:16:0939#include "net/base/test_completion_callback.h"
dalykedd30d982019-12-16 15:31:1040#include "net/dns/public/resolve_error_info.h"
Ben Schwartz3ff4dc1e62021-04-27 21:15:2341#include "net/dns/public/secure_dns_policy.h"
[email protected]277d5942010-08-11 21:02:3542#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5143#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0744#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0045#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1946#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0047#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5648#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4649#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0950#include "net/socket/client_socket_factory.h"
51#include "net/socket/client_socket_handle.h"
Eric Ortha9b8be02021-06-29 23:09:0852#include "net/socket/connect_job_factory.h"
tfarina5dd13c22016-11-16 12:08:2653#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2854#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5455#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1756#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4457#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1058#include "net/socket/stream_socket.h"
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,
90 NetworkIsolationKey network_isolation_key = NetworkIsolationKey()) {
Eric Ortha2e7773212021-06-22 21:49:5591 return ClientSocketPool::GroupId(url::SchemeHostPort(scheme, host, port),
dalyk5f48a132019-10-14 15:20:1992 privacy_mode, network_isolation_key,
Ben Schwartz3ff4dc1e62021-04-27 21:15:2393 SecureDnsPolicy::kAllow);
Matt Menkec6b3edf72019-03-19 17:00:3994}
95
[email protected]034df0f32013-01-07 23:17:4896// Make sure |handle| sets load times correctly when it has been assigned a
97// reused socket.
98void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
99 LoadTimingInfo load_timing_info;
100 // Only pass true in as |is_reused|, as in general, HttpStream types should
101 // have stricter concepts of reuse than socket pools.
102 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
103
104 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19105 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48106
[email protected]b258e0792013-01-12 07:11:59107 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
108 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48109}
110
111// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33112// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48113// of a connection where |is_reused| is false may consider the connection
114// reused.
115void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
116 EXPECT_FALSE(handle.is_reused());
117
118 LoadTimingInfo load_timing_info;
119 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
120
121 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19122 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48123
[email protected]b258e0792013-01-12 07:11:59124 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
125 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
126 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48127
128 TestLoadTimingInfoConnectedReused(handle);
129}
130
131// Make sure |handle| sets load times correctly, in the case that it does not
132// currently have a socket.
133void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
134 // Should only be set to true once a socket is assigned, if at all.
135 EXPECT_FALSE(handle.is_reused());
136
137 LoadTimingInfo load_timing_info;
138 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
139
140 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19141 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48142
[email protected]b258e0792013-01-12 07:11:59143 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
144 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48145}
146
[email protected]3268023f2011-05-05 00:08:10147class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09148 public:
[email protected]034df0f32013-01-07 23:17:48149 explicit MockClientSocket(net::NetLog* net_log)
150 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28151 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20152 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30153 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09154
Peter Boström407869b2021-10-07 04:42:48155 MockClientSocket(const MockClientSocket&) = delete;
156 MockClientSocket& operator=(const MockClientSocket&) = delete;
157
[email protected]0dc88b32014-03-26 20:12:28158 // Sets whether the socket has unread data. If true, the next call to Read()
159 // will return 1 byte and IsConnectedAndIdle() will return false.
160 void set_has_unread_data(bool has_unread_data) {
161 has_unread_data_ = has_unread_data;
162 }
163
[email protected]3f55aa12011-12-07 02:03:33164 // Socket implementation.
dchengb03027d2014-10-21 12:00:20165 int Read(IOBuffer* /* buf */,
166 int len,
Brad Lassey3a814172018-04-26 03:30:21167 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28168 if (has_unread_data_ && len > 0) {
169 has_unread_data_ = false;
170 was_used_to_convey_data_ = true;
171 return 1;
172 }
[email protected]e86df8dc2013-03-30 13:18:28173 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33174 }
[email protected]ab838892009-06-30 18:49:05175
[email protected]a2b2cfc2017-12-06 09:06:08176 int Write(
177 IOBuffer* /* buf */,
178 int len,
Brad Lassey3a814172018-04-26 03:30:21179 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08180 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01181 was_used_to_convey_data_ = true;
182 return len;
[email protected]ab838892009-06-30 18:49:05183 }
Avi Drissman13fc8932015-12-20 04:40:46184 int SetReceiveBufferSize(int32_t size) override { return OK; }
185 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05186
[email protected]dbf036f2011-12-06 23:33:24187 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21188 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24189 connected_ = true;
190 return OK;
191 }
[email protected]f6d1d6eb2009-06-24 20:16:09192
dchengb03027d2014-10-21 12:00:20193 void Disconnect() override { connected_ = false; }
194 bool IsConnected() const override { return connected_; }
195 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28196 return connected_ && !has_unread_data_;
197 }
[email protected]0b7648c2009-07-06 20:14:01198
dchengb03027d2014-10-21 12:00:20199 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16200 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09201 }
[email protected]f6d1d6eb2009-06-24 20:16:09202
dchengb03027d2014-10-21 12:00:20203 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35204 return ERR_UNEXPECTED;
205 }
206
tfarina428341112016-09-22 13:38:20207 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02208
dchengb03027d2014-10-21 12:00:20209 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37210 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20211 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
212 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03213 void GetConnectionAttempts(ConnectionAttempts* out) const override {
214 out->clear();
215 }
216 void ClearConnectionAttempts() override {}
217 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49218 int64_t GetTotalReceivedBytes() const override {
219 NOTIMPLEMENTED();
220 return 0;
221 }
Paul Jensen0f49dec2017-12-12 23:39:58222 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45223
[email protected]f6d1d6eb2009-06-24 20:16:09224 private:
225 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28226 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20227 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01228 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09229};
230
[email protected]5fc08e32009-07-15 17:09:57231class TestConnectJob;
232
[email protected]f6d1d6eb2009-06-24 20:16:09233class MockClientSocketFactory : public ClientSocketFactory {
234 public:
[email protected]ab838892009-06-30 18:49:05235 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09236
danakj655b66c2016-04-16 00:51:38237 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04238 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41239 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19240 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41241 NOTREACHED();
David Benjamin24725be2019-07-24 20:57:18242 return nullptr;
[email protected]98b0e582011-06-22 14:31:41243 }
244
Helen Lid5bb9222018-04-12 15:33:09245 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07246 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38247 std::unique_ptr<
248 SocketPerformanceWatcher> /* socket_performance_watcher */,
Eric Roman2bc77162020-09-16 18:30:45249 NetworkQualityEstimator* /* network_quality_estimator */,
[email protected]0a0b7682010-08-25 17:08:07250 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19251 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09252 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09253 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09254 }
255
danakj655b66c2016-04-16 00:51:38256 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
David Benjamin24725be2019-07-24 20:57:18257 SSLClientContext* context,
Matt Menke841fc412019-03-05 23:20:12258 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27259 const HostPortPair& host_and_port,
David Benjamin24725be2019-07-24 20:57:18260 const SSLConfig& ssl_config) override {
[email protected]f6d1d6eb2009-06-24 20:16:09261 NOTIMPLEMENTED();
David Benjamin24725be2019-07-24 20:57:18262 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09263 }
Matt Menkefd956922019-02-04 23:44:03264
Matt Menke52cd95a2019-02-08 06:16:27265 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
266 std::unique_ptr<StreamSocket> stream_socket,
267 const std::string& user_agent,
268 const HostPortPair& endpoint,
269 const ProxyServer& proxy_server,
270 HttpAuthController* http_auth_controller,
271 bool tunnel,
272 bool using_spdy,
273 NextProto negotiated_protocol,
274 ProxyDelegate* proxy_delegate,
Matt Menke52cd95a2019-02-08 06:16:27275 const NetworkTrafficAnnotationTag& traffic_annotation) override {
276 NOTIMPLEMENTED();
277 return nullptr;
278 }
279
[email protected]5fc08e32009-07-15 17:09:57280 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55281
[email protected]5fc08e32009-07-15 17:09:57282 void SignalJobs();
283
[email protected]03b7c8c2013-07-20 04:38:55284 void SignalJob(size_t job);
285
286 void SetJobLoadState(size_t job, LoadState load_state);
287
Matt Menke141b87f22019-01-30 02:43:03288 // Sets the HasConnectionEstablished value of the specified job to true,
289 // without invoking the callback.
290 void SetJobHasEstablishedConnection(size_t job);
291
[email protected]f6d1d6eb2009-06-24 20:16:09292 int allocation_count() const { return allocation_count_; }
293
[email protected]f6d1d6eb2009-06-24 20:16:09294 private:
295 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57296 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09297};
298
[email protected]ab838892009-06-30 18:49:05299class TestConnectJob : public ConnectJob {
300 public:
301 enum JobType {
302 kMockJob,
303 kMockFailingJob,
304 kMockPendingJob,
305 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57306 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10307
308 // Certificate errors return a socket in addition to an error code.
309 kMockCertErrorJob,
310 kMockPendingCertErrorJob,
311
[email protected]e60e47a2010-07-14 03:37:18312 kMockAdditionalErrorStateJob,
313 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28314 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10315
316 kMockAuthChallengeOnceJob,
317 kMockAuthChallengeTwiceJob,
318 kMockAuthChallengeOnceFailingJob,
319 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05320 };
321
[email protected]994d4932010-07-12 17:55:13322 // The kMockPendingJob uses a slight delay before allowing the connect
323 // to complete.
324 static const int kPendingConnectDelay = 2;
325
[email protected]ab838892009-06-30 18:49:05326 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40327 RequestPriority request_priority,
328 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34329 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43330 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05331 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43332 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40333 : ConnectJob(request_priority,
334 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38335 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43336 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38337 delegate,
338 nullptr /* net_log */,
339 NetLogSourceType::TRANSPORT_CONNECT_JOB,
340 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58341 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05342 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18343 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03344 has_established_connection_(false),
Jeremy Romand54000b22019-07-08 18:40:16345 store_additional_error_state_(false) {}
[email protected]ab838892009-06-30 18:49:05346
Peter Boström407869b2021-10-07 04:42:48347 TestConnectJob(const TestConnectJob&) = delete;
348 TestConnectJob& operator=(const TestConnectJob&) = delete;
349
[email protected]974ebd62009-08-03 23:14:34350 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13351 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34352 }
353
[email protected]03b7c8c2013-07-20 04:38:55354 void set_load_state(LoadState load_state) { load_state_ = load_state; }
355
Matt Menke141b87f22019-01-30 02:43:03356 void set_has_established_connection() {
357 DCHECK(!has_established_connection_);
358 has_established_connection_ = true;
359 }
360
[email protected]03b7c8c2013-07-20 04:38:55361 // From ConnectJob:
362
dchengb03027d2014-10-21 12:00:20363 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21364
Matt Menke141b87f22019-01-30 02:43:03365 bool HasEstablishedConnection() const override {
366 return has_established_connection_;
367 }
368
dalykedd30d982019-12-16 15:31:10369 ResolveErrorInfo GetResolveErrorInfo() const override {
370 return ResolveErrorInfo(OK);
371 }
372
Matt Menke6f84d1f12019-04-11 19:26:47373 bool IsSSLError() const override { return store_additional_error_state_; }
374
375 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
376 if (store_additional_error_state_)
377 return base::MakeRefCounted<SSLCertRequestInfo>();
378 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18379 }
380
[email protected]974ebd62009-08-03 23:14:34381 private:
[email protected]03b7c8c2013-07-20 04:38:55382 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05383
dchengb03027d2014-10-21 12:00:20384 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05385 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35386 client_socket_factory_->CreateTransportClientSocket(
Eric Roman2bc77162020-09-16 18:30:45387 ignored, nullptr, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05388 switch (job_type_) {
389 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13390 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10391 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05392 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13393 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10394 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05395 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57396 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47397
398 // Depending on execution timings, posting a delayed task can result
399 // in the task getting executed the at the earliest possible
400 // opportunity or only after returning once from the message loop and
401 // then a second call into the message loop. In order to make behavior
402 // more deterministic, we change the default delay to 2ms. This should
403 // always require us to wait for the second call into the message loop.
404 //
405 // N.B. The correct fix for this and similar timing problems is to
406 // abstract time for the purpose of unittests. Unfortunately, we have
407 // a lot of third-party components that directly call the various
408 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45409 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05410 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49411 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
412 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10413 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35414 base::Milliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05415 return ERR_IO_PENDING;
416 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57417 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45418 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05419 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49420 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
421 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10422 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35423 base::Milliseconds(2));
[email protected]ab838892009-06-30 18:49:05424 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57425 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55426 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57427 client_socket_factory_->WaitForSignal(this);
428 waiting_success_ = true;
429 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10430 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13431 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10432 true /* cert_error */);
433 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13434 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45435 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13436 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49437 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
438 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10439 true /* async */, true /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35440 base::Milliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13441 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18442 case kMockAdditionalErrorStateJob:
443 store_additional_error_state_ = true;
444 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10445 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18446 case kMockPendingAdditionalErrorStateJob:
447 set_load_state(LOAD_STATE_CONNECTING);
448 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45449 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18450 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49451 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
452 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10453 true /* async */, false /* cert_error */),
Peter Kastinge5a38ed2021-10-02 03:06:35454 base::Milliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18455 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28456 case kMockUnreadDataJob: {
457 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10458 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28459 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
460 return ret;
461 }
Matt Menkeb57663b32019-03-01 17:17:10462 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01463 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10464 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
465 return ERR_IO_PENDING;
466 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01467 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10468 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
469 return ERR_IO_PENDING;
470 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01471 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10472 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
473 return ERR_IO_PENDING;
474 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01475 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10476 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
477 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05478 default:
479 NOTREACHED();
Anton Bikineev068d2912021-05-15 20:43:52480 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05481 return ERR_FAILED;
482 }
483 }
484
Lily Chen02ef29a2018-11-30 16:31:43485 void ChangePriorityInternal(RequestPriority priority) override {}
486
Matt Menkeb57663b32019-03-01 17:17:10487 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13488 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03489 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05490 if (succeed) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19491 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52492 absl::nullopt);
Bence Békybdbb0e72018-08-07 21:42:59493 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10494 } else if (cert_error) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19495 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52496 absl::nullopt);
Matt Menkeb57663b32019-03-01 17:17:10497 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40498 } else {
[email protected]e772db3f2010-07-12 18:11:13499 result = ERR_CONNECTION_FAILED;
Anton Bikineev068d2912021-05-15 20:43:52500 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05501 }
[email protected]2ab05b52009-07-01 23:57:58502
503 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30504 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05505 return result;
506 }
507
Matt Menkeb57663b32019-03-01 17:17:10508 void DoAdvanceAuthChallenge(int remaining_challenges,
509 bool succeed_after_last_challenge) {
510 base::ThreadTaskRunnerHandle::Get()->PostTask(
511 FROM_HERE,
512 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
513 weak_factory_.GetWeakPtr(), remaining_challenges,
514 succeed_after_last_challenge));
515 }
516
517 void InvokeNextProxyAuthCallback(int remaining_challenges,
518 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01519 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10520 if (remaining_challenges == 0) {
521 DoConnect(succeed_after_last_challenge, true /* was_async */,
522 false /* cert_error */);
523 return;
524 }
525
526 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
527 // The auth tests here are just focused on ConnectJob bookkeeping.
528 HttpResponseInfo info;
529 NotifyDelegateOfProxyAuth(
530 info, nullptr /* http_auth_controller */,
531 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
532 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
533 succeed_after_last_challenge));
534 }
535
[email protected]5fc08e32009-07-15 17:09:57536 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05537 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57538 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21539 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03540 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18541 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05542
Jeremy Romand54000b22019-07-08 18:40:16543 base::WeakPtrFactory<TestConnectJob> weak_factory_{this};
[email protected]ab838892009-06-30 18:49:05544};
545
Eric Ortha9b8be02021-06-29 23:09:08546class TestConnectJobFactory : public ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05547 public:
Eric Ortha9b8be02021-06-29 23:09:08548 explicit TestConnectJobFactory(MockClientSocketFactory* client_socket_factory)
549 : client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05550
Peter Boström293b1342021-09-22 17:31:43551 TestConnectJobFactory(const TestConnectJobFactory&) = delete;
552 TestConnectJobFactory& operator=(const TestConnectJobFactory&) = delete;
553
Chris Watkins7a41d3552017-12-01 02:13:27554 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05555
556 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
557
[email protected]51fdc7c2012-04-10 19:19:48558 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
559 job_types_ = job_types;
560 CHECK(!job_types_->empty());
561 }
562
[email protected]974ebd62009-08-03 23:14:34563 void set_timeout_duration(base::TimeDelta timeout_duration) {
564 timeout_duration_ = timeout_duration;
565 }
566
[email protected]3f55aa12011-12-07 02:03:33567 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55568
Eric Ortha9b8be02021-06-29 23:09:08569 std::unique_ptr<ConnectJob> CreateConnectJob(
Eric Orthc98a3e62021-07-02 17:46:37570 Endpoint endpoint,
Eric Ortha9b8be02021-06-29 23:09:08571 const ProxyServer& proxy_server,
Anton Bikineev068d2912021-05-15 20:43:52572 const absl::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Eric Ortha9b8be02021-06-29 23:09:08573 const SSLConfig* ssl_config_for_origin,
574 const SSLConfig* ssl_config_for_proxy,
575 bool force_tunnel,
576 PrivacyMode privacy_mode,
577 const OnHostResolutionCallback& resolution_callback,
Matt Menke16f5c2e52019-03-25 21:50:40578 RequestPriority request_priority,
579 SocketTag socket_tag,
Eric Ortha9b8be02021-06-29 23:09:08580 const NetworkIsolationKey& network_isolation_key,
581 SecureDnsPolicy secure_dns_policy,
582 const CommonConnectJobParams* common_connect_job_params,
mostynbba063d6032014-10-09 11:01:13583 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48584 EXPECT_TRUE(!job_types_ || !job_types_->empty());
585 TestConnectJob::JobType job_type = job_type_;
586 if (job_types_ && !job_types_->empty()) {
587 job_type = job_types_->front();
588 job_types_->pop_front();
589 }
Matt Menkea6f99ad2019-03-08 02:26:43590 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40591 job_type, request_priority, socket_tag, timeout_duration_,
Eric Ortha9b8be02021-06-29 23:09:08592 common_connect_job_params, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05593 }
594
595 private:
Eric Ortha9b8be02021-06-29 23:09:08596 TestConnectJob::JobType job_type_ = TestConnectJob::kMockJob;
597 std::list<TestConnectJob::JobType>* job_types_ = nullptr;
[email protected]974ebd62009-08-03 23:14:34598 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57599 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05600};
601
[email protected]a937a06d2009-08-19 21:19:24602} // namespace
603
[email protected]a937a06d2009-08-19 21:19:24604namespace {
605
[email protected]5fc08e32009-07-15 17:09:57606void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26607 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57608 (*it)->Signal();
609 }
610 waiting_jobs_.clear();
611}
612
[email protected]03b7c8c2013-07-20 04:38:55613void MockClientSocketFactory::SignalJob(size_t job) {
614 ASSERT_LT(job, waiting_jobs_.size());
615 waiting_jobs_[job]->Signal();
616 waiting_jobs_.erase(waiting_jobs_.begin() + job);
617}
618
619void MockClientSocketFactory::SetJobLoadState(size_t job,
620 LoadState load_state) {
621 ASSERT_LT(job, waiting_jobs_.size());
622 waiting_jobs_[job]->set_load_state(load_state);
623}
624
Matt Menke141b87f22019-01-30 02:43:03625void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
626 ASSERT_LT(job, waiting_jobs_.size());
627 waiting_jobs_[job]->set_has_established_connection();
628}
629
Gabriel Charette694c3c332019-08-19 14:53:05630class ClientSocketPoolBaseTest : public TestWithTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09631 protected:
Alex Clarke0def2092018-12-10 12:01:45632 ClientSocketPoolBaseTest()
Gabriel Charette694c3c332019-08-19 14:53:05633 : TestWithTaskEnvironment(
634 base::test::TaskEnvironment::TimeSource::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03635 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54636 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40637 TransportClientSocketPool::connect_backup_jobs_enabled();
638 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54639 }
[email protected]2431756e2010-09-29 20:26:13640
dcheng67be2b1f2014-10-27 21:47:29641 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40642 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54643 connect_backup_jobs_enabled_);
644 }
[email protected]c9d6a1d2009-07-14 16:15:20645
Matt Menke9fa17d52019-03-25 19:12:26646 void CreatePool(int max_sockets,
647 int max_sockets_per_group,
648 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59649 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
650 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26651 ClientSocketPool::used_idle_socket_timeout(),
652 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16653 }
654
David Benjaminbac8dff2019-08-07 01:30:41655 void CreatePoolWithIdleTimeouts(
656 int max_sockets,
657 int max_sockets_per_group,
658 base::TimeDelta unused_idle_socket_timeout,
659 base::TimeDelta used_idle_socket_timeout,
660 bool enable_backup_connect_jobs = false,
661 ProxyServer proxy_server = ProxyServer::Direct()) {
[email protected]c9d6a1d2009-07-14 16:15:20662 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26663 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
Eric Ortha9b8be02021-06-29 23:09:08664 std::make_unique<TestConnectJobFactory>(&client_socket_factory_);
Matt Menke9fa17d52019-03-25 19:12:26665 connect_job_factory_ = connect_job_factory.get();
666 pool_ = TransportClientSocketPool::CreateForTesting(
667 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
Eric Ortha9b8be02021-06-29 23:09:08668 used_idle_socket_timeout, proxy_server, /*is_for_websockets=*/false,
669 &common_connect_job_params_, std::move(connect_job_factory),
Matt Menke9fa17d52019-03-25 19:12:26670 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20671 }
[email protected]f6d1d6eb2009-06-24 20:16:09672
mmenked3641e12016-01-28 16:06:15673 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39674 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33675 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15676 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39677 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15678 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33679 }
680
Matt Menkec6b3edf72019-03-19 17:00:39681 int StartRequest(const ClientSocketPool::GroupId& group_id,
682 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15683 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39684 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09685 }
686
[email protected]2431756e2010-09-29 20:26:13687 int GetOrderOfRequest(size_t index) const {
688 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09689 }
690
[email protected]2431756e2010-09-29 20:26:13691 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
692 return test_base_.ReleaseOneConnection(keep_alive);
693 }
694
695 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
696 test_base_.ReleaseAllConnections(keep_alive);
697 }
698
Matt Menke433de6d2020-03-04 00:24:11699 // Expects a single NetLogEventType::SOCKET_POOL_CLOSING_SOCKET in |net_log_|.
700 // It should be logged for the provided source and have the indicated reason.
701 void ExpectSocketClosedWithReason(NetLogSource expected_source,
702 const char* expected_reason) {
Matt Reichhoff0049a0b72021-10-20 20:44:26703 auto entries = net_log_observer_.GetEntriesForSourceWithType(
Matt Menke433de6d2020-03-04 00:24:11704 expected_source, NetLogEventType::SOCKET_POOL_CLOSING_SOCKET,
705 NetLogEventPhase::NONE);
706 ASSERT_EQ(1u, entries.size());
707 ASSERT_TRUE(entries[0].HasParams());
708 ASSERT_TRUE(entries[0].params.is_dict());
709 const std::string* reason = entries[0].params.FindStringKey("reason");
710 ASSERT_TRUE(reason);
711 EXPECT_EQ(expected_reason, *reason);
712 }
713
[email protected]2431756e2010-09-29 20:26:13714 TestSocketRequest* request(int i) { return test_base_.request(i); }
715 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38716 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42717 return test_base_.requests();
718 }
rdsmith29dbad12017-02-17 02:22:18719 // Only counts the requests that get sockets asynchronously;
720 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13721 size_t completion_count() const { return test_base_.completion_count(); }
722
Eric Ortha9b8be02021-06-29 23:09:08723 const CommonConnectJobParams common_connect_job_params_{
724 nullptr /* client_socket_factory */,
725 nullptr /* host_resolver */,
726 nullptr /* http_auth_cache */,
727 nullptr /* http_auth_handler_factory */,
728 nullptr /* spdy_session_pool */,
729 nullptr /* quic_supported_versions */,
730 nullptr /* quic_stream_factory */,
731 nullptr /* proxy_delegate */,
732 nullptr /* http_user_agent_settings */,
733 nullptr /* ssl_client_context */,
734 nullptr /* socket_performance_watcher_factory */,
735 nullptr /* network_quality_estimator */,
Matt Reichhoff36a1fd62021-10-12 22:52:20736 NetLog::Get(),
Eric Ortha9b8be02021-06-29 23:09:08737 nullptr /* websocket_endpoint_lock_manager */};
[email protected]636b8252011-04-08 19:56:54738 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09739 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04740 TestConnectJobFactory* connect_job_factory_;
Matt Reichhoff0049a0b72021-10-20 20:44:26741 RecordingNetLogObserver net_log_observer_;
Matt Menke9fa17d52019-03-25 19:12:26742 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19743 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26744 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13745 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09746};
747
[email protected]5fc08e32009-07-15 17:09:57748TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53749 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20750
[email protected]6ecf2b92011-12-15 01:14:52751 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06752 ClientSocketHandle handle;
Matt Reichhoff0049a0b72021-10-20 20:44:26753 NetLogWithSource net_log_with_source =
754 NetLogWithSource::Make(NetLogSourceType::NONE);
755
[email protected]034df0f32013-01-07 23:17:48756 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53757
Matt Menkef09e64c2019-04-23 22:16:28758 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:52759 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28760 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
761 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:26762 pool_.get(), net_log_with_source));
[email protected]f6d1d6eb2009-06-24 20:16:09763 EXPECT_TRUE(handle.is_initialized());
764 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48765 TestLoadTimingInfoConnectedNotReused(handle);
766
[email protected]f6d1d6eb2009-06-24 20:16:09767 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48768 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30769
Matt Reichhoff0049a0b72021-10-20 20:44:26770 auto entries =
771 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:40772
Matt Menke9fa17d52019-03-25 19:12:26773 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53774 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26775 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00776 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26777 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
778 EXPECT_TRUE(LogContainsEvent(
779 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
780 NetLogEventPhase::NONE));
781 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00782 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
783 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26784 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09785}
786
[email protected]ab838892009-06-30 18:49:05787TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53788 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20789
[email protected]ab838892009-06-30 18:49:05790 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Reichhoff0049a0b72021-10-20 20:44:26791 NetLogWithSource net_log_with_source =
792 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]9e743cd2010-03-16 07:03:53793
[email protected]2431756e2010-09-29 20:26:13794 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52795 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18796 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13797 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51798 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50799 EXPECT_EQ(
800 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:52801 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28802 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
803 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:26804 pool_.get(), net_log_with_source));
[email protected]2431756e2010-09-29 20:26:13805 EXPECT_FALSE(handle.socket());
806 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51807 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48808 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30809
Matt Reichhoff0049a0b72021-10-20 20:44:26810 auto entries =
811 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:40812
Matt Menke9fa17d52019-03-25 19:12:26813 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17814 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26815 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00816 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26817 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
818 EXPECT_TRUE(LogContainsEvent(
819 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
820 NetLogEventPhase::NONE));
821 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09822}
823
Matt Menke433de6d2020-03-04 00:24:11824// Test releasing an open socket into the socket pool, telling the socket pool
825// to close the socket.
826TEST_F(ClientSocketPoolBaseTest, ReleaseAndCloseConnection) {
827 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
828
829 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
830 ASSERT_TRUE(request(0)->handle()->socket());
831 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
832 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
833
834 EXPECT_EQ(0, pool_->IdleSocketCount());
835 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
836
837 ExpectSocketClosedWithReason(
838 source, TransportClientSocketPool::kClosedConnectionReturnedToPool);
839}
840
841TEST_F(ClientSocketPoolBaseTest, SocketWithUnreadDataReturnedToPool) {
842 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
843 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
844
845 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
846 ASSERT_TRUE(request(0)->handle()->socket());
847 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
848 EXPECT_TRUE(request(0)->handle()->socket()->IsConnected());
849 EXPECT_FALSE(request(0)->handle()->socket()->IsConnectedAndIdle());
850 ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE);
851
852 EXPECT_EQ(0, pool_->IdleSocketCount());
853 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
854
855 ExpectSocketClosedWithReason(
856 source, TransportClientSocketPool::kDataReceivedUnexpectedly);
857}
858
Matt Menkef6edce752019-03-19 17:21:56859// Make sure different groups do not share sockets.
860TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59861 base::test::ScopedFeatureList feature_list;
862 feature_list.InitAndEnableFeature(
863 features::kPartitionConnectionsByNetworkIsolationKey);
864
Matt Menkef6edce752019-03-19 17:21:56865 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
866
867 const HostPortPair kHostPortPairs[] = {
868 {"a", 80},
869 {"a", 443},
870 {"b", 80},
871 };
872
Eric Ortha2e7773212021-06-22 21:49:55873 const char* const kSchemes[] = {
874 url::kHttpScheme,
875 url::kHttpsScheme,
Matt Menkef6edce752019-03-19 17:21:56876 };
877
Matt Menkebdf777802019-04-22 19:38:59878 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
879 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56880
Matt Menke4807a9a2020-11-21 00:14:41881 const SchemefulSite kSiteA(GURL("http://a.test/"));
882 const SchemefulSite kSiteB(GURL("http://b.test/"));
Matt Menke166443c2019-05-24 18:45:59883 const NetworkIsolationKey kNetworkIsolationKeys[] = {
Matt Menke4807a9a2020-11-21 00:14:41884 NetworkIsolationKey(kSiteA, kSiteA),
885 NetworkIsolationKey(kSiteB, kSiteB),
Matt Menke166443c2019-05-24 18:45:59886 };
887
Ben Schwartz3ff4dc1e62021-04-27 21:15:23888 const SecureDnsPolicy kSecureDnsPolicys[] = {SecureDnsPolicy::kAllow,
889 SecureDnsPolicy::kDisable};
dalyk5f48a132019-10-14 15:20:19890
Matt Menkef6edce752019-03-19 17:21:56891 int total_idle_sockets = 0;
892
893 // Walk through each GroupId, making sure that requesting a socket for one
894 // group does not return a previously connected socket for another group.
895 for (const auto& host_port_pair : kHostPortPairs) {
896 SCOPED_TRACE(host_port_pair.ToString());
Eric Ortha2e7773212021-06-22 21:49:55897 for (const char* scheme : kSchemes) {
898 SCOPED_TRACE(scheme);
Matt Menkef6edce752019-03-19 17:21:56899 for (const auto& privacy_mode : kPrivacyModes) {
900 SCOPED_TRACE(privacy_mode);
Matt Menke166443c2019-05-24 18:45:59901 for (const auto& network_isolation_key : kNetworkIsolationKeys) {
902 SCOPED_TRACE(network_isolation_key.ToString());
Ben Schwartz3ff4dc1e62021-04-27 21:15:23903 for (const auto& secure_dns_policy : kSecureDnsPolicys) {
904 SCOPED_TRACE(static_cast<int>(secure_dns_policy));
Matt Menkef6edce752019-03-19 17:21:56905
dalyk5f48a132019-10-14 15:20:19906 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56907
dalyk5f48a132019-10-14 15:20:19908 ClientSocketPool::GroupId group_id(
Eric Ortha2e7773212021-06-22 21:49:55909 url::SchemeHostPort(scheme, host_port_pair.host(),
910 host_port_pair.port()),
911 privacy_mode, network_isolation_key, secure_dns_policy);
Matt Menkef6edce752019-03-19 17:21:56912
dalyk5f48a132019-10-14 15:20:19913 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56914
dalyk5f48a132019-10-14 15:20:19915 TestCompletionCallback callback;
916 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56917
dalyk5f48a132019-10-14 15:20:19918 // Since the group is empty, requesting a socket should not complete
919 // synchronously.
Anton Bikineev068d2912021-05-15 20:43:52920 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19921 DEFAULT_PRIORITY, SocketTag(),
922 ClientSocketPool::RespectLimits::ENABLED,
923 callback.callback(),
924 ClientSocketPool::ProxyAuthCallback(),
925 pool_.get(), NetLogWithSource()),
926 IsError(ERR_IO_PENDING));
927 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
928 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56929
dalyk5f48a132019-10-14 15:20:19930 EXPECT_THAT(callback.WaitForResult(), IsOk());
931 EXPECT_TRUE(handle.socket());
932 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
933 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56934
dalyk5f48a132019-10-14 15:20:19935 // Return socket to pool.
936 handle.Reset();
937 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56938
dalyk5f48a132019-10-14 15:20:19939 // Requesting a socket again should return the same socket as
940 // before, so should complete synchronously.
Anton Bikineev068d2912021-05-15 20:43:52941 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19942 DEFAULT_PRIORITY, SocketTag(),
943 ClientSocketPool::RespectLimits::ENABLED,
944 callback.callback(),
945 ClientSocketPool::ProxyAuthCallback(),
946 pool_.get(), NetLogWithSource()),
947 IsOk());
948 EXPECT_TRUE(handle.socket());
949 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56950
dalyk5f48a132019-10-14 15:20:19951 // Return socket to pool again.
952 handle.Reset();
953 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56954
dalyk5f48a132019-10-14 15:20:19955 ++total_idle_sockets;
956 }
Matt Menke166443c2019-05-24 18:45:59957 }
Matt Menkef6edce752019-03-19 17:21:56958 }
959 }
960 }
961}
962
[email protected]211d21722009-07-22 15:48:53963TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
964 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
965
[email protected]9e743cd2010-03-16 07:03:53966 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30967
Matt Menkec6b3edf72019-03-19 17:00:39968 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
969 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
970 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
971 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53972
[email protected]2431756e2010-09-29 20:26:13973 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53974 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13975 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53976
Matt Menkec6b3edf72019-03-19 17:00:39977 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
978 IsError(ERR_IO_PENDING));
979 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
980 IsError(ERR_IO_PENDING));
981 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
982 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53983
[email protected]2431756e2010-09-29 20:26:13984 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53985
[email protected]2431756e2010-09-29 20:26:13986 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53987 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13988 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53989
990 EXPECT_EQ(1, GetOrderOfRequest(1));
991 EXPECT_EQ(2, GetOrderOfRequest(2));
992 EXPECT_EQ(3, GetOrderOfRequest(3));
993 EXPECT_EQ(4, GetOrderOfRequest(4));
994 EXPECT_EQ(5, GetOrderOfRequest(5));
995 EXPECT_EQ(6, GetOrderOfRequest(6));
996 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17997
998 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13999 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531000}
1001
1002TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
1003 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1004
[email protected]9e743cd2010-03-16 07:03:531005 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:301006
[email protected]211d21722009-07-22 15:48:531007 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:391008 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1009 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1010 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1011 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531012
[email protected]2431756e2010-09-29 20:26:131013 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531014 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131015 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531016
1017 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:391018 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1019 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531020
[email protected]2431756e2010-09-29 20:26:131021 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531022
[email protected]2431756e2010-09-29 20:26:131023 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531024 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131025 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531026
1027 EXPECT_EQ(1, GetOrderOfRequest(1));
1028 EXPECT_EQ(2, GetOrderOfRequest(2));
1029 EXPECT_EQ(3, GetOrderOfRequest(3));
1030 EXPECT_EQ(4, GetOrderOfRequest(4));
1031 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:171032
1033 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131034 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531035}
1036
1037TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
1038 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1039
Matt Menkec6b3edf72019-03-19 17:00:391040 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
1041 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
1042 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1043 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:531044
[email protected]2431756e2010-09-29 20:26:131045 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531046 client_socket_factory_.allocation_count());
1047
Matt Menkec6b3edf72019-03-19 17:00:391048 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
1049 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1050 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531051
[email protected]2431756e2010-09-29 20:26:131052 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531053
[email protected]2431756e2010-09-29 20:26:131054 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531055
1056 // First 4 requests don't have to wait, and finish in order.
1057 EXPECT_EQ(1, GetOrderOfRequest(1));
1058 EXPECT_EQ(2, GetOrderOfRequest(2));
1059 EXPECT_EQ(3, GetOrderOfRequest(3));
1060 EXPECT_EQ(4, GetOrderOfRequest(4));
1061
Matt Menkec6b3edf72019-03-19 17:00:391062 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1063 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531064 EXPECT_EQ(7, GetOrderOfRequest(5));
1065 EXPECT_EQ(6, GetOrderOfRequest(6));
1066 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171067
1068 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131069 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531070}
1071
rdsmith29dbad12017-02-17 02:22:181072// Test reprioritizing a request before completion doesn't interfere with
1073// its completion.
1074TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1075 CreatePool(kDefaultMaxSockets, 1);
1076
Matt Menkec6b3edf72019-03-19 17:00:391077 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1078 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181079 EXPECT_TRUE(request(0)->handle()->socket());
1080 EXPECT_FALSE(request(1)->handle()->socket());
1081
Lily Chenecebf932018-11-02 17:15:431082 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181083
1084 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1085
1086 EXPECT_TRUE(request(1)->handle()->socket());
1087}
1088
1089// Reprioritize a request up past another one and make sure that changes the
1090// completion order.
1091TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1092 CreatePool(kDefaultMaxSockets, 1);
1093
Matt Menkec6b3edf72019-03-19 17:00:391094 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1095 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1096 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181097 EXPECT_TRUE(request(0)->handle()->socket());
1098 EXPECT_FALSE(request(1)->handle()->socket());
1099 EXPECT_FALSE(request(2)->handle()->socket());
1100
1101 request(2)->handle()->SetPriority(HIGHEST);
1102
1103 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1104
1105 EXPECT_EQ(1, GetOrderOfRequest(1));
1106 EXPECT_EQ(3, GetOrderOfRequest(2));
1107 EXPECT_EQ(2, GetOrderOfRequest(3));
1108}
1109
1110// Reprioritize a request without changing relative priorities and check
1111// that the order doesn't change.
1112TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1113 CreatePool(kDefaultMaxSockets, 1);
1114
Matt Menkec6b3edf72019-03-19 17:00:391115 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1116 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1117 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181118 EXPECT_TRUE(request(0)->handle()->socket());
1119 EXPECT_FALSE(request(1)->handle()->socket());
1120 EXPECT_FALSE(request(2)->handle()->socket());
1121
1122 request(2)->handle()->SetPriority(MEDIUM);
1123
1124 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1125
1126 EXPECT_EQ(1, GetOrderOfRequest(1));
1127 EXPECT_EQ(2, GetOrderOfRequest(2));
1128 EXPECT_EQ(3, GetOrderOfRequest(3));
1129}
1130
1131// Reprioritize a request past down another one and make sure that changes the
1132// completion order.
1133TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1134 CreatePool(kDefaultMaxSockets, 1);
1135
Matt Menkec6b3edf72019-03-19 17:00:391136 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1137 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1138 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181139 EXPECT_TRUE(request(0)->handle()->socket());
1140 EXPECT_FALSE(request(1)->handle()->socket());
1141 EXPECT_FALSE(request(2)->handle()->socket());
1142
1143 request(1)->handle()->SetPriority(LOW);
1144
1145 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1146
1147 EXPECT_EQ(1, GetOrderOfRequest(1));
1148 EXPECT_EQ(3, GetOrderOfRequest(2));
1149 EXPECT_EQ(2, GetOrderOfRequest(3));
1150}
1151
1152// Reprioritize a request to the same level as another and confirm it is
1153// put after the old request.
1154TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1155 CreatePool(kDefaultMaxSockets, 1);
1156
Matt Menkec6b3edf72019-03-19 17:00:391157 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1158 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1159 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181160 EXPECT_TRUE(request(0)->handle()->socket());
1161 EXPECT_FALSE(request(1)->handle()->socket());
1162 EXPECT_FALSE(request(2)->handle()->socket());
1163
1164 request(1)->handle()->SetPriority(MEDIUM);
1165
1166 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1167
1168 EXPECT_EQ(1, GetOrderOfRequest(1));
1169 EXPECT_EQ(3, GetOrderOfRequest(2));
1170 EXPECT_EQ(2, GetOrderOfRequest(3));
1171}
1172
[email protected]211d21722009-07-22 15:48:531173TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1174 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1175
Matt Menkec6b3edf72019-03-19 17:00:391176 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1177 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1178 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1179 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531180
[email protected]2431756e2010-09-29 20:26:131181 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531182 client_socket_factory_.allocation_count());
1183
Matt Menkec6b3edf72019-03-19 17:00:391184 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1185 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1186 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531187
[email protected]2431756e2010-09-29 20:26:131188 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531189
[email protected]2431756e2010-09-29 20:26:131190 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531191 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131192 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531193
1194 // First 4 requests don't have to wait, and finish in order.
1195 EXPECT_EQ(1, GetOrderOfRequest(1));
1196 EXPECT_EQ(2, GetOrderOfRequest(2));
1197 EXPECT_EQ(3, GetOrderOfRequest(3));
1198 EXPECT_EQ(4, GetOrderOfRequest(4));
1199
1200 // Request ("b", 7) has the highest priority, but we can't make new socket for
1201 // group "b", because it has reached the per-group limit. Then we make
1202 // socket for ("c", 6), because it has higher priority than ("a", 4),
1203 // and we still can't make a socket for group "b".
1204 EXPECT_EQ(5, GetOrderOfRequest(5));
1205 EXPECT_EQ(6, GetOrderOfRequest(6));
1206 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171207
1208 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131209 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531210}
1211
1212// Make sure that we count connecting sockets against the total limit.
1213TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1214 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1215
Matt Menkec6b3edf72019-03-19 17:00:391216 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1217 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1218 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531219
1220 // Create one asynchronous request.
1221 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391222 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1223 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531224
[email protected]6b175382009-10-13 06:47:471225 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1226 // actually become pending until 2ms after they have been created. In order
1227 // to flush all tasks, we need to wait so that we know there are no
1228 // soon-to-be-pending tasks waiting.
Peter Kastinge5a38ed2021-10-02 03:06:351229 FastForwardBy(base::Milliseconds(10));
[email protected]6b175382009-10-13 06:47:471230
[email protected]211d21722009-07-22 15:48:531231 // The next synchronous request should wait for its turn.
1232 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391233 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1234 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531235
[email protected]2431756e2010-09-29 20:26:131236 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531237
[email protected]2431756e2010-09-29 20:26:131238 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531239 client_socket_factory_.allocation_count());
1240
1241 EXPECT_EQ(1, GetOrderOfRequest(1));
1242 EXPECT_EQ(2, GetOrderOfRequest(2));
1243 EXPECT_EQ(3, GetOrderOfRequest(3));
1244 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171245 EXPECT_EQ(5, GetOrderOfRequest(5));
1246
1247 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131248 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531249}
1250
[email protected]6427fe22010-04-16 22:27:411251TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1252 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1253 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1254
Matt Menkec6b3edf72019-03-19 17:00:391255 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1256 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1257 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1258 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411259
1260 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1261
1262 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1263
Matt Menkec6b3edf72019-03-19 17:00:391264 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1265 IsError(ERR_IO_PENDING));
1266 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1267 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411268
1269 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1270
[email protected]2431756e2010-09-29 20:26:131271 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411272 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131273 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411274 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131275 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1276 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411277 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1278}
1279
[email protected]d7027bb2010-05-10 18:58:541280TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1281 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1282 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1283
1284 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521285 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501286 EXPECT_EQ(
1287 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521288 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281289 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1290 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1291 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541292
1293 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241294 for (size_t i = 0; i < base::size(handles); ++i) {
Matt Menke28ac03e2019-02-25 22:25:501295 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391296 handles[i].Init(
Anton Bikineev068d2912021-05-15 20:43:521297 TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281298 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1299 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1300 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541301 }
1302
1303 // One will be stalled, cancel all the handles now.
1304 // This should hit the OnAvailableSocketSlot() code where we previously had
1305 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241306 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541307 handles[i].Reset();
1308}
1309
[email protected]eb5a99382010-07-11 03:18:261310TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541311 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1312 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1313
[email protected]eb5a99382010-07-11 03:18:261314 {
1315 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521316 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261317 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Eric Ortha2e7773212021-06-22 21:49:551318 EXPECT_EQ(OK, handles[i].Init(TestGroupId("a" + base::NumberToString(i)),
1319 params_, absl::nullopt, DEFAULT_PRIORITY,
1320 SocketTag(),
1321 ClientSocketPool::RespectLimits::ENABLED,
1322 callbacks[i].callback(),
1323 ClientSocketPool::ProxyAuthCallback(),
1324 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261325 }
1326
1327 // Force a stalled group.
1328 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521329 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201330 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391331 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521332 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281333 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1334 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1335 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261336
1337 // Cancel the stalled request.
1338 stalled_handle.Reset();
1339
1340 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1341 EXPECT_EQ(0, pool_->IdleSocketCount());
1342
1343 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541344 }
1345
[email protected]43a21b82010-06-10 21:30:541346 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1347 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261348}
[email protected]43a21b82010-06-10 21:30:541349
[email protected]eb5a99382010-07-11 03:18:261350TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1351 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1352 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1353
1354 {
1355 ClientSocketHandle handles[kDefaultMaxSockets];
1356 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521357 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201358 EXPECT_EQ(ERR_IO_PENDING,
Eric Ortha2e7773212021-06-22 21:49:551359 handles[i].Init(
1360 TestGroupId("a" + base::NumberToString(i)), params_,
1361 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1362 ClientSocketPool::RespectLimits::ENABLED,
1363 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1364 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261365 }
1366
1367 // Force a stalled group.
1368 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1369 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521370 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201371 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391372 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521373 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281374 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1375 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1376 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261377
1378 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261379 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1380 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1381 TestGroupId("foo")));
1382 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1383 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261384
1385 // Cancel the stalled request.
1386 handles[0].Reset();
1387
[email protected]eb5a99382010-07-11 03:18:261388 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261389 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1390 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1391 TestGroupId("foo")));
1392 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1393 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261394
1395 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011396 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261397
1398 EXPECT_EQ(kDefaultMaxSockets + 1,
1399 client_socket_factory_.allocation_count());
1400 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261401 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1402 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1403 TestGroupId("foo")));
1404 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1405 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261406
1407 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541408 }
1409
[email protected]eb5a99382010-07-11 03:18:261410 EXPECT_EQ(1, pool_->IdleSocketCount());
1411}
[email protected]43a21b82010-06-10 21:30:541412
[email protected]eb5a99382010-07-11 03:18:261413TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1414 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1415 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541416
[email protected]eb5a99382010-07-11 03:18:261417 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521418 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261419 {
[email protected]51fdc7c2012-04-10 19:19:481420 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261421 ClientSocketHandle handles[kDefaultMaxSockets];
1422 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:391423 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281424 OK, handles[i].Init(
Eric Ortha2e7773212021-06-22 21:49:551425 TestGroupId(base::StringPrintf("take-2-%d", i)), params_,
Anton Bikineev068d2912021-05-15 20:43:521426 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:281427 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1428 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1429 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261430 }
1431
1432 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1433 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481434 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261435
1436 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201437 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391438 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521439 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281440 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1441 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1442 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481443 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261444
1445 // Dropping out of scope will close all handles and return them to idle.
1446 }
[email protected]43a21b82010-06-10 21:30:541447
1448 // But if we wait for it, the released idle sockets will be closed in
1449 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011450 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261451
1452 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1453 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541454}
1455
1456// Regression test for http://crbug.com/40952.
1457TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261458 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1459 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541460 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1461
1462 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1463 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521464 TestCompletionCallback callback;
Eric Ortha2e7773212021-06-22 21:49:551465 EXPECT_EQ(
1466 OK,
1467 handle.Init(TestGroupId("a" + base::NumberToString(i)), params_,
1468 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1469 ClientSocketPool::RespectLimits::ENABLED,
1470 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1471 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541472 }
1473
1474 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281475 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541476
1477 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1478 // reuse a socket.
1479 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1480 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521481 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541482
Eric Ortha2e7773212021-06-22 21:49:551483 // "a0" is special here, since it should be the first entry in the sorted map,
[email protected]43a21b82010-06-10 21:30:541484 // which is the one which we would close an idle socket for. We shouldn't
1485 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391486 EXPECT_EQ(OK, handle.Init(
Eric Ortha2e7773212021-06-22 21:49:551487 TestGroupId("a0"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281488 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391489 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1490 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541491
1492 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1493 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1494}
1495
[email protected]ab838892009-06-30 18:49:051496TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531497 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091498
Matt Menkec6b3edf72019-03-19 17:00:391499 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1500 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1501 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1502 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1503 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1504 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1505 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1506 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091507
[email protected]2431756e2010-09-29 20:26:131508 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201509 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1510 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131511 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1512 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091513
[email protected]c9d6a1d2009-07-14 16:15:201514 EXPECT_EQ(1, GetOrderOfRequest(1));
1515 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031516 EXPECT_EQ(8, GetOrderOfRequest(3));
1517 EXPECT_EQ(6, GetOrderOfRequest(4));
1518 EXPECT_EQ(4, GetOrderOfRequest(5));
1519 EXPECT_EQ(3, GetOrderOfRequest(6));
1520 EXPECT_EQ(5, GetOrderOfRequest(7));
1521 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171522
1523 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131524 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091525}
1526
[email protected]ab838892009-06-30 18:49:051527TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531528 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091529
Matt Menkec6b3edf72019-03-19 17:00:391530 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1531 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1532 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1533 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1534 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1535 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1536 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091537
[email protected]2431756e2010-09-29 20:26:131538 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091539
[email protected]2431756e2010-09-29 20:26:131540 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011541 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201542
[email protected]2431756e2010-09-29 20:26:131543 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201544 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131545 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1546 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091547}
1548
Matt Menke7eb405e2019-04-25 20:48:211549TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1550 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1551
1552 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1553 ClientSocketHandle handle;
1554 TestCompletionCallback callback;
1555 EXPECT_EQ(
1556 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521557 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke7eb405e2019-04-25 20:48:211558 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1559 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1560 pool_.get(), NetLogWithSource()));
1561
1562 EXPECT_THAT(callback.WaitForResult(), IsOk());
1563 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1564 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1565 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1566 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1567
1568 handle.ResetAndCloseSocket();
1569 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1570}
1571
Matt Menke99251ea42019-04-25 22:59:021572// This test will start up a socket request and then call Reset() on the handle.
1573// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211574TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531575 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201576
[email protected]ab838892009-06-30 18:49:051577 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131578 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521579 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501580 EXPECT_EQ(
1581 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521582 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281583 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1584 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1585 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131586 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211587 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1588 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1589}
1590
Matt Menke99251ea42019-04-25 22:59:021591// This test will start up a socket request and then call ResetAndCloseSocket()
1592// on the handle. The pending ConnectJob or connected socket should be
1593// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211594TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1595 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1596
Matt Menke99251ea42019-04-25 22:59:021597 // When true, the socket connects before it's canceled.
1598 for (bool cancel_when_callback_pending : {false, true}) {
1599 if (cancel_when_callback_pending) {
1600 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1601 } else {
1602 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1603 }
1604 ClientSocketHandle handle;
1605 TestCompletionCallback callback;
1606 EXPECT_EQ(
1607 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521608 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021609 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1610 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1611 pool_.get(), NetLogWithSource()));
1612 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1613 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1614
1615 if (cancel_when_callback_pending) {
1616 client_socket_factory_.SignalJobs();
1617 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1618 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1619 }
1620
1621 handle.ResetAndCloseSocket();
1622 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1623 }
Matt Menke7eb405e2019-04-25 20:48:211624}
1625
1626TEST_F(ClientSocketPoolBaseTest,
1627 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1628 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1629
Matt Menke99251ea42019-04-25 22:59:021630 // When true, the sockets connect before they're canceled.
1631 for (bool cancel_when_callback_pending : {false, true}) {
1632 if (cancel_when_callback_pending) {
1633 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1634 } else {
1635 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1636 }
Matt Menke7eb405e2019-04-25 20:48:211637
Matt Menke99251ea42019-04-25 22:59:021638 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1639 TestCompletionCallback callback;
1640 // Make |kDefaultMaxSockets + 1| socket requests.
1641 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1642 std::unique_ptr<ClientSocketHandle> handle =
1643 std::make_unique<ClientSocketHandle>();
1644 EXPECT_EQ(ERR_IO_PENDING,
1645 handle->Init(
Anton Bikineev068d2912021-05-15 20:43:521646 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021647 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1648 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1649 pool_.get(), NetLogWithSource()));
1650 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211651 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021652 EXPECT_EQ(
1653 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1654 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1655 }
1656
1657 if (cancel_when_callback_pending) {
1658 client_socket_factory_.SignalJobs();
1659 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1660 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1661 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1662 }
1663
1664 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1665 // or close a socket, since there are more requests than ConnectJobs or
1666 // sockets.
1667 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1668 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1669 if (cancel_when_callback_pending) {
1670 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1671 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1672 } else {
1673 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211674 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1675 }
Matt Menke99251ea42019-04-25 22:59:021676
1677 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1678 // or close a socket.
1679 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1680 handles[i]->ResetAndCloseSocket();
1681 if (i > 0) {
1682 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1683 if (cancel_when_callback_pending) {
1684 EXPECT_EQ(i,
1685 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1686 } else {
1687 EXPECT_EQ(static_cast<size_t>(i),
1688 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1689 }
1690 } else {
1691 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1692 }
1693 }
Matt Menke7eb405e2019-04-25 20:48:211694 }
[email protected]f6d1d6eb2009-06-24 20:16:091695}
1696
[email protected]ab838892009-06-30 18:49:051697TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531698 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201699
[email protected]ab838892009-06-30 18:49:051700 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061701 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521702 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091703
Matt Menke28ac03e2019-02-25 22:25:501704 EXPECT_EQ(
1705 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521706 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281707 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1708 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1709 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091710
1711 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211712 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1713 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091714
Matt Menke7eb405e2019-04-25 20:48:211715 // This will create a second ConnectJob, since the other ConnectJob was
1716 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521717 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501718 EXPECT_EQ(
1719 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521720 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281721 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501722 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1723 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091724
Matt Menke7eb405e2019-04-25 20:48:211725 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1726 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1727
robpercival214763f2016-07-01 23:27:011728 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091729 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211730 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1731 // One ConnectJob completed, and its socket is now assigned to |handle|.
1732 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1733 // The other ConnectJob should have either completed, or still be connecting.
1734 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1735 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091736
1737 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211738 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1739 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1740 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1741 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091742}
1743
[email protected]ab838892009-06-30 18:49:051744TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531745 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091746
Matt Menkec6b3edf72019-03-19 17:00:391747 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1748 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1749 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1750 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1751 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1752 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1753 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091754
1755 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201756 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131757 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1758 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091759
[email protected]2431756e2010-09-29 20:26:131760 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091761
[email protected]c9d6a1d2009-07-14 16:15:201762 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1763 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131764 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1765 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091766
[email protected]c9d6a1d2009-07-14 16:15:201767 EXPECT_EQ(1, GetOrderOfRequest(1));
1768 EXPECT_EQ(2, GetOrderOfRequest(2));
1769 EXPECT_EQ(5, GetOrderOfRequest(3));
1770 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131771 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1772 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201773 EXPECT_EQ(4, GetOrderOfRequest(6));
1774 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171775
1776 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131777 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091778}
1779
mmenke33d24423d2015-05-19 19:41:091780// Function to be used as a callback on socket request completion. It first
1781// disconnects the successfully connected socket from the first request, and
1782// then reuses the ClientSocketHandle to request another socket.
1783//
1784// |nested_callback| is called with the result of the second socket request.
1785void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261786 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091787 TestConnectJobFactory* test_connect_job_factory,
1788 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411789 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091790 int first_request_result) {
robpercival214763f2016-07-01 23:27:011791 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091792
1793 test_connect_job_factory->set_job_type(next_job_type);
1794
1795 // Don't allow reuse of the socket. Disconnect it and then release it.
1796 if (handle->socket())
1797 handle->socket()->Disconnect();
1798 handle->Reset();
1799
mmenke33d24423d2015-05-19 19:41:091800 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501801 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031802 TestGroupId("a"),
Anton Bikineev068d2912021-05-15 20:43:521803 ClientSocketPool::SocketParams::CreateForHttpForTesting(), absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:281804 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031805 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1806 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091807 if (rv != ERR_IO_PENDING) {
1808 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411809 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091810 } else {
1811 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521812 }
mmenke33d24423d2015-05-19 19:41:091813}
[email protected]f6d1d6eb2009-06-24 20:16:091814
mmenke33d24423d2015-05-19 19:41:091815// Tests the case where a second socket is requested in a completion callback,
1816// and the second socket connects asynchronously. Reuses the same
1817// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581818TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531819 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201820
[email protected]0b7648c2009-07-06 20:14:011821 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061822 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091823 TestCompletionCallback second_result_callback;
1824 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521825 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541826 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501827 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1828 connect_job_factory_, TestConnectJob::kMockPendingJob,
1829 &second_result_callback),
1830 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011831 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091832
robpercival214763f2016-07-01 23:27:011833 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581834}
[email protected]f6d1d6eb2009-06-24 20:16:091835
mmenke33d24423d2015-05-19 19:41:091836// Tests the case where a second socket is requested in a completion callback,
1837// and the second socket connects synchronously. Reuses the same
1838// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581839TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531840 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201841
[email protected]0b7648c2009-07-06 20:14:011842 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061843 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091844 TestCompletionCallback second_result_callback;
1845 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521846 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541847 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501848 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1849 connect_job_factory_, TestConnectJob::kMockPendingJob,
1850 &second_result_callback),
1851 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011852 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581853
robpercival214763f2016-07-01 23:27:011854 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091855}
1856
1857// Make sure that pending requests get serviced after active requests get
1858// cancelled.
[email protected]ab838892009-06-30 18:49:051859TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531860 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201861
[email protected]0b7648c2009-07-06 20:14:011862 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091863
Matt Menkec6b3edf72019-03-19 17:00:391864 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1865 IsError(ERR_IO_PENDING));
1866 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1867 IsError(ERR_IO_PENDING));
1868 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1869 IsError(ERR_IO_PENDING));
1870 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1871 IsError(ERR_IO_PENDING));
1872 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1873 IsError(ERR_IO_PENDING));
1874 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1875 IsError(ERR_IO_PENDING));
1876 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1877 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091878
[email protected]c9d6a1d2009-07-14 16:15:201879 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1880 // Let's cancel them.
1881 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131882 ASSERT_FALSE(request(i)->handle()->is_initialized());
1883 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091884 }
1885
[email protected]f6d1d6eb2009-06-24 20:16:091886 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131887 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011888 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131889 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091890 }
1891
[email protected]2431756e2010-09-29 20:26:131892 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1893 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091894}
1895
1896// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051897TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531898 const size_t kMaxSockets = 5;
1899 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201900
[email protected]0b7648c2009-07-06 20:14:011901 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091902
[email protected]211d21722009-07-22 15:48:531903 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1904 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091905
1906 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531907 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391908 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1909 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091910
[email protected]211d21722009-07-22 15:48:531911 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011912 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091913}
1914
mmenke9d72fe42017-05-18 22:36:071915// Make sure that pending requests that complete synchronously get serviced
1916// after active requests fail. See https://crbug.com/723748
1917TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1918 const size_t kNumberOfRequests = 10;
1919 const size_t kMaxSockets = 1;
1920 CreatePool(kMaxSockets, kMaxSockets);
1921
1922 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1923
Matt Menkec6b3edf72019-03-19 17:00:391924 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1925 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071926
1927 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1928
1929 // Queue up all the other requests
1930 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391931 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1932 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071933
1934 // Make sure all requests fail, instead of hanging.
1935 for (size_t i = 0; i < kNumberOfRequests; ++i)
1936 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1937}
1938
[email protected]5fc08e32009-07-15 17:09:571939TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531940 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571941
1942 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1943
[email protected]2431756e2010-09-29 20:26:131944 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521945 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501946 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521947 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501948 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1949 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011950 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571951
1952 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131953 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571954
Anton Bikineev068d2912021-05-15 20:43:521955 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281956 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501957 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1958 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011959 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1960 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571961
[email protected]2431756e2010-09-29 20:26:131962 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481963 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571964 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1965}
1966
xunjieli26619e72016-11-23 19:39:551967TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
Matt Menke433de6d2020-03-04 00:24:111968 const char kReason[] = "Really nifty reason";
1969
xunjieli26619e72016-11-23 19:39:551970 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1971 ClientSocketHandle handle;
1972 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261973 int rv =
1974 handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
1975 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1976 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1977 NetLogWithSource::Make(NetLogSourceType::NONE));
xunjieli26619e72016-11-23 19:39:551978 EXPECT_THAT(rv, IsOk());
Matt Menke433de6d2020-03-04 00:24:111979 ASSERT_TRUE(handle.socket());
1980 NetLogSource source = handle.socket()->NetLog().source();
xunjieli26619e72016-11-23 19:39:551981 handle.Reset();
1982 EXPECT_EQ(1, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111983 pool_->CloseIdleSockets(kReason);
1984 ExpectSocketClosedWithReason(source, kReason);
xunjieli26619e72016-11-23 19:39:551985}
1986
xunjieli92feb332017-03-03 17:19:231987TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231988 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1989 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:261990 NetLogWithSource net_log_with_source =
1991 NetLogWithSource::Make(NetLogSourceType::NONE);
xunjieli92feb332017-03-03 17:19:231992 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501993 int rv = handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:521994 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501995 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:261996 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:231997 EXPECT_THAT(rv, IsOk());
1998 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:521999 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282000 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502001 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262002 pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:232003 ClientSocketHandle handle3;
Anton Bikineev068d2912021-05-15 20:43:522004 rv = handle3.Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282005 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502006 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262007 pool_.get(), net_log_with_source);
xunjieli92feb332017-03-03 17:19:232008 EXPECT_THAT(rv, IsOk());
2009 handle1.Reset();
2010 handle2.Reset();
2011 handle3.Reset();
2012 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:112013 pool_->CloseIdleSocketsInGroup(TestGroupId("a"), "Very good reason");
xunjieli92feb332017-03-03 17:19:232014 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:232015}
2016
xunjieli26619e72016-11-23 19:39:552017TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:552018 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2019 ClientSocketHandle handle;
2020 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262021 NetLogWithSource net_log_with_source =
2022 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502023 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522024 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502025 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262026 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
xunjieli26619e72016-11-23 19:39:552027 EXPECT_THAT(rv, IsOk());
2028 StreamSocket* socket = handle.socket();
Matt Menke433de6d2020-03-04 00:24:112029 ASSERT_TRUE(socket);
xunjieli26619e72016-11-23 19:39:552030 handle.Reset();
2031 EXPECT_EQ(1, pool_->IdleSocketCount());
2032
2033 // Disconnect socket now to make the socket unusable.
Matt Menke433de6d2020-03-04 00:24:112034 NetLogSource source = socket->NetLog().source();
xunjieli26619e72016-11-23 19:39:552035 socket->Disconnect();
2036 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:522037 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282038 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502039 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262040 pool_.get(), net_log_with_source);
xunjieli26619e72016-11-23 19:39:552041 EXPECT_THAT(rv, IsOk());
2042 EXPECT_FALSE(handle2.is_reused());
Matt Menke433de6d2020-03-04 00:24:112043
2044 // This is admittedly not an accurate error in this case, but normally code
2045 // doesn't secretly keep a raw pointers to sockets returned to the socket pool
2046 // and close them out of band, so discovering an idle socket was closed when
2047 // trying to reuse it normally means it was closed by the remote side.
2048 ExpectSocketClosedWithReason(
2049 source, TransportClientSocketPool::kRemoteSideClosedConnection);
xunjieli26619e72016-11-23 19:39:552050}
2051
[email protected]2b7523d2009-07-29 20:29:232052// Regression test for http://crbug.com/17985.
2053TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
2054 const int kMaxSockets = 3;
2055 const int kMaxSocketsPerGroup = 2;
2056 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
2057
[email protected]ac790b42009-12-02 04:31:312058 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:232059
Matt Menkec6b3edf72019-03-19 17:00:392060 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2061 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232062
2063 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:392064 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2065 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232066
2067 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:392068 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232069
2070 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:392071 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2072 IsError(ERR_IO_PENDING));
2073 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2074 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232075
Matt Menkec6b3edf72019-03-19 17:00:392076 // Release the first two sockets from TestGroupId("a"). Because this is a
2077 // keepalive, the first release will unblock the pending request for
2078 // TestGroupId("a"). The second release will unblock a request for "c",
2079 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:132080 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
2081 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:232082
2083 // Closing idle sockets should not get us into trouble, but in the bug
2084 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:392085 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke433de6d2020-03-04 00:24:112086 pool_->CloseIdleSockets("Very good reason");
[email protected]eb5a99382010-07-11 03:18:262087
[email protected]2da659e2013-05-23 20:51:342088 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282089 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232090}
2091
[email protected]4d3b05d2010-01-27 21:27:292092TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532093 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572094
2095 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132096 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522097 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262098 NetLogWithSource net_log_with_source =
2099 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502100 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522101 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502102 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262103 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012104 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392105 EXPECT_EQ(LOAD_STATE_CONNECTING,
2106 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482107 TestLoadTimingInfoNotConnected(handle);
2108
robpercival214763f2016-07-01 23:27:012109 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132110 EXPECT_TRUE(handle.is_initialized());
2111 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482112 TestLoadTimingInfoConnectedNotReused(handle);
2113
[email protected]2431756e2010-09-29 20:26:132114 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482115 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302116
Matt Reichhoff0049a0b72021-10-20 20:44:262117 auto entries =
2118 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:402119
Matt Menke9fa17d52019-03-25 19:12:262120 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172121 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262122 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002123 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262124 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2125 EXPECT_TRUE(LogContainsEvent(
2126 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2127 NetLogEventPhase::NONE));
2128 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002129 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2130 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262131 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572132}
2133
[email protected]4d3b05d2010-01-27 21:27:292134TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572135 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532136 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572137
2138 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132139 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522140 TestCompletionCallback callback;
Matt Reichhoff0049a0b72021-10-20 20:44:262141 NetLogWithSource net_log_with_source =
2142 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]e60e47a2010-07-14 03:37:182143 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132144 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512145 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502146 EXPECT_EQ(
2147 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522148 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282149 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2150 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262151 pool_.get(), net_log_with_source));
Matt Menkec6b3edf72019-03-19 17:00:392152 EXPECT_EQ(LOAD_STATE_CONNECTING,
2153 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012154 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132155 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512156 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302157
Matt Reichhoff0049a0b72021-10-20 20:44:262158 auto entries =
2159 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]b2fcd0e2010-12-01 15:19:402160
Matt Menke9fa17d52019-03-25 19:12:262161 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172162 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262163 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002164 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262165 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2166 EXPECT_TRUE(LogContainsEvent(
2167 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2168 NetLogEventPhase::NONE));
2169 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572170}
2171
mmenke6be122f2015-03-09 22:22:472172// Check that an async ConnectJob failure does not result in creation of a new
2173// ConnectJob when there's another pending request also waiting on its own
2174// ConnectJob. See http://crbug.com/463960.
2175TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2176 CreatePool(2, 2);
2177 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2178
Matt Menkec6b3edf72019-03-19 17:00:392179 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2180 IsError(ERR_IO_PENDING));
2181 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2182 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472183
robpercival214763f2016-07-01 23:27:012184 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2185 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472186
2187 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2188}
2189
[email protected]4d3b05d2010-01-27 21:27:292190TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102191 // TODO(eroman): Add back the log expectations! Removed them because the
2192 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532193 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572194
2195 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132196 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522197 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132198 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522199 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572200
Matt Menke28ac03e2019-02-25 22:25:502201 EXPECT_EQ(
2202 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522203 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282204 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2205 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2206 pool_.get(), NetLogWithSource()));
Matt Reichhoff0049a0b72021-10-20 20:44:262207 RecordingNetLogObserver log2;
tfarina428341112016-09-22 13:38:202208 EXPECT_EQ(
2209 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522210 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282211 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502212 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2213 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572214
[email protected]2431756e2010-09-29 20:26:132215 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572216
[email protected]fd7b7c92009-08-20 19:38:302217
2218 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302219
robpercival214763f2016-07-01 23:27:012220 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132221 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302222
2223 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532224 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572225}
2226
[email protected]4d3b05d2010-01-27 21:27:292227TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342228 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2229
[email protected]17a0c6c2009-08-04 00:07:042230 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2231
Matt Menkec6b3edf72019-03-19 17:00:392232 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2233 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2234 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2235 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342236
Raul Tambre8335a6d2019-02-21 16:57:432237 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262238 static_cast<int>(
2239 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132240 (*requests())[2]->handle()->Reset();
2241 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432242 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262243 static_cast<int>(
2244 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342245
[email protected]2431756e2010-09-29 20:26:132246 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432247 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262248 static_cast<int>(
2249 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342250
[email protected]2431756e2010-09-29 20:26:132251 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432252 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262253 static_cast<int>(
2254 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342255}
2256
[email protected]5fc08e32009-07-15 17:09:572257// When requests and ConnectJobs are not coupled, the request will get serviced
2258// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292259TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532260 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572261
2262 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322263 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572264
[email protected]2431756e2010-09-29 20:26:132265 std::vector<TestSocketRequest*> request_order;
2266 size_t completion_count; // unused
2267 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502268 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522269 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502270 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2271 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012272 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2273 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572274
2275 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2276 // without a job.
2277 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2278
[email protected]2431756e2010-09-29 20:26:132279 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502280 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522281 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502282 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2283 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012284 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132285 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502286 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522287 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502288 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2289 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012290 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572291
2292 // Both Requests 2 and 3 are pending. We release socket 1 which should
2293 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332294 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342295 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282296 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332297 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012298 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332299 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572300
2301 // Signal job 2, which should service request 3.
2302
2303 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012304 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572305
Raul Tambre8335a6d2019-02-21 16:57:432306 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132307 EXPECT_EQ(&req1, request_order[0]);
2308 EXPECT_EQ(&req2, request_order[1]);
2309 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392310 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572311}
2312
2313// The requests are not coupled to the jobs. So, the requests should finish in
2314// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292315TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532316 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572317 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322318 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572319
[email protected]2431756e2010-09-29 20:26:132320 std::vector<TestSocketRequest*> request_order;
2321 size_t completion_count; // unused
2322 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502323 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522324 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502325 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2326 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012327 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572328
[email protected]2431756e2010-09-29 20:26:132329 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502330 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522331 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502332 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2333 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012334 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572335
2336 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322337 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572338
[email protected]2431756e2010-09-29 20:26:132339 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502340 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522341 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502342 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2343 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012344 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572345
robpercival214763f2016-07-01 23:27:012346 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2347 EXPECT_THAT(req2.WaitForResult(), IsOk());
2348 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572349
Raul Tambre8335a6d2019-02-21 16:57:432350 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132351 EXPECT_EQ(&req1, request_order[0]);
2352 EXPECT_EQ(&req2, request_order[1]);
2353 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572354}
2355
[email protected]03b7c8c2013-07-20 04:38:552356// Test GetLoadState in the case there's only one socket request.
2357TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532358 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552359 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572360
[email protected]2431756e2010-09-29 20:26:132361 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522362 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502363 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522364 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502365 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2366 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012367 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552368 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572369
[email protected]03b7c8c2013-07-20 04:38:552370 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2371 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2372
2373 // No point in completing the connection, since ClientSocketHandles only
2374 // expect the LoadState to be checked while connecting.
2375}
2376
2377// Test GetLoadState in the case there are two socket requests.
2378TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2379 CreatePool(2, 2);
2380 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2381
2382 ClientSocketHandle handle;
2383 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502384 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522385 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502386 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2387 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012388 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002389 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2390
2391 ClientSocketHandle handle2;
2392 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522393 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282394 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502395 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2396 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012397 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002398 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2399
Matt Menke4b69f932019-03-04 16:20:012400 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002401 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2402 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2403
Matt Menke4b69f932019-03-04 16:20:012404 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002405 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2406
Matt Menke4b69f932019-03-04 16:20:012407 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002408 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002409 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012410
2411 // Update the state of the second job.
2412 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2413
2414 // Only the state of the second request should have changed.
2415 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2416 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2417
2418 // Second job connects and the first request gets the socket. The
2419 // second handle switches to the state of the remaining ConnectJob.
2420 client_socket_factory_.SignalJob(1);
2421 EXPECT_THAT(callback.WaitForResult(), IsOk());
2422 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552423}
2424
2425// Test GetLoadState in the case the per-group limit is reached.
2426TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2427 CreatePool(2, 1);
2428 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2429
2430 ClientSocketHandle handle;
2431 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502432 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522433 TestGroupId("a"), params_, absl::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502434 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2435 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012436 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552437 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2438
2439 // Request another socket from the same pool, buth with a higher priority.
2440 // The first request should now be stalled at the socket group limit.
2441 ClientSocketHandle handle2;
2442 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522443 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:282444 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502445 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2446 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012447 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552448 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2449 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2450
2451 // The first handle should remain stalled as the other socket goes through
2452 // the connect process.
2453
2454 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2455 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2456 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2457
2458 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012459 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552460 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2461
2462 // Closing the second socket should cause the stalled handle to finally get a
2463 // ConnectJob.
2464 handle2.socket()->Disconnect();
2465 handle2.Reset();
2466 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2467}
2468
2469// Test GetLoadState in the case the per-pool limit is reached.
2470TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2471 CreatePool(2, 2);
2472 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2473
2474 ClientSocketHandle handle;
2475 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502476 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522477 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502478 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2479 ClientSocketPool::ProxyAuthCallback(), 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 // Request for socket from another pool.
2483 ClientSocketHandle handle2;
2484 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522485 rv = handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282486 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502487 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2488 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012489 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552490
2491 // Request another socket from the first pool. Request should stall at the
2492 // socket pool limit.
2493 ClientSocketHandle handle3;
2494 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522495 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282496 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502497 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2498 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012499 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552500
2501 // The third handle should remain stalled as the other sockets in its group
2502 // goes through the connect process.
2503
2504 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2505 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2506
2507 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2508 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2509 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2510
2511 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012512 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552513 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2514
2515 // Closing a socket should allow the stalled handle to finally get a new
2516 // ConnectJob.
2517 handle.socket()->Disconnect();
2518 handle.Reset();
2519 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572520}
2521
Matt Menkeb57663b32019-03-01 17:17:102522TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132523 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102524 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132525
[email protected]2431756e2010-09-29 20:26:132526 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522527 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502528 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102529 ERR_CERT_COMMON_NAME_INVALID,
Anton Bikineev068d2912021-05-15 20:43:522530 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282531 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2532 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2533 pool_.get(), NetLogWithSource()));
[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
Matt Menkeb57663b32019-03-01 17:17:102538TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132539 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2540
Matt Menkeb57663b32019-03-01 17:17:102541 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132542 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522543 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502544 EXPECT_EQ(
2545 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522546 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282547 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2548 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2549 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392550 EXPECT_EQ(LOAD_STATE_CONNECTING,
2551 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102552 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132553 EXPECT_TRUE(handle.is_initialized());
2554 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132555}
2556
[email protected]e60e47a2010-07-14 03:37:182557TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2558 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2559 connect_job_factory_->set_job_type(
2560 TestConnectJob::kMockAdditionalErrorStateJob);
2561
[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_CONNECTION_FAILED,
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()));
[email protected]2431756e2010-09-29 20:26:132570 EXPECT_FALSE(handle.is_initialized());
2571 EXPECT_FALSE(handle.socket());
2572 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512573 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182574}
2575
2576TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2577 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2578
2579 connect_job_factory_->set_job_type(
2580 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132581 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522582 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502583 EXPECT_EQ(
2584 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522585 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282586 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2587 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2588 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392589 EXPECT_EQ(LOAD_STATE_CONNECTING,
2590 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012591 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132592 EXPECT_FALSE(handle.is_initialized());
2593 EXPECT_FALSE(handle.socket());
2594 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512595 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182596}
2597
martijn003cd612016-05-19 22:24:382598// Make sure we can reuse sockets.
2599TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412600 CreatePoolWithIdleTimeouts(
2601 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032602 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352603 base::Days(1)); // Don't time out used sockets.
[email protected]e7b1c6d2c2012-05-05 00:54:032604
2605 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2606
2607 ClientSocketHandle handle;
2608 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502609 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522610 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502611 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2612 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012613 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392614 EXPECT_EQ(LOAD_STATE_CONNECTING,
2615 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012616 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032617
2618 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352619 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382620 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482621 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032622 handle.Reset();
2623
2624 // Should now have one idle socket.
2625 ASSERT_EQ(1, pool_->IdleSocketCount());
2626
2627 // Request a new socket. This should reuse the old socket and complete
2628 // synchronously.
Matt Reichhoff0049a0b72021-10-20 20:44:262629 NetLogWithSource net_log_with_source =
2630 NetLogWithSource::Make(NetLogSourceType::NONE);
Matt Menke28ac03e2019-02-25 22:25:502631 rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522632 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502633 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262634 ClientSocketPool::ProxyAuthCallback(), pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012635 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032636 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482637 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032638
Matt Menke9fa17d52019-03-25 19:12:262639 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392640 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262641 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032642
Matt Reichhoff0049a0b72021-10-20 20:44:262643 auto entries =
2644 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
Matt Menke9fa17d52019-03-25 19:12:262645 EXPECT_TRUE(LogContainsEvent(
2646 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2647 NetLogEventPhase::NONE));
2648 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032649 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262650 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032651}
2652
martijn003cd612016-05-19 22:24:382653// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172654TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032655 CreatePoolWithIdleTimeouts(
2656 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2657 base::TimeDelta(), // Time out unused sockets immediately
2658 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412659
2660 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2661
2662 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2663
2664 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522665 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502666 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522667 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502668 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2669 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012670 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392671 EXPECT_EQ(LOAD_STATE_CONNECTING,
2672 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412673
2674 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522675 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522676 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282677 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502678 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2679 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012680 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392681 EXPECT_EQ(LOAD_STATE_CONNECTING,
2682 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412683
2684 // Cancel one of the requests. Wait for the other, which will get the first
2685 // job. Release the socket. Run the loop again to make sure the second
2686 // socket is sitting idle and the first one is released (since ReleaseSocket()
2687 // just posts a DoReleaseSocket() task).
2688
2689 handle.Reset();
robpercival214763f2016-07-01 23:27:012690 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menke433de6d2020-03-04 00:24:112691 // Get the NetLogSource for the socket, so the time out reason can be checked
2692 // at the end of the test.
2693 NetLogSource net_log_source2 = handle2.socket()->NetLog().source();
[email protected]64770b7d2011-11-16 04:30:412694 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352695 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382696 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412697 handle2.Reset();
2698
[email protected]e7b1c6d2c2012-05-05 00:54:032699 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2700 // actually become pending until 2ms after they have been created. In order
2701 // to flush all tasks, we need to wait so that we know there are no
2702 // soon-to-be-pending tasks waiting.
Peter Kastinge5a38ed2021-10-02 03:06:352703 FastForwardBy(base::Milliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412704
[email protected]e7b1c6d2c2012-05-05 00:54:032705 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412706 ASSERT_EQ(2, pool_->IdleSocketCount());
2707
2708 // Request a new socket. This should cleanup the unused and timed out ones.
2709 // A new socket will be created rather than reusing the idle one.
Matt Reichhoff0049a0b72021-10-20 20:44:262710 NetLogWithSource net_log_with_source =
2711 NetLogWithSource::Make(NetLogSourceType::NONE);
[email protected]6ecf2b92011-12-15 01:14:522712 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522713 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282714 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502715 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
Matt Reichhoff0049a0b72021-10-20 20:44:262716 pool_.get(), net_log_with_source);
robpercival214763f2016-07-01 23:27:012717 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2718 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412719 EXPECT_FALSE(handle.is_reused());
2720
[email protected]e7b1c6d2c2012-05-05 00:54:032721 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262722 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392723 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262724 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412725
Matt Reichhoff0049a0b72021-10-20 20:44:262726 auto entries =
2727 net_log_observer_.GetEntriesForSource(net_log_with_source.source());
[email protected]64770b7d2011-11-16 04:30:412728 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002729 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
Matt Menke433de6d2020-03-04 00:24:112730 ExpectSocketClosedWithReason(
2731 net_log_source2, TransportClientSocketPool::kIdleTimeLimitExpired);
[email protected]64770b7d2011-11-16 04:30:412732}
2733
[email protected]2041cf342010-02-19 03:15:592734// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162735// because of multiple releasing disconnected sockets.
2736TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2737 CreatePoolWithIdleTimeouts(
2738 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2739 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352740 base::Days(1)); // Don't time out used sockets.
[email protected]4f2abec2010-02-03 18:10:162741
2742 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2743
2744 // Startup 4 connect jobs. Two of them will be pending.
2745
[email protected]2431756e2010-09-29 20:26:132746 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522747 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502748 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522749 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502750 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2751 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012752 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162753
[email protected]2431756e2010-09-29 20:26:132754 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522755 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522756 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282757 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502758 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2759 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012760 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162761
[email protected]2431756e2010-09-29 20:26:132762 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522763 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522764 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282765 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502766 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2767 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012768 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162769
[email protected]2431756e2010-09-29 20:26:132770 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522771 TestCompletionCallback callback4;
Anton Bikineev068d2912021-05-15 20:43:522772 rv = handle4.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282773 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502774 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2775 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012776 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162777
2778 // Release two disconnected sockets.
2779
[email protected]2431756e2010-09-29 20:26:132780 handle.socket()->Disconnect();
2781 handle.Reset();
2782 handle2.socket()->Disconnect();
2783 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162784
robpercival214763f2016-07-01 23:27:012785 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132786 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012787 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132788 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162789}
2790
[email protected]d7027bb2010-05-10 18:58:542791// Regression test for http://crbug.com/42267.
2792// When DoReleaseSocket() is processed for one socket, it is blocked because the
2793// other stalled groups all have releasing sockets, so no progress can be made.
2794TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2795 CreatePoolWithIdleTimeouts(
2796 4 /* socket limit */, 4 /* socket limit per group */,
2797 base::TimeDelta(), // Time out unused sockets immediately.
Peter Kastinge5a38ed2021-10-02 03:06:352798 base::Days(1)); // Don't time out used sockets.
[email protected]d7027bb2010-05-10 18:58:542799
2800 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2801
2802 // Max out the socket limit with 2 per group.
2803
[email protected]2431756e2010-09-29 20:26:132804 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522805 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132806 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522807 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542808
2809 for (int i = 0; i < 2; ++i) {
Anton Bikineev068d2912021-05-15 20:43:522810 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282811 LOWEST, SocketTag(),
2812 ClientSocketPool::RespectLimits::ENABLED,
2813 callback_a[i].callback(),
2814 ClientSocketPool::ProxyAuthCallback(),
2815 pool_.get(), NetLogWithSource()));
Anton Bikineev068d2912021-05-15 20:43:522816 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282817 LOWEST, SocketTag(),
2818 ClientSocketPool::RespectLimits::ENABLED,
2819 callback_b[i].callback(),
2820 ClientSocketPool::ProxyAuthCallback(),
2821 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542822 }
[email protected]b89f7e42010-05-20 20:37:002823
[email protected]d7027bb2010-05-10 18:58:542824 // Make 4 pending requests, 2 per group.
2825
2826 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282827 EXPECT_EQ(
2828 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522829 handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282830 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2831 callback_a[i].callback(),
2832 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2833 NetLogWithSource()));
2834 EXPECT_EQ(
2835 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522836 handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282837 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2838 callback_b[i].callback(),
2839 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2840 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542841 }
2842
2843 // Release b's socket first. The order is important, because in
2844 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2845 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2846 // first, which has a releasing socket, so it refuses to start up another
2847 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132848 handle_b[0].socket()->Disconnect();
2849 handle_b[0].Reset();
2850 handle_a[0].socket()->Disconnect();
2851 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542852
2853 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282854 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542855
[email protected]2431756e2010-09-29 20:26:132856 handle_b[1].socket()->Disconnect();
2857 handle_b[1].Reset();
2858 handle_a[1].socket()->Disconnect();
2859 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542860
2861 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012862 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2863 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542864 }
2865}
2866
[email protected]fd4fe0b2010-02-08 23:02:152867TEST_F(ClientSocketPoolBaseTest,
2868 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2869 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2870
2871 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2872
Matt Menkec6b3edf72019-03-19 17:00:392873 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2874 IsError(ERR_IO_PENDING));
2875 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2876 IsError(ERR_IO_PENDING));
2877 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2878 IsError(ERR_IO_PENDING));
2879 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2880 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152881
robpercival214763f2016-07-01 23:27:012882 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2883 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132884 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152885
2886 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132887 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012888 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152889
[email protected]2431756e2010-09-29 20:26:132890 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012891 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132892 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152893
2894 EXPECT_EQ(1, GetOrderOfRequest(1));
2895 EXPECT_EQ(2, GetOrderOfRequest(2));
2896 EXPECT_EQ(3, GetOrderOfRequest(3));
2897 EXPECT_EQ(4, GetOrderOfRequest(4));
2898
2899 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132900 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152901}
2902
[email protected]6ecf2b92011-12-15 01:14:522903class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042904 public:
Matt Menke9fa17d52019-03-25 19:12:262905 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132906 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182907 bool reset_releasing_handle)
2908 : pool_(pool),
2909 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042910 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522911
Chris Watkins7a41d3552017-12-01 02:13:272912 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042913
2914 ClientSocketHandle* handle() { return &handle_; }
2915
Bence Béky8ddc2492018-06-13 01:02:042916 CompletionOnceCallback callback() {
2917 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2918 base::Unretained(this));
2919 }
[email protected]4f1e4982010-03-02 18:31:042920
2921 private:
[email protected]6ecf2b92011-12-15 01:14:522922 void OnComplete(int result) {
2923 SetResult(result);
2924 if (reset_releasing_handle_)
2925 handle_.Reset();
2926
Matt Menkec6b3edf72019-03-19 17:00:392927 EXPECT_EQ(
2928 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032929 handle2_.Init(
2930 TestGroupId("a"),
2931 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:522932 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032933 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2934 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522935 }
2936
Matt Menke9fa17d52019-03-25 19:12:262937 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182938 int expected_result_;
2939 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042940 ClientSocketHandle handle_;
2941 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042942};
2943
[email protected]e60e47a2010-07-14 03:37:182944
2945TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2946 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2947
Matt Menkec6b3edf72019-03-19 17:00:392948 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2949 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2950 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182951
[email protected]2431756e2010-09-29 20:26:132952 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182953 client_socket_factory_.allocation_count());
2954
2955 connect_job_factory_->set_job_type(
2956 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2957 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282958 EXPECT_EQ(ERR_IO_PENDING,
2959 req.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522960 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282961 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2962 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2963 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182964 // The next job should complete synchronously
2965 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2966
robpercival214763f2016-07-01 23:27:012967 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182968 EXPECT_FALSE(req.handle()->is_initialized());
2969 EXPECT_FALSE(req.handle()->socket());
2970 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512971 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182972}
2973
[email protected]b6501d3d2010-06-03 23:53:342974// http://crbug.com/44724 regression test.
2975// We start releasing the pool when we flush on network change. When that
2976// happens, the only active references are in the ClientSocketHandles. When a
2977// ConnectJob completes and calls back into the last ClientSocketHandle, that
2978// callback can release the last reference and delete the pool. After the
2979// callback finishes, we go back to the stack frame within the now-deleted pool.
2980// Executing any code that refers to members of the now-deleted pool can cause
2981// crashes.
2982TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2983 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2984 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
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()));
[email protected]b6501d3d2010-06-03 23:53:342994
Matt Menke433de6d2020-03-04 00:24:112995 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]b6501d3d2010-06-03 23:53:342996
2997 // We'll call back into this now.
2998 callback.WaitForResult();
2999}
3000
[email protected]a7e38572010-06-07 18:22:243001TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
3002 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3003 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3004
3005 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523006 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503007 EXPECT_EQ(
3008 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523009 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283010 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3011 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3012 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013013 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243014 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113015 NetLogSource source = handle.socket()->NetLog().source();
[email protected]a7e38572010-06-07 18:22:243016
Matt Menke433de6d2020-03-04 00:24:113017 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]a7e38572010-06-07 18:22:243018
3019 handle.Reset();
fdoray5eeb7642016-06-22 16:11:283020 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:243021
Matt Menke28ac03e2019-02-25 22:25:503022 EXPECT_EQ(
3023 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523024 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283025 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3026 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3027 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013028 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243029 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113030
3031 ExpectSocketClosedWithReason(
3032 source, TransportClientSocketPool::kSocketGenerationOutOfDate);
[email protected]a7e38572010-06-07 18:22:243033}
3034
[email protected]6ecf2b92011-12-15 01:14:523035class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:143036 public:
Matt Menke9fa17d52019-03-25 19:12:263037 ConnectWithinCallback(
3038 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:193039 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:263040 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:393041 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:143042
Peter Boström293b1342021-09-22 17:31:433043 ConnectWithinCallback(const ConnectWithinCallback&) = delete;
3044 ConnectWithinCallback& operator=(const ConnectWithinCallback&) = delete;
3045
Chris Watkins7a41d3552017-12-01 02:13:273046 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:143047
3048 int WaitForNestedResult() {
3049 return nested_callback_.WaitForResult();
3050 }
3051
Bence Béky8ddc2492018-06-13 01:02:043052 CompletionOnceCallback callback() {
3053 return base::BindOnce(&ConnectWithinCallback::OnComplete,
3054 base::Unretained(this));
3055 }
[email protected]6ecf2b92011-12-15 01:14:523056
[email protected]06f92462010-08-31 19:24:143057 private:
[email protected]6ecf2b92011-12-15 01:14:523058 void OnComplete(int result) {
3059 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:283060 EXPECT_EQ(
3061 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523062 handle_.Init(group_id_, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283063 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3064 nested_callback_.callback(),
3065 ClientSocketPool::ProxyAuthCallback(), pool_,
3066 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:523067 }
3068
Matt Menkec6b3edf72019-03-19 17:00:393069 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:193070 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:263071 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:143072 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:523073 TestCompletionCallback nested_callback_;
[email protected]06f92462010-08-31 19:24:143074};
3075
3076TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
3077 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3078
3079 // First job will be waiting until it gets aborted.
3080 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3081
3082 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:393083 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:503084 EXPECT_EQ(
3085 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523086 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283087 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3088 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3089 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:143090
3091 // Second job will be started during the first callback, and will
3092 // asynchronously complete with OK.
3093 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menke433de6d2020-03-04 00:24:113094 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
robpercival214763f2016-07-01 23:27:013095 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
3096 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:143097}
3098
Matt Menke141b87f22019-01-30 02:43:033099TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:263100 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3101 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033102
3103 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3104 ClientSocketHandle handle;
3105 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503106 EXPECT_EQ(
3107 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523108 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283109 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3110 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3111 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033112 // The backup timer fires but doesn't start a new ConnectJob while resolving
3113 // the hostname.
3114 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
Peter Kastinge5a38ed2021-10-02 03:06:353115 FastForwardBy(
3116 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033117 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3118
3119 // Once the ConnectJob has finished resolving the hostname, the backup timer
3120 // will create a ConnectJob when it fires.
3121 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
Peter Kastinge5a38ed2021-10-02 03:06:353122 FastForwardBy(
3123 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs));
Matt Menke141b87f22019-01-30 02:43:033124 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3125}
3126
3127// Test that no backup socket is created when a ConnectJob connects before it
3128// completes.
3129TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263130 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3131 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033132
3133 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3134 ClientSocketHandle handle;
3135 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503136 EXPECT_EQ(
3137 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523138 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283139 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3140 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3141 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033142 // The backup timer fires but doesn't start a new ConnectJob while resolving
3143 // the hostname.
3144 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
Peter Kastinge5a38ed2021-10-02 03:06:353145 FastForwardBy(
3146 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033147 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3148
3149 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3150 client_socket_factory_.SetJobHasEstablishedConnection(0);
Peter Kastinge5a38ed2021-10-02 03:06:353151 FastForwardBy(
3152 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
Matt Menke141b87f22019-01-30 02:43:033153 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3154}
3155
[email protected]25eea382010-07-10 23:55:263156// Cancel a pending socket request while we're at max sockets,
3157// and verify that the backup socket firing doesn't cause a crash.
3158TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3159 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263160 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3161 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263162
[email protected]4baaf9d2010-08-31 15:15:443163 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3164 // timer.
[email protected]25eea382010-07-10 23:55:263165 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3166 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523167 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503168 EXPECT_EQ(
3169 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523170 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283171 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3172 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3173 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263174
3175 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3176 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3177 ClientSocketHandle handles[kDefaultMaxSockets];
3178 for (int i = 1; i < kDefaultMaxSockets; ++i) {
Anton Bikineev068d2912021-05-15 20:43:523179 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283180 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203181 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503182 callback.callback(),
3183 ClientSocketPool::ProxyAuthCallback(),
3184 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263185 }
3186
fdoray5eeb7642016-06-22 16:11:283187 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263188
3189 // Cancel the pending request.
3190 handle.Reset();
3191
3192 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353193 FastForwardBy(
3194 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263195
[email protected]25eea382010-07-10 23:55:263196 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3197}
3198
[email protected]3f00be82010-09-27 19:50:023199TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263200 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3201 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443202
3203 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3204 // timer.
3205 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3206 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523207 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503208 EXPECT_EQ(
3209 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523210 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283211 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3212 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3213 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263214 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3215 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3216 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3217 TestGroupId("bar")));
3218 EXPECT_EQ(
3219 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443220
3221 // Cancel the socket request. This should cancel the backup timer. Wait for
3222 // the backup time to see if it indeed got canceled.
3223 handle.Reset();
3224 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353225 FastForwardBy(
3226 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263227 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3228 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443229}
3230
[email protected]3f00be82010-09-27 19:50:023231TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263232 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3233 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023234
3235 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3236 // timer.
3237 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3238 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523239 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503240 EXPECT_EQ(
3241 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523242 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283243 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3244 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3245 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023246 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3247 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523248 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203249 EXPECT_EQ(
3250 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523251 handle2.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283252 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503253 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3254 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263255 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3256 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023257
3258 // Cancel request 1 and then complete request 2. With the requests finished,
3259 // the backup timer should be cancelled.
3260 handle.Reset();
robpercival214763f2016-07-01 23:27:013261 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023262 // Wait for the backup timer to fire (add some slop to ensure it fires)
Peter Kastinge5a38ed2021-10-02 03:06:353263 FastForwardBy(
3264 base::Milliseconds(ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023265}
3266
[email protected]eb5a99382010-07-11 03:18:263267// Test delayed socket binding for the case where we have two connects,
3268// and while one is waiting on a connect, the other frees up.
3269// The socket waiting on a connect should switch immediately to the freed
3270// up socket.
3271TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3272 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3273 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3274
3275 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523276 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503277 EXPECT_EQ(
3278 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523279 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283280 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503281 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3282 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013283 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263284
3285 // No idle sockets, no pending jobs.
3286 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263287 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263288
3289 // Create a second socket to the same host, but this one will wait.
3290 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3291 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503292 EXPECT_EQ(
3293 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523294 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283295 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503296 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3297 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263298 // No idle sockets, and one connecting job.
3299 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263300 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263301
3302 // Return the first handle to the pool. This will initiate the delayed
3303 // binding.
3304 handle1.Reset();
3305
fdoray5eeb7642016-06-22 16:11:283306 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263307
3308 // Still no idle sockets, still one pending connect job.
3309 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263310 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263311
3312 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013313 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263314
3315 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263316 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263317
3318 // Finally, signal the waiting Connect.
3319 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263320 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263321
fdoray5eeb7642016-06-22 16:11:283322 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263323}
3324
3325// Test delayed socket binding when a group is at capacity and one
3326// of the group's sockets frees up.
3327TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3328 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3329 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3330
3331 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523332 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503333 EXPECT_EQ(
3334 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523335 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283336 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503337 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3338 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013339 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263340
3341 // No idle sockets, no pending jobs.
3342 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263343 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263344
3345 // Create a second socket to the same host, but this one will wait.
3346 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3347 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503348 EXPECT_EQ(
3349 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523350 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283351 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503352 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3353 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263354 // No idle sockets, and one connecting job.
3355 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263356 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263357
3358 // Return the first handle to the pool. This will initiate the delayed
3359 // binding.
3360 handle1.Reset();
3361
fdoray5eeb7642016-06-22 16:11:283362 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263363
3364 // Still no idle sockets, still one pending connect job.
3365 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263366 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263367
3368 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013369 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263370
3371 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263372 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263373
3374 // Finally, signal the waiting Connect.
3375 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263376 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263377
fdoray5eeb7642016-06-22 16:11:283378 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263379}
3380
3381// Test out the case where we have one socket connected, one
3382// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513383// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263384// should complete, by taking the first socket's idle socket.
3385TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3386 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3387 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3388
3389 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523390 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503391 EXPECT_EQ(
3392 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523393 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283394 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503395 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3396 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013397 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263398
3399 // No idle sockets, no pending jobs.
3400 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263401 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263402
3403 // Create a second socket to the same host, but this one will wait.
3404 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3405 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503406 EXPECT_EQ(
3407 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523408 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283409 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503410 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3411 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263412 // No idle sockets, and one connecting job.
3413 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263414 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263415
3416 // Return the first handle to the pool. This will initiate the delayed
3417 // binding.
3418 handle1.Reset();
3419
fdoray5eeb7642016-06-22 16:11:283420 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263421
3422 // Still no idle sockets, still one pending connect job.
3423 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263424 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263425
3426 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013427 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263428
3429 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263430 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263431
3432 // Finally, signal the waiting Connect.
3433 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263434 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263435
fdoray5eeb7642016-06-22 16:11:283436 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263437}
3438
[email protected]2abfe90a2010-08-25 17:49:513439// Cover the case where on an available socket slot, we have one pending
3440// request that completes synchronously, thereby making the Group empty.
3441TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3442 const int kUnlimitedSockets = 100;
3443 const int kOneSocketPerGroup = 1;
3444 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3445
3446 // Make the first request asynchronous fail.
3447 // This will free up a socket slot later.
3448 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3449
3450 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523451 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203452 EXPECT_EQ(
3453 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523454 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283455 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503456 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3457 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263458 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513459
3460 // Make the second request synchronously fail. This should make the Group
3461 // empty.
3462 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3463 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523464 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513465 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3466 // when created.
tfarina428341112016-09-22 13:38:203467 EXPECT_EQ(
3468 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523469 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283470 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503471 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3472 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513473
Matt Menke9fa17d52019-03-25 19:12:263474 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513475
robpercival214763f2016-07-01 23:27:013476 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3477 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263478 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513479}
3480
[email protected]e1b54dc2010-10-06 21:27:223481TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3482 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3483
3484 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3485
3486 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523487 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203488 EXPECT_EQ(
3489 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523490 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283491 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503492 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3493 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223494
3495 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523496 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203497 EXPECT_EQ(
3498 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523499 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283500 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503501 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3502 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223503 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523504 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203505 EXPECT_EQ(
3506 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523507 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283508 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503509 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3510 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223511
robpercival214763f2016-07-01 23:27:013512 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3513 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3514 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223515
3516 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353517 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383518 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353519 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383520 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223521
3522 handle1.Reset();
3523 handle2.Reset();
3524 handle3.Reset();
3525
Matt Menkec6b3edf72019-03-19 17:00:393526 EXPECT_EQ(OK, handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:523527 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283528 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393529 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3530 pool_.get(), NetLogWithSource()));
3531 EXPECT_EQ(OK, handle2.Init(
Anton Bikineev068d2912021-05-15 20:43:523532 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283533 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393534 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3535 pool_.get(), NetLogWithSource()));
3536 EXPECT_EQ(OK, handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:523537 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283538 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393539 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3540 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223541
3542 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3543 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3544 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3545}
3546
[email protected]2c2bef152010-10-13 00:55:033547TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3548 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3549 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3550
Anton Bikineev068d2912021-05-15 20:43:523551 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283552 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033553
Matt Menke9fa17d52019-03-25 19:12:263554 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3555 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3556 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3557 TestGroupId("a")));
3558 EXPECT_EQ(2u,
3559 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393560 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033561
3562 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523563 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203564 EXPECT_EQ(
3565 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523566 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283567 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503568 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3569 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033570
3571 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523572 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203573 EXPECT_EQ(
3574 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523575 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283576 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503577 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3578 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033579
Matt Menke9fa17d52019-03-25 19:12:263580 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3581 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3582 TestGroupId("a")));
3583 EXPECT_EQ(0u,
3584 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393585 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033586
robpercival214763f2016-07-01 23:27:013587 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3588 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033589 handle1.Reset();
3590 handle2.Reset();
3591
Matt Menke9fa17d52019-03-25 19:12:263592 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3593 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3594 TestGroupId("a")));
3595 EXPECT_EQ(0u,
3596 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393597 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033598}
3599
3600TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3601 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3602 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3603
3604 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523605 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203606 EXPECT_EQ(
3607 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523608 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283609 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503610 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3611 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033612
Matt Menke9fa17d52019-03-25 19:12:263613 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3614 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3615 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3616 TestGroupId("a")));
3617 EXPECT_EQ(0u,
3618 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393619 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033620
Anton Bikineev068d2912021-05-15 20:43:523621 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283622 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033623
Matt Menke9fa17d52019-03-25 19:12:263624 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3625 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3626 TestGroupId("a")));
3627 EXPECT_EQ(1u,
3628 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393629 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033630
3631 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523632 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203633 EXPECT_EQ(
3634 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523635 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283636 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503637 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3638 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033639
Matt Menke9fa17d52019-03-25 19:12:263640 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3641 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3642 TestGroupId("a")));
3643 EXPECT_EQ(0u,
3644 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393645 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033646
robpercival214763f2016-07-01 23:27:013647 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3648 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033649 handle1.Reset();
3650 handle2.Reset();
3651
Matt Menke9fa17d52019-03-25 19:12:263652 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3653 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3654 TestGroupId("a")));
3655 EXPECT_EQ(0u,
3656 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393657 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033658}
3659
3660TEST_F(ClientSocketPoolBaseTest,
3661 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3662 CreatePool(4, 4);
3663 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3664
3665 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523666 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203667 EXPECT_EQ(
3668 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523669 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283670 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503671 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3672 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033673
3674 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523675 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203676 EXPECT_EQ(
3677 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523678 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283679 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503680 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3681 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033682
3683 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523684 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203685 EXPECT_EQ(
3686 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523687 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283688 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503689 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3690 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033691
Matt Menke9fa17d52019-03-25 19:12:263692 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3693 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
Anton Bikineev068d2912021-05-15 20:43:523700 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283701 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033702
Matt Menke9fa17d52019-03-25 19:12:263703 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3704 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3705 TestGroupId("a")));
3706 EXPECT_EQ(0u,
3707 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393708 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033709
robpercival214763f2016-07-01 23:27:013710 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3711 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3712 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033713 handle1.Reset();
3714 handle2.Reset();
3715 handle3.Reset();
3716
Matt Menke9fa17d52019-03-25 19:12:263717 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3718 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3719 TestGroupId("a")));
3720 EXPECT_EQ(0u,
3721 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393722 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033723}
3724
3725TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3726 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3727 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3728
Matt Menke9fa17d52019-03-25 19:12:263729 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033730
Anton Bikineev068d2912021-05-15 20:43:523731 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283732 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033733
Matt Menke9fa17d52019-03-25 19:12:263734 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433735 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393736 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263737 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3738 EXPECT_EQ(
3739 kDefaultMaxSockets,
3740 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3741 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433742 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263743 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3744 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033745
Matt Menke9fa17d52019-03-25 19:12:263746 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033747
Anton Bikineev068d2912021-05-15 20:43:523748 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283749 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033750
Matt Menke9fa17d52019-03-25 19:12:263751 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033752}
3753
3754TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3755 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3756 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3757
Matt Menke9fa17d52019-03-25 19:12:263758 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033759
Anton Bikineev068d2912021-05-15 20:43:523760 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283761 kDefaultMaxSockets - 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033762
Matt Menke9fa17d52019-03-25 19:12:263763 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433764 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393765 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263766 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3767 EXPECT_EQ(
3768 kDefaultMaxSockets - 1,
3769 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3770 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433771 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263772 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3773 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483774 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033775
Matt Menke9fa17d52019-03-25 19:12:263776 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033777
Anton Bikineev068d2912021-05-15 20:43:523778 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283779 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033780
Matt Menke9fa17d52019-03-25 19:12:263781 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3782 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483783 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033784}
3785
3786TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3787 CreatePool(4, 4);
3788 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3789
3790 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523791 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203792 EXPECT_EQ(
3793 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523794 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283795 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503796 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3797 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013798 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033799 handle1.Reset();
3800
Matt Menke9fa17d52019-03-25 19:12:263801 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3802 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3803 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3804 TestGroupId("a")));
3805 EXPECT_EQ(0u,
3806 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393807 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033808
Anton Bikineev068d2912021-05-15 20:43:523809 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283810 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033811
Matt Menke9fa17d52019-03-25 19:12:263812 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3813 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3814 TestGroupId("a")));
3815 EXPECT_EQ(1u,
3816 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393817 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033818}
3819
3820TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3821 CreatePool(4, 4);
3822 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3823
3824 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523825 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203826 EXPECT_EQ(
3827 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523828 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283829 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503830 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3831 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013832 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033833
Matt Menke9fa17d52019-03-25 19:12:263834 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3835 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3836 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3837 TestGroupId("a")));
3838 EXPECT_EQ(0u,
3839 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393840 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263841 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033842
Anton Bikineev068d2912021-05-15 20:43:523843 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283844 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033845
Matt Menke9fa17d52019-03-25 19:12:263846 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3847 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3848 TestGroupId("a")));
3849 EXPECT_EQ(1u,
3850 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393851 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263852 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033853}
3854
3855TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3856 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3857 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3858
Anton Bikineev068d2912021-05-15 20:43:523859 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283860 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033861
Matt Menke9fa17d52019-03-25 19:12:263862 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3863 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3864 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3865 TestGroupId("a")));
3866 EXPECT_EQ(0u,
3867 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433868 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393869 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033870
Anton Bikineev068d2912021-05-15 20:43:523871 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283872 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033873
Matt Menke9fa17d52019-03-25 19:12:263874 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3875 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3876 TestGroupId("b")));
3877 EXPECT_EQ(0u,
3878 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433879 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393880 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033881}
3882
[email protected]3c819f522010-12-02 02:03:123883TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3884 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3885 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3886
Anton Bikineev068d2912021-05-15 20:43:523887 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283888 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123889
Matt Menke9fa17d52019-03-25 19:12:263890 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523891
3892 connect_job_factory_->set_job_type(
3893 TestConnectJob::kMockAdditionalErrorStateJob);
Anton Bikineev068d2912021-05-15 20:43:523894 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283895 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523896
Matt Menke9fa17d52019-03-25 19:12:263897 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123898}
3899
[email protected]8159a1c2012-06-07 00:00:103900TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033901 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433902 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033903
Anton Bikineev068d2912021-05-15 20:43:523904 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283905 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033906
Matt Menke9fa17d52019-03-25 19:12:263907 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3908 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3909 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3910 TestGroupId("a")));
3911 EXPECT_EQ(2u,
3912 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3913 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393914 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033915
Anton Bikineev068d2912021-05-15 20:43:523916 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283917 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263918 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3919 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3920 TestGroupId("a")));
3921 EXPECT_EQ(2u,
3922 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3923 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393924 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033925
3926 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523927 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203928 EXPECT_EQ(
3929 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523930 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283931 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503932 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3933 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433934
3935 client_socket_factory_.SignalJob(0);
3936 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3937
Matt Menke9fa17d52019-03-25 19:12:263938 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3939 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3940 TestGroupId("a")));
3941 EXPECT_EQ(1u,
3942 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3943 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393944 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033945
3946 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523947 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433948 EXPECT_EQ(
3949 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523950 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283951 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503952 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3953 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433954 client_socket_factory_.SignalJob(0);
3955 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033956
Matt Menke9fa17d52019-03-25 19:12:263957 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3958 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3959 TestGroupId("a")));
3960 EXPECT_EQ(0u,
3961 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3962 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393963 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103964
[email protected]2c2bef152010-10-13 00:55:033965 handle1.Reset();
3966 handle2.Reset();
3967
Matt Menke9fa17d52019-03-25 19:12:263968 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3969 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3970 TestGroupId("a")));
3971 EXPECT_EQ(0u,
3972 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3973 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393974 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033975
Anton Bikineev068d2912021-05-15 20:43:523976 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283977 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263978 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3979 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3980 TestGroupId("a")));
3981 EXPECT_EQ(0u,
3982 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3983 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393984 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033985}
3986
3987TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3988 CreatePool(4, 4);
3989 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3990
Anton Bikineev068d2912021-05-15 20:43:523991 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:283992 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033993
Matt Menke9fa17d52019-03-25 19:12:263994 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3995 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3996 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3997 TestGroupId("a")));
3998 EXPECT_EQ(1u,
3999 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394000 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034001
Anton Bikineev068d2912021-05-15 20:43:524002 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:284003 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264004 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4005 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4006 TestGroupId("a")));
4007 EXPECT_EQ(2u,
4008 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394009 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034010
Anton Bikineev068d2912021-05-15 20:43:524011 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 3,
Matt Menkef09e64c2019-04-23 22:16:284012 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264013 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4014 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4015 TestGroupId("a")));
4016 EXPECT_EQ(3u,
4017 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394018 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034019
Anton Bikineev068d2912021-05-15 20:43:524020 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284021 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264022 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4023 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4024 TestGroupId("a")));
4025 EXPECT_EQ(3u,
4026 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394027 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034028}
4029
4030TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
4031 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434032 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:034033
Anton Bikineev068d2912021-05-15 20:43:524034 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284035 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:034036
Matt Menke9fa17d52019-03-25 19:12:264037 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4038 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4039 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4040 TestGroupId("a")));
4041 EXPECT_EQ(1u,
4042 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394043 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034044
4045 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524046 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204047 EXPECT_EQ(
4048 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524049 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284050 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504051 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4052 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034053
Matt Menke9fa17d52019-03-25 19:12:264054 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4055 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4056 TestGroupId("a")));
4057 EXPECT_EQ(0u,
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
Lily Chenecebf932018-11-02 17:15:434061 client_socket_factory_.SignalJobs();
4062 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4063
Matt Menke9fa17d52019-03-25 19:12:264064 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4065 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4066 TestGroupId("a")));
4067 EXPECT_EQ(0u,
4068 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394069 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264070 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034071
[email protected]0dc88b32014-03-26 20:12:284072 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:484073 // starts, it has a connect start time.
4074 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:034075 handle1.Reset();
4076
Matt Menkec6b3edf72019-03-19 17:00:394077 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034078}
4079
[email protected]034df0f32013-01-07 23:17:484080// Checks that fully connected preconnect jobs have no connect times, and are
4081// marked as reused.
4082TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
4083 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4084 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Anton Bikineev068d2912021-05-15 20:43:524085 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284086 NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:484087
Matt Menke9fa17d52019-03-25 19:12:264088 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4089 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4090 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4091 TestGroupId("a")));
4092 EXPECT_EQ(0u,
4093 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394094 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484095
4096 ClientSocketHandle handle;
4097 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394098 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524099 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284100 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394101 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4102 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484103
4104 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394105 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484106
4107 TestLoadTimingInfoConnectedReused(handle);
4108 handle.Reset();
4109 TestLoadTimingInfoNotConnected(handle);
4110}
4111
[email protected]dcbe168a2010-12-02 03:14:464112// http://crbug.com/64940 regression test.
4113TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4114 const int kMaxTotalSockets = 3;
4115 const int kMaxSocketsPerGroup = 2;
4116 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434117 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464118
Matt Menkef6edce752019-03-19 17:21:564119 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464120 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4121
4122 // Set up one idle socket in "a".
4123 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524124 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204125 EXPECT_EQ(
4126 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524127 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284128 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504129 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4130 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264131 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4132 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4133 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4134 TestGroupId("a")));
4135 EXPECT_EQ(0u,
4136 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394137 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464138
Lily Chenecebf932018-11-02 17:15:434139 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014140 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264141 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4142 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4143 TestGroupId("a")));
4144 EXPECT_EQ(0u,
4145 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4146 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434147
[email protected]dcbe168a2010-12-02 03:14:464148 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394149 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464150
4151 // Set up two active sockets in "b".
4152 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524153 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204154 EXPECT_EQ(
4155 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524156 handle1.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284157 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504158 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4159 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204160 EXPECT_EQ(
4161 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524162 handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284163 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504164 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4165 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464166
Matt Menke9fa17d52019-03-25 19:12:264167 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4168 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4169 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4170 TestGroupId("b")));
4171 EXPECT_EQ(0u,
4172 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394173 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434174
4175 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014176 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4177 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394178 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264179 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4180 TestGroupId("b")));
4181 EXPECT_EQ(0u,
4182 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4183 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464184
4185 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4186 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4187 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4188 // sockets for "a", and "b" should still have 2 active sockets.
4189
Anton Bikineev068d2912021-05-15 20:43:524190 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:284191 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264192 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4193 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4194 TestGroupId("a")));
4195 EXPECT_EQ(0u,
4196 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394197 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264198 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4199 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4200 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4201 TestGroupId("b")));
4202 EXPECT_EQ(0u,
4203 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394204 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264205 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464206
4207 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4208 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4209 // "a" should result in closing 1 for "b".
4210 handle1.Reset();
4211 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394212 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264213 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464214
Anton Bikineev068d2912021-05-15 20:43:524215 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:284216 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264217 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4218 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4219 TestGroupId("a")));
4220 EXPECT_EQ(1u,
4221 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394222 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264223 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4224 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4225 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4226 TestGroupId("b")));
4227 EXPECT_EQ(0u,
4228 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394229 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264230 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464231}
4232
[email protected]b7b8be42011-07-12 12:46:414233TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264234 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4235 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074236
4237 // Make the ConnectJob hang until it times out, shorten the timeout.
4238 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Peter Kastinge5a38ed2021-10-02 03:06:354239 connect_job_factory_->set_timeout_duration(base::Milliseconds(500));
Anton Bikineev068d2912021-05-15 20:43:524240 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284241 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264242 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4243 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4244 TestGroupId("a")));
4245 EXPECT_EQ(1u,
4246 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394247 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074248
[email protected]b7b8be42011-07-12 12:46:414249 // Verify the backup timer doesn't create a backup job, by making
4250 // the backup job a pending job instead of a waiting job, so it
4251 // *would* complete if it were created.
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594252 base::RunLoop loop;
[email protected]a9fc8fc2011-05-10 02:41:074253 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454254 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Peter Kastinge5a38ed2021-10-02 03:06:354255 FROM_HERE, loop.QuitClosure(), base::Seconds(1));
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594256 loop.Run();
Matt Menke9fa17d52019-03-25 19:12:264257 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074258}
4259
[email protected]b7b8be42011-07-12 12:46:414260TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264261 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4262 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074263
4264 // Make the ConnectJob hang forever.
4265 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Anton Bikineev068d2912021-05-15 20:43:524266 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284267 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264268 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4269 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4270 TestGroupId("a")));
4271 EXPECT_EQ(1u,
4272 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394273 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284274 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074275
4276 // Make the backup job be a pending job, so it completes normally.
4277 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4278 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524279 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504280 EXPECT_EQ(
4281 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524282 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284283 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4284 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4285 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414286 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264287 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4288 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4289 TestGroupId("a")));
4290 EXPECT_EQ(0u,
4291 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394292 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264293 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014294 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074295
4296 // The hung connect job should still be there, but everything else should be
4297 // complete.
Matt Menke9fa17d52019-03-25 19:12:264298 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4299 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4300 TestGroupId("a")));
4301 EXPECT_EQ(1u,
4302 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394303 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264304 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074305}
4306
[email protected]0dc88b32014-03-26 20:12:284307// Tests that a preconnect that starts out with unread data can still be used.
4308// http://crbug.com/334467
4309TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4310 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4311 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4312
Anton Bikineev068d2912021-05-15 20:43:524313 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284314 NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284315
Matt Menke9fa17d52019-03-25 19:12:264316 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4317 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4318 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4319 TestGroupId("a")));
4320 EXPECT_EQ(0u,
4321 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394322 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284323
4324 // Fail future jobs to be sure that handle receives the preconnected socket
4325 // rather than closing it and making a new one.
4326 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4327 ClientSocketHandle handle;
4328 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394329 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524330 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284331 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394332 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4333 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284334
Matt Menke9fa17d52019-03-25 19:12:264335 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4336 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4337 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4338 TestGroupId("a")));
4339 EXPECT_EQ(0u,
4340 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394341 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264342 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284343
4344 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354345 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284346
4347 TestLoadTimingInfoConnectedReused(handle);
4348 handle.Reset();
4349
4350 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394351 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284352}
4353
Lily Chenecebf932018-11-02 17:15:434354TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4355 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4356 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4357
4358 ClientSocketHandle handle1;
4359 TestCompletionCallback callback1;
4360 EXPECT_EQ(
4361 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524362 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284363 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504364 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4365 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434366
Matt Menke9fa17d52019-03-25 19:12:264367 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4368 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4369 TestGroupId("a")));
4370 EXPECT_EQ(0u,
4371 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394372 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434373
Matt Menkec6b3edf72019-03-19 17:00:394374 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4375 &handle1));
Lily Chenecebf932018-11-02 17:15:434376}
4377
4378TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4379 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4380 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4381
4382 ClientSocketHandle handle1;
4383 TestCompletionCallback callback1;
4384 EXPECT_EQ(
4385 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524386 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284387 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504388 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4389 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434390
Matt Menke9fa17d52019-03-25 19:12:264391 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4392 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4393 TestGroupId("a")));
4394 EXPECT_EQ(0u,
4395 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394396 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434397
4398 ClientSocketHandle handle2;
4399 TestCompletionCallback callback2;
4400 EXPECT_EQ(
4401 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524402 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284403 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504404 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4405 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434406
Matt Menke9fa17d52019-03-25 19:12:264407 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4408 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4409 TestGroupId("a")));
4410 EXPECT_EQ(0u,
4411 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394412 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434413
Matt Menkec6b3edf72019-03-19 17:00:394414 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4415 &handle1));
4416 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4417 &handle2));
Lily Chenecebf932018-11-02 17:15:434418
4419 // One job completes. The other request should still have its job.
4420 client_socket_factory_.SignalJob(0);
4421 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4422
Matt Menke9fa17d52019-03-25 19:12:264423 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4424 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4425 TestGroupId("a")));
4426 EXPECT_EQ(0u,
4427 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4428 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394429 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434430
Matt Menkec6b3edf72019-03-19 17:00:394431 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4432 &handle2));
Lily Chenecebf932018-11-02 17:15:434433}
4434
4435TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4436 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4437 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4438
Anton Bikineev068d2912021-05-15 20:43:524439 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284440 NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434441
Matt Menke9fa17d52019-03-25 19:12:264442 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4443 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4444 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4445 TestGroupId("a")));
4446 EXPECT_EQ(1u,
4447 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394448 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434449
4450 ClientSocketHandle handle1;
4451 TestCompletionCallback callback1;
4452 EXPECT_EQ(
4453 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524454 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284455 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504456 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4457 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434458
Matt Menke9fa17d52019-03-25 19:12:264459 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4460 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4461 TestGroupId("a")));
4462 EXPECT_EQ(0u,
4463 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394464 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434465
Matt Menkec6b3edf72019-03-19 17:00:394466 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4467 &handle1));
Lily Chenecebf932018-11-02 17:15:434468}
4469
4470TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4471 CreatePool(kDefaultMaxSockets, 1);
4472 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4473
4474 ClientSocketHandle handle1;
4475 TestCompletionCallback callback1;
4476 EXPECT_EQ(
4477 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524478 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284479 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504480 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4481 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434482
Matt Menke9fa17d52019-03-25 19:12:264483 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4484 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4485 TestGroupId("a")));
4486 EXPECT_EQ(0u,
4487 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
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 &handle1));
Lily Chenecebf932018-11-02 17:15:434492
4493 // Insert a higher priority request
4494 ClientSocketHandle handle2;
4495 TestCompletionCallback callback2;
4496 EXPECT_EQ(
4497 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524498 handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284499 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504500 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4501 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434502
Matt Menke9fa17d52019-03-25 19:12:264503 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4504 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4505 TestGroupId("a")));
4506 EXPECT_EQ(0u,
4507 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394508 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434509
4510 // The highest priority request should steal the job from the default priority
4511 // request.
Matt Menkec6b3edf72019-03-19 17:00:394512 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4513 &handle2));
4514 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4515 &handle1));
Lily Chenecebf932018-11-02 17:15:434516}
4517
4518TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4519 CreatePool(3, 3);
4520 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4521
4522 ClientSocketHandle handle_lowest;
4523 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284524 EXPECT_EQ(
4525 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524526 handle_lowest.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284527 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4528 callback_lowest.callback(),
4529 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4530 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434531
Matt Menke9fa17d52019-03-25 19:12:264532 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4533 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4534 TestGroupId("a")));
4535 EXPECT_EQ(0u,
4536 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394537 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434538
4539 ClientSocketHandle handle_highest;
4540 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284541 EXPECT_EQ(
4542 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524543 handle_highest.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284544 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4545 callback_highest.callback(),
4546 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4547 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434548
Matt Menke9fa17d52019-03-25 19:12:264549 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4550 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4551 TestGroupId("a")));
4552 EXPECT_EQ(0u,
4553 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394554 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434555
4556 ClientSocketHandle handle_low;
4557 TestCompletionCallback callback_low;
4558 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284559 handle_low.Init(
Anton Bikineev068d2912021-05-15 20:43:524560 TestGroupId("a"), params_, absl::nullopt, LOW, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284561 ClientSocketPool::RespectLimits::ENABLED,
4562 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4563 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434564
Matt Menke9fa17d52019-03-25 19:12:264565 EXPECT_EQ(3u, 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 ClientSocketHandle handle_lowest2;
4573 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284574 EXPECT_EQ(
4575 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524576 handle_lowest2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284577 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4578 callback_lowest2.callback(),
4579 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4580 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434581
Matt Menke9fa17d52019-03-25 19:12:264582 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4583 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4584 TestGroupId("a")));
4585 EXPECT_EQ(0u,
4586 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394587 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434588
4589 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394590 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4591 &handle_highest));
4592 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4593 &handle_low));
4594 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4595 &handle_lowest));
4596 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4597 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434598
4599 // Add another request with medium priority. It should steal the job from the
4600 // lowest priority request with a job.
4601 ClientSocketHandle handle_medium;
4602 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284603 EXPECT_EQ(
4604 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524605 handle_medium.Init(TestGroupId("a"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:284606 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4607 callback_medium.callback(),
4608 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4609 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434610
Matt Menke9fa17d52019-03-25 19:12:264611 EXPECT_EQ(3u, 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")));
4617 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4618 &handle_highest));
4619 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4620 &handle_medium));
4621 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4622 &handle_low));
4623 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4624 &handle_lowest));
4625 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4626 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434627}
4628
4629TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4630 CreatePool(kDefaultMaxSockets, 1);
4631 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4632
4633 ClientSocketHandle handle1;
4634 TestCompletionCallback callback1;
4635 EXPECT_EQ(
4636 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524637 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284638 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504639 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4640 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434641
Matt Menke9fa17d52019-03-25 19:12:264642 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4643 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4644 TestGroupId("a")));
4645 EXPECT_EQ(0u,
4646 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394647 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434648
4649 ClientSocketHandle handle2;
4650 TestCompletionCallback callback2;
4651 EXPECT_EQ(
4652 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524653 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284654 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504655 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4656 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434657
Matt Menke9fa17d52019-03-25 19:12:264658 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4659 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4660 TestGroupId("a")));
4661 EXPECT_EQ(0u,
4662 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394663 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434664
4665 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394666 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4667 &handle1));
4668 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4669 &handle2));
Lily Chenecebf932018-11-02 17:15:434670
4671 // Reprioritizing the second request places it above the first, and it steals
4672 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394673 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4674 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4675 &handle2));
4676 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4677 &handle1));
Lily Chenecebf932018-11-02 17:15:434678}
4679
4680TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4681 CreatePool(kDefaultMaxSockets, 1);
4682 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4683
4684 ClientSocketHandle handle1;
4685 TestCompletionCallback callback1;
4686 EXPECT_EQ(
4687 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524688 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284689 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504690 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4691 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434692
Matt Menke9fa17d52019-03-25 19:12:264693 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4694 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4695 TestGroupId("a")));
4696 EXPECT_EQ(0u,
4697 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394698 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434699
Matt Menkec6b3edf72019-03-19 17:00:394700 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4701 &handle1));
Lily Chenecebf932018-11-02 17:15:434702
4703 ClientSocketHandle handle2;
4704 TestCompletionCallback callback2;
4705 EXPECT_EQ(
4706 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524707 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284708 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504709 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4710 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434711
Matt Menke9fa17d52019-03-25 19:12:264712 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4713 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4714 TestGroupId("a")));
4715 EXPECT_EQ(0u,
4716 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394717 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434718
4719 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394720 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4721 &handle1));
4722 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4723 &handle2));
Lily Chenecebf932018-11-02 17:15:434724
4725 // The second request should get a job upon cancelling the first request.
4726 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264727 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4728 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4729 TestGroupId("a")));
4730 EXPECT_EQ(0u,
4731 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394732 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434733
Matt Menkec6b3edf72019-03-19 17:00:394734 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4735 &handle2));
Lily Chenecebf932018-11-02 17:15:434736}
4737
4738TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4739 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4740 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4741
4742 ClientSocketHandle handle1;
4743 TestCompletionCallback callback1;
4744 EXPECT_EQ(
4745 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524746 handle1.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284747 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504748 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4749 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434750
Matt Menke9fa17d52019-03-25 19:12:264751 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4752 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4753 TestGroupId("a")));
4754 EXPECT_EQ(0u,
4755 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394756 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434757
4758 ClientSocketHandle handle2;
4759 TestCompletionCallback callback2;
4760 EXPECT_EQ(
4761 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524762 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284763 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504764 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4765 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434766
Matt Menke9fa17d52019-03-25 19:12:264767 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4768 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4769 TestGroupId("a")));
4770 EXPECT_EQ(0u,
4771 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394772 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434773
Matt Menkec6b3edf72019-03-19 17:00:394774 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4775 &handle1));
4776 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4777 &handle2));
Lily Chenecebf932018-11-02 17:15:434778
4779 // The lower-priority job completes first. The higher-priority request should
4780 // get the socket, and the lower-priority request should get the remaining
4781 // job.
4782 client_socket_factory_.SignalJob(1);
4783 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264784 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4785 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4786 TestGroupId("a")));
4787 EXPECT_EQ(0u,
4788 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4789 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394790 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434791 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394792 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4793 &handle2));
Lily Chenecebf932018-11-02 17:15:434794}
4795
[email protected]043b68c82013-08-22 23:41:524796class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204797 public:
Matt Menke9fa17d52019-03-25 19:12:264798 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394799 const ClientSocketPool::GroupId& group_id)
4800 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524801 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204802 }
4803
Daniel Cheng4496d0822018-04-26 21:52:154804 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204805
Matt Menke9fa17d52019-03-25 19:12:264806 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504807 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034808 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524809 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284810 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4811 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204812 }
4813
Matt Menke9fa17d52019-03-25 19:12:264814 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504815 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034816 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524817 absl::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504818 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4819 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204820 }
4821
4822 bool ReleaseOneConnection() {
4823 if (!handle_.is_initialized() || !can_release_connection_) {
4824 return false;
4825 }
4826 handle_.socket()->Disconnect();
4827 handle_.Reset();
4828 return true;
4829 }
4830
4831 void set_can_release_connection(bool can_release_connection) {
4832 can_release_connection_ = can_release_connection;
4833 }
4834
4835 MOCK_METHOD0(CloseOneIdleConnection, bool());
4836
4837 private:
Matt Menke9fa17d52019-03-25 19:12:264838 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204839 ClientSocketHandle handle_;
4840 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394841 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204842 bool can_release_connection_;
4843};
4844
[email protected]58e562f2013-04-22 17:32:204845// Tests the basic case of closing an idle socket in a higher layered pool when
4846// a new request is issued and the lower layer pool is stalled.
4847TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4848 CreatePool(1, 1);
4849 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4850
Matt Menkec6b3edf72019-03-19 17:00:394851 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014852 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204853 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4854 .WillOnce(Invoke(&mock_layered_pool,
4855 &MockLayeredPool::ReleaseOneConnection));
4856 ClientSocketHandle handle;
4857 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504858 EXPECT_EQ(
4859 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524860 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284861 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4862 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4863 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014864 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204865}
4866
Matt Menke833678642019-03-05 22:05:514867// Tests the case that trying to close an idle socket in a higher layered pool
4868// fails.
4869TEST_F(ClientSocketPoolBaseTest,
4870 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4871 CreatePool(1, 1);
4872 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4873
Matt Menkec6b3edf72019-03-19 17:00:394874 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514875 mock_layered_pool.set_can_release_connection(false);
4876 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4877 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4878 .WillOnce(Invoke(&mock_layered_pool,
4879 &MockLayeredPool::ReleaseOneConnection));
4880 ClientSocketHandle handle;
4881 TestCompletionCallback callback;
4882 EXPECT_EQ(
4883 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524884 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284885 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4886 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4887 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514888 base::RunLoop().RunUntilIdle();
4889 EXPECT_FALSE(callback.have_result());
4890}
4891
[email protected]58e562f2013-04-22 17:32:204892// Same as above, but the idle socket is in the same group as the stalled
4893// socket, and closes the only other request in its group when closing requests
4894// in higher layered pools. This generally shouldn't happen, but it may be
4895// possible if a higher level pool issues a request and the request is
4896// subsequently cancelled. Even if it's not possible, best not to crash.
4897TEST_F(ClientSocketPoolBaseTest,
4898 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4899 CreatePool(2, 2);
4900 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4901
4902 // Need a socket in another group for the pool to be stalled (If a group
4903 // has the maximum number of connections already, it's not stalled).
4904 ClientSocketHandle handle1;
4905 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524906 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284907 DEFAULT_PRIORITY, SocketTag(),
4908 ClientSocketPool::RespectLimits::ENABLED,
4909 callback1.callback(),
4910 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4911 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204912
Matt Menkec6b3edf72019-03-19 17:00:394913 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
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 callback2;
Matt Menkef09e64c2019-04-23 22:16:284920 EXPECT_EQ(ERR_IO_PENDING,
4921 handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524922 TestGroupId("group2"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284923 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4924 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4925 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014926 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204927}
4928
4929// Tests the case when an idle socket can be closed when a new request is
4930// issued, and the new request belongs to a group that was previously stalled.
4931TEST_F(ClientSocketPoolBaseTest,
4932 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4933 CreatePool(2, 2);
4934 std::list<TestConnectJob::JobType> job_types;
4935 job_types.push_back(TestConnectJob::kMockJob);
4936 job_types.push_back(TestConnectJob::kMockJob);
4937 job_types.push_back(TestConnectJob::kMockJob);
4938 job_types.push_back(TestConnectJob::kMockJob);
4939 connect_job_factory_->set_job_types(&job_types);
4940
4941 ClientSocketHandle handle1;
4942 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524943 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284944 DEFAULT_PRIORITY, SocketTag(),
4945 ClientSocketPool::RespectLimits::ENABLED,
4946 callback1.callback(),
4947 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4948 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204949
Matt Menkec6b3edf72019-03-19 17:00:394950 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014951 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204952 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4953 .WillRepeatedly(Invoke(&mock_layered_pool,
4954 &MockLayeredPool::ReleaseOneConnection));
4955 mock_layered_pool.set_can_release_connection(false);
4956
4957 // The third request is made when the socket pool is in a stalled state.
4958 ClientSocketHandle handle3;
4959 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:284960 EXPECT_EQ(ERR_IO_PENDING,
4961 handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:524962 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284963 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4964 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4965 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204966
4967 base::RunLoop().RunUntilIdle();
4968 EXPECT_FALSE(callback3.have_result());
4969
4970 // The fourth request is made when the pool is no longer stalled. The third
4971 // request should be serviced first, since it was issued first and has the
4972 // same priority.
4973 mock_layered_pool.set_can_release_connection(true);
4974 ClientSocketHandle handle4;
4975 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:284976 EXPECT_EQ(ERR_IO_PENDING,
4977 handle4.Init(
Anton Bikineev068d2912021-05-15 20:43:524978 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284979 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4980 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4981 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014982 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204983 EXPECT_FALSE(callback4.have_result());
4984
4985 // Closing a handle should free up another socket slot.
4986 handle1.Reset();
robpercival214763f2016-07-01 23:27:014987 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204988}
4989
4990// Tests the case when an idle socket can be closed when a new request is
4991// issued, and the new request belongs to a group that was previously stalled.
4992//
4993// The two differences from the above test are that the stalled requests are not
4994// in the same group as the layered pool's request, and the the fourth request
4995// has a higher priority than the third one, so gets a socket first.
4996TEST_F(ClientSocketPoolBaseTest,
4997 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4998 CreatePool(2, 2);
4999 std::list<TestConnectJob::JobType> job_types;
5000 job_types.push_back(TestConnectJob::kMockJob);
5001 job_types.push_back(TestConnectJob::kMockJob);
5002 job_types.push_back(TestConnectJob::kMockJob);
5003 job_types.push_back(TestConnectJob::kMockJob);
5004 connect_job_factory_->set_job_types(&job_types);
5005
5006 ClientSocketHandle handle1;
5007 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:525008 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:285009 DEFAULT_PRIORITY, SocketTag(),
5010 ClientSocketPool::RespectLimits::ENABLED,
5011 callback1.callback(),
5012 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5013 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205014
Matt Menkec6b3edf72019-03-19 17:00:395015 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:015016 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205017 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
5018 .WillRepeatedly(Invoke(&mock_layered_pool,
5019 &MockLayeredPool::ReleaseOneConnection));
5020 mock_layered_pool.set_can_release_connection(false);
5021
5022 // The third request is made when the socket pool is in a stalled state.
5023 ClientSocketHandle handle3;
5024 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:205025 EXPECT_EQ(
5026 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525027 handle3.Init(TestGroupId("group3"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:285028 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505029 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5030 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205031
5032 base::RunLoop().RunUntilIdle();
5033 EXPECT_FALSE(callback3.have_result());
5034
5035 // The fourth request is made when the pool is no longer stalled. This
5036 // request has a higher priority than the third request, so is serviced first.
5037 mock_layered_pool.set_can_release_connection(true);
5038 ClientSocketHandle handle4;
5039 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:205040 EXPECT_EQ(
5041 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525042 handle4.Init(TestGroupId("group3"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:285043 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505044 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5045 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015046 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205047 EXPECT_FALSE(callback3.have_result());
5048
5049 // Closing a handle should free up another socket slot.
5050 handle1.Reset();
robpercival214763f2016-07-01 23:27:015051 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205052}
5053
5054TEST_F(ClientSocketPoolBaseTest,
5055 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
5056 CreatePool(1, 1);
5057 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5058
Matt Menkec6b3edf72019-03-19 17:00:395059 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:015060 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205061 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
5062 .WillRepeatedly(Invoke(&mock_layered_pool1,
5063 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:395064 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:015065 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
5066 IsOk());
[email protected]58e562f2013-04-22 17:32:205067 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
5068 .WillRepeatedly(Invoke(&mock_layered_pool2,
5069 &MockLayeredPool::ReleaseOneConnection));
5070 ClientSocketHandle handle;
5071 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:505072 EXPECT_EQ(
5073 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525074 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285075 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5076 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5077 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015078 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205079}
5080
[email protected]b021ece62013-06-11 11:06:335081// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:155082// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
5083// socket instead of a request with the same priority that was issued earlier,
5084// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:335085TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:335086 CreatePool(1, 1);
5087
5088 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395089 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5090 TestGroupId("a"), MAXIMUM_PRIORITY,
5091 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265092 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335093
5094 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5095
mmenked3641e12016-01-28 16:06:155096 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395097 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155098 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265099 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335100
mmenked3641e12016-01-28 16:06:155101 // Issue a request that ignores the limits, so a new ConnectJob is
5102 // created.
5103 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395104 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155105 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265106 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335107
robpercival214763f2016-07-01 23:27:015108 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335109 EXPECT_FALSE(request(1)->have_result());
5110}
5111
[email protected]c55fabd2013-11-04 23:26:565112// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155113// issued for a request with RespectLimits::DISABLED is not cancelled when a
5114// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565115TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565116 CreatePool(1, 1);
5117
5118 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395119 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5120 TestGroupId("a"), MAXIMUM_PRIORITY,
5121 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265122 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565123
5124 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5125
mmenked3641e12016-01-28 16:06:155126 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395127 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155128 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265129 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565130
mmenked3641e12016-01-28 16:06:155131 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5132 // created.
5133 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395134 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155135 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265136 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335137
mmenked3641e12016-01-28 16:06:155138 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335139 // should not be cancelled.
5140 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265141 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335142
robpercival214763f2016-07-01 23:27:015143 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335144 EXPECT_FALSE(request(1)->have_result());
5145}
5146
Matt Menkeb57663b32019-03-01 17:17:105147TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5148 CreatePool(1, 1);
5149
5150 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5151
5152 ClientSocketHandle handle;
5153 TestCompletionCallback callback;
5154 EXPECT_EQ(
5155 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525156 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285157 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5158 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5159 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105160
Matt Menke9fa17d52019-03-25 19:12:265161 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105162
5163 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5164 EXPECT_FALSE(handle.is_initialized());
5165 EXPECT_FALSE(handle.socket());
5166
5167 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265168 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105169}
5170
5171class TestAuthHelper {
5172 public:
5173 TestAuthHelper() = default;
Peter Boström293b1342021-09-22 17:31:435174
5175 TestAuthHelper(const TestAuthHelper&) = delete;
5176 TestAuthHelper& operator=(const TestAuthHelper&) = delete;
5177
Matt Menkeb57663b32019-03-01 17:17:105178 ~TestAuthHelper() = default;
5179
Matt Menkec6b3edf72019-03-19 17:00:395180 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195181 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265182 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395183 RequestPriority priority = DEFAULT_PRIORITY,
5184 ClientSocketPool::RespectLimits respect_limits =
5185 ClientSocketPool::RespectLimits::ENABLED,
5186 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105187 EXPECT_EQ(ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525188 handle_.Init(group_id_in, params, absl::nullopt, priority,
Matt Menkef09e64c2019-04-23 22:16:285189 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105190 base::BindRepeating(&TestAuthHelper::AuthCallback,
5191 base::Unretained(this)),
5192 pool, NetLogWithSource()));
5193 }
5194
5195 void WaitForAuth() {
5196 run_loop_ = std::make_unique<base::RunLoop>();
5197 run_loop_->Run();
5198 run_loop_.reset();
5199 }
5200
5201 void WaitForAuthAndRestartSync() {
5202 restart_sync_ = true;
5203 WaitForAuth();
5204 restart_sync_ = false;
5205 }
5206
5207 void WaitForAuthAndResetHandleSync() {
5208 reset_handle_sync_ = true;
5209 WaitForAuth();
5210 reset_handle_sync_ = false;
5211 }
5212
5213 void RestartWithAuth() {
5214 DCHECK(restart_with_auth_callback_);
5215 std::move(restart_with_auth_callback_).Run();
5216 }
5217
5218 int WaitForResult() {
5219 int result = callback_.WaitForResult();
5220 // There shouldn't be any callback waiting to be invoked once the request is
5221 // complete.
5222 EXPECT_FALSE(restart_with_auth_callback_);
5223 // The socket should only be initialized on success.
5224 EXPECT_EQ(result == OK, handle_.is_initialized());
5225 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5226 return result;
5227 }
5228
5229 ClientSocketHandle* handle() { return &handle_; }
5230 int auth_count() const { return auth_count_; }
5231 int have_result() const { return callback_.have_result(); }
5232
5233 private:
5234 void AuthCallback(const HttpResponseInfo& response,
5235 HttpAuthController* auth_controller,
5236 base::OnceClosure restart_with_auth_callback) {
5237 EXPECT_FALSE(restart_with_auth_callback_);
5238 EXPECT_TRUE(restart_with_auth_callback);
5239
5240 // Once there's a result, this method shouldn't be invoked again.
5241 EXPECT_FALSE(callback_.have_result());
5242
5243 ++auth_count_;
5244 run_loop_->Quit();
5245 if (restart_sync_) {
5246 std::move(restart_with_auth_callback).Run();
5247 return;
5248 }
5249
5250 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5251
5252 if (reset_handle_sync_) {
5253 handle_.Reset();
5254 return;
5255 }
5256 }
5257
5258 std::unique_ptr<base::RunLoop> run_loop_;
5259 base::OnceClosure restart_with_auth_callback_;
5260
5261 bool restart_sync_ = false;
5262 bool reset_handle_sync_ = false;
5263
5264 ClientSocketHandle handle_;
5265 int auth_count_ = 0;
5266 TestCompletionCallback callback_;
Matt Menkeb57663b32019-03-01 17:17:105267};
5268
5269TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5270 CreatePool(1, 1);
5271 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5272
5273 TestAuthHelper auth_helper;
5274 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265275 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015276 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395277 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105278
5279 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265280 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015281 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395282 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105283
5284 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265285 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015286 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395287 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105288
5289 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5290 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265291 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5292 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395293 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105294 EXPECT_EQ(0, pool_->IdleSocketCount());
5295}
5296
5297TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5298 CreatePool(1, 1);
5299 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5300
5301 TestAuthHelper auth_helper;
5302 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265303 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015304 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395305 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105306
5307 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265308 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015309 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395310 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105311
5312 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5313 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265314 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5315 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395316 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105317 EXPECT_EQ(0, pool_->IdleSocketCount());
5318}
5319
5320TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5321 CreatePool(1, 1);
5322 connect_job_factory_->set_job_type(
5323 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5324
5325 TestAuthHelper auth_helper;
5326 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265327 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105328
5329 auth_helper.WaitForAuth();
5330 auth_helper.RestartWithAuth();
5331 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5332
5333 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265334 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105335 EXPECT_EQ(0, pool_->IdleSocketCount());
5336}
5337
5338TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5339 CreatePool(1, 1);
5340 connect_job_factory_->set_job_type(
5341 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5342
5343 TestAuthHelper auth_helper;
5344 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265345 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105346
5347 auth_helper.WaitForAuthAndRestartSync();
5348 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5349
5350 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265351 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105352 EXPECT_EQ(0, pool_->IdleSocketCount());
5353}
5354
5355TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5356 CreatePool(1, 1);
5357 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5358
5359 TestAuthHelper auth_helper;
5360 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265361 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105362
5363 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265364 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105365
5366 auth_helper.handle()->Reset();
5367
5368 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265369 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105370 EXPECT_EQ(0, pool_->IdleSocketCount());
5371 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5372 EXPECT_FALSE(auth_helper.handle()->socket());
5373}
5374
5375TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5376 CreatePool(1, 1);
5377 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5378
5379 TestAuthHelper auth_helper;
5380 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265381 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105382
5383 auth_helper.WaitForAuthAndResetHandleSync();
5384 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265385 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105386 EXPECT_EQ(0, pool_->IdleSocketCount());
5387 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5388 EXPECT_FALSE(auth_helper.handle()->socket());
5389}
5390
5391TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5392 CreatePool(1, 1);
5393 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5394
5395 TestAuthHelper auth_helper;
5396 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265397 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105398
5399 auth_helper.WaitForAuth();
5400
Matt Menke433de6d2020-03-04 00:24:115401 pool_->FlushWithError(ERR_FAILED, "Network changed");
Matt Menkeb57663b32019-03-01 17:17:105402 base::RunLoop().RunUntilIdle();
5403
5404 // When flushing the socket pool, bound sockets should delay returning the
5405 // error until completion.
5406 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265407 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105408 EXPECT_EQ(0, pool_->IdleSocketCount());
5409
5410 auth_helper.RestartWithAuth();
5411 // The callback should be called asynchronously.
5412 EXPECT_FALSE(auth_helper.have_result());
5413
5414 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265415 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105416 EXPECT_EQ(0, pool_->IdleSocketCount());
5417}
5418
5419TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5420 CreatePool(1, 1);
5421 connect_job_factory_->set_job_type(
5422 TestConnectJob::kMockAuthChallengeTwiceJob);
5423
5424 TestAuthHelper auth_helper;
5425 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265426 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015427 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395428 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105429
5430 auth_helper.WaitForAuth();
5431 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265432 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105433 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015434 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395435 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105436
5437 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265438 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015439 EXPECT_EQ(2, auth_helper.auth_count());
5440 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395441 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015442
Matt Menkeb57663b32019-03-01 17:17:105443 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265444 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105445 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015446 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395447 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105448
5449 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5450 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265451 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5452 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395453 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105454 EXPECT_EQ(0, pool_->IdleSocketCount());
5455}
5456
5457TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5458 CreatePool(1, 1);
5459 connect_job_factory_->set_job_type(
5460 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5461
5462 TestAuthHelper auth_helper;
5463 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265464 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105465
5466 auth_helper.WaitForAuth();
5467 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265468 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105469 EXPECT_EQ(1, auth_helper.auth_count());
5470
5471 auth_helper.WaitForAuth();
5472 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265473 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105474 EXPECT_EQ(2, auth_helper.auth_count());
5475
5476 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5477 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265478 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105479 EXPECT_EQ(0, pool_->IdleSocketCount());
5480}
5481
5482// Makes sure that when a bound request is destroyed, a new ConnectJob is
5483// created, if needed.
5484TEST_F(ClientSocketPoolBaseTest,
5485 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5486 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5487 connect_job_factory_->set_job_type(
5488 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5489
5490 // First request creates a ConnectJob.
5491 TestAuthHelper auth_helper1;
5492 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265493 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105494
5495 // A second request come in, but no new ConnectJob is needed, since the limit
5496 // has been reached.
5497 TestAuthHelper auth_helper2;
5498 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265499 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105500
5501 // Run until the auth callback for the first request is invoked.
5502 auth_helper1.WaitForAuth();
5503 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265504 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5505 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395506 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105507
5508 // Make connect jobs succeed, then cancel the first request, which should
5509 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5510 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5511 auth_helper1.handle()->Reset();
5512 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265513 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105514
5515 // The second ConnectJob should succeed.
5516 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5517 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265518 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105519}
5520
5521// Makes sure that when a bound request is destroyed, a new ConnectJob is
5522// created for another group, if needed.
5523TEST_F(ClientSocketPoolBaseTest,
5524 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5525 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5526 connect_job_factory_->set_job_type(
5527 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5528
5529 // First request creates a ConnectJob.
5530 TestAuthHelper auth_helper1;
5531 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265532 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105533
5534 // A second request come in, but no new ConnectJob is needed, since the limit
5535 // has been reached.
5536 TestAuthHelper auth_helper2;
5537 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395538 ClientSocketPool::RespectLimits::ENABLED,
5539 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265540 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5541 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105542
5543 // Run until the auth callback for the first request is invoked.
5544 auth_helper1.WaitForAuth();
5545 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265546 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5547 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395548 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265549 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5550 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395551 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105552
5553 // Make connect jobs succeed, then cancel the first request, which should
5554 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5555 // other group.
5556 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5557 auth_helper1.handle()->Reset();
5558 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265559 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5560 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105561
5562 // The second ConnectJob should succeed.
5563 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5564 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265565 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5566 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105567}
5568
5569// Test that once an auth challenge is bound, that's the request that gets all
5570// subsequent calls and the socket itself.
5571TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5572 CreatePool(1, 1);
5573 connect_job_factory_->set_job_type(
5574 TestConnectJob::kMockAuthChallengeTwiceJob);
5575
5576 // First request creates a ConnectJob.
5577 TestAuthHelper auth_helper1;
5578 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265579 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105580
5581 // A second, higher priority request is made.
5582 TestAuthHelper auth_helper2;
5583 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265584 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105585
5586 // Run until the auth callback for the second request is invoked.
5587 auth_helper2.WaitForAuth();
5588 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265589 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5590 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395591 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105592
5593 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5594 // ConnectJob.
5595 TestAuthHelper auth_helper3;
5596 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265597 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105598
5599 // Start a higher job that ignores limits, creating a hanging socket. It
5600 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5601 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5602 TestAuthHelper auth_helper4;
5603 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5604 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265605 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105606
5607 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5608 // again.
5609 auth_helper2.RestartWithAuth();
5610 auth_helper2.WaitForAuth();
5611 EXPECT_EQ(0, auth_helper1.auth_count());
5612 EXPECT_FALSE(auth_helper1.have_result());
5613 EXPECT_EQ(2, auth_helper2.auth_count());
5614 EXPECT_FALSE(auth_helper2.have_result());
5615 EXPECT_EQ(0, auth_helper3.auth_count());
5616 EXPECT_FALSE(auth_helper3.have_result());
5617 EXPECT_EQ(0, auth_helper4.auth_count());
5618 EXPECT_FALSE(auth_helper4.have_result());
5619
5620 // Advance auth again, and |auth_helper2| should get the socket.
5621 auth_helper2.RestartWithAuth();
5622 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5623 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5624 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265625 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5626 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105627 EXPECT_EQ(0, auth_helper1.auth_count());
5628 EXPECT_FALSE(auth_helper1.have_result());
5629 EXPECT_EQ(0, auth_helper3.auth_count());
5630 EXPECT_FALSE(auth_helper3.have_result());
5631 EXPECT_EQ(0, auth_helper4.auth_count());
5632 EXPECT_FALSE(auth_helper4.have_result());
5633
5634 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5635 // socket request should be able to claim it.
5636 auth_helper2.handle()->Reset();
5637 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5638 EXPECT_EQ(0, auth_helper1.auth_count());
5639 EXPECT_FALSE(auth_helper1.have_result());
5640 EXPECT_EQ(0, auth_helper3.auth_count());
5641 EXPECT_FALSE(auth_helper3.have_result());
5642 EXPECT_EQ(0, auth_helper4.auth_count());
5643}
5644
David Benjaminbac8dff2019-08-07 01:30:415645enum class RefreshType {
5646 kServer,
5647 kProxy,
5648};
5649
5650// Common base class to test RefreshGroup() when called from either
5651// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5652//
5653// Tests which test behavior specific to one or the other case should use
5654// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5655// when the pool's proxy matches.
5656class ClientSocketPoolBaseRefreshTest
5657 : public ClientSocketPoolBaseTest,
5658 public testing::WithParamInterface<RefreshType> {
5659 public:
5660 void CreatePoolForRefresh(int max_sockets,
5661 int max_sockets_per_group,
5662 bool enable_backup_connect_jobs = false) {
5663 switch (GetParam()) {
5664 case RefreshType::kServer:
5665 CreatePool(max_sockets, max_sockets_per_group,
5666 enable_backup_connect_jobs);
5667 break;
5668 case RefreshType::kProxy:
5669 CreatePoolWithIdleTimeouts(
5670 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5671 ClientSocketPool::used_idle_socket_timeout(),
5672 enable_backup_connect_jobs,
Eric Orth5ccc3f02021-09-23 00:01:575673 PacResultElementToProxyServer("HTTPS myproxy:70"));
David Benjaminbac8dff2019-08-07 01:30:415674 break;
5675 }
5676 }
5677
5678 static ClientSocketPool::GroupId GetGroupId() {
Eric Ortha2e7773212021-06-22 21:49:555679 return TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415680 }
5681
David Benjamin6dd7e882019-10-10 02:35:235682 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5683 // Note this GroupId will match GetGroupId() unless
5684 // kPartitionConnectionsByNetworkIsolationKey is enabled.
Matt Menke4807a9a2020-11-21 00:14:415685 const SchemefulSite kSite(GURL("https://b/"));
5686 const NetworkIsolationKey kNetworkIsolationKey(kSite, kSite);
Eric Ortha2e7773212021-06-22 21:49:555687 return TestGroupId("a", 443, url::kHttpsScheme,
David Benjamin6dd7e882019-10-10 02:35:235688 PrivacyMode::PRIVACY_MODE_DISABLED,
5689 kNetworkIsolationKey);
5690 }
5691
David Benjaminbac8dff2019-08-07 01:30:415692 void OnSSLConfigForServerChanged() {
5693 switch (GetParam()) {
5694 case RefreshType::kServer:
5695 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5696 break;
5697 case RefreshType::kProxy:
5698 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5699 break;
5700 }
5701 }
5702};
5703
5704INSTANTIATE_TEST_SUITE_P(RefreshType,
5705 ClientSocketPoolBaseRefreshTest,
5706 ::testing::Values(RefreshType::kServer,
5707 RefreshType::kProxy));
5708
5709TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5710 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5711 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245712
5713 // First job will be waiting until it gets aborted.
5714 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5715
5716 ClientSocketHandle handle;
5717 TestCompletionCallback callback;
5718 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525719 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285720 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5721 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5722 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245723 IsError(ERR_IO_PENDING));
5724
5725 // Switch connect job types, so creating a new ConnectJob will result in
5726 // success.
5727 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5728
David Benjaminbac8dff2019-08-07 01:30:415729 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245730 EXPECT_EQ(OK, callback.WaitForResult());
5731 ASSERT_TRUE(handle.socket());
5732 EXPECT_EQ(0, pool_->IdleSocketCount());
5733 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5734 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5735 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5736 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5737}
5738
David Benjaminbac8dff2019-08-07 01:30:415739TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235740 base::test::ScopedFeatureList feature_list;
5741 feature_list.InitAndEnableFeature(
5742 features::kPartitionConnectionsByNetworkIsolationKey);
5743
David Benjaminbac8dff2019-08-07 01:30:415744 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5745 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235746 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245747
Anton Bikineev068d2912021-05-15 20:43:525748 pool_->RequestSockets(kGroupId, params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:285749 NetLogWithSource());
Anton Bikineev068d2912021-05-15 20:43:525750 pool_->RequestSockets(kGroupIdInPartition, params_, absl::nullopt, 2,
David Benjamin6dd7e882019-10-10 02:35:235751 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245752 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235753 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5754 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245755 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235756 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245757
David Benjaminbac8dff2019-08-07 01:30:415758 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245759 EXPECT_EQ(0, pool_->IdleSocketCount());
5760 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235761 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245762}
5763
5764TEST_F(ClientSocketPoolBaseTest,
5765 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5766 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415767 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555768 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415769 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555770 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245771
Anton Bikineev068d2912021-05-15 20:43:525772 pool_->RequestSockets(kOtherGroupId, params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:285773 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245774 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5775 EXPECT_EQ(2, pool_->IdleSocketCount());
5776 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5777
David Benjaminbac8dff2019-08-07 01:30:415778 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245779 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5780 EXPECT_EQ(2, pool_->IdleSocketCount());
5781 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5782}
5783
David Benjaminbac8dff2019-08-07 01:30:415784TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5785 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5786 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245787
5788 ClientSocketHandle handle;
5789 TestCompletionCallback callback;
5790 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525791 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285792 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5793 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5794 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245795 IsOk());
5796 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5797 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5798
David Benjaminbac8dff2019-08-07 01:30:415799 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245800
5801 handle.Reset();
5802 EXPECT_EQ(0, pool_->IdleSocketCount());
5803 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5804}
5805
5806TEST_F(ClientSocketPoolBaseTest,
5807 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5808 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415809 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555810 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415811 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555812 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245813
5814 ClientSocketHandle handle;
5815 TestCompletionCallback callback;
5816 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525817 handle.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285818 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5819 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5820 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245821 IsOk());
5822 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5823 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5824
David Benjaminbac8dff2019-08-07 01:30:415825 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245826
5827 handle.Reset();
5828 EXPECT_EQ(1, pool_->IdleSocketCount());
5829 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5830 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5831}
5832
David Benjaminbac8dff2019-08-07 01:30:415833TEST_P(ClientSocketPoolBaseRefreshTest,
5834 RefreshGroupReplacesBoundConnectJobOnConnect) {
5835 CreatePoolForRefresh(1, 1);
5836 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245837 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5838
5839 TestAuthHelper auth_helper;
5840 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5841 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5842 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5843
5844 auth_helper.WaitForAuth();
5845
5846 // This should update the generation, but not cancel the old ConnectJob - it's
5847 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415848 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245849
5850 // Providing auth credentials and restarting the request with them will cause
5851 // the ConnectJob to complete successfully, but the result will be discarded
5852 // because of the generation mismatch.
5853 auth_helper.RestartWithAuth();
5854
5855 // Despite using ConnectJobs that simulate a single challenge, a second
5856 // challenge will be seen, due to using a new ConnectJob.
5857 auth_helper.WaitForAuth();
5858 auth_helper.RestartWithAuth();
5859
5860 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5861 EXPECT_TRUE(auth_helper.handle()->socket());
5862 EXPECT_EQ(2, auth_helper.auth_count());
5863
5864 // When released, the socket will be returned to the socket pool, and
5865 // available for reuse.
5866 auth_helper.handle()->Reset();
5867 EXPECT_EQ(1, pool_->IdleSocketCount());
5868 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5869 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5870}
5871
David Benjaminbac8dff2019-08-07 01:30:415872TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5873 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5874 kUnusedIdleSocketTimeout,
5875 ClientSocketPool::used_idle_socket_timeout(),
5876 false /* no backup connect jobs */,
Eric Orth5ccc3f02021-09-23 00:01:575877 PacResultElementToProxyServer("HTTPS myproxy:70"));
David Benjaminbac8dff2019-08-07 01:30:415878
5879 const ClientSocketPool::GroupId kGroupId1 =
Eric Ortha2e7773212021-06-22 21:49:555880 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415881 const ClientSocketPool::GroupId kGroupId2 =
Eric Ortha2e7773212021-06-22 21:49:555882 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415883 const ClientSocketPool::GroupId kGroupId3 =
Eric Ortha2e7773212021-06-22 21:49:555884 TestGroupId("c", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415885
5886 // Make three sockets in three different groups. The third socket is released
5887 // to the pool as idle.
5888 ClientSocketHandle handle1, handle2, handle3;
5889 TestCompletionCallback callback;
5890 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525891 handle1.Init(kGroupId1, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415892 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5893 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5894 pool_.get(), NetLogWithSource()),
5895 IsOk());
5896 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525897 handle2.Init(kGroupId2, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415898 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5899 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5900 pool_.get(), NetLogWithSource()),
5901 IsOk());
5902 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525903 handle3.Init(kGroupId3, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415904 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5905 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5906 pool_.get(), NetLogWithSource()),
5907 IsOk());
5908 handle3.Reset();
5909 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5910 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5911 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5912 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5913 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5914 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5915
5916 // Changes to some other proxy do not affect the pool. The idle socket remains
5917 // alive and closing |handle2| makes the socket available for the pool.
5918 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5919
5920 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5921 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5922 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5923 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5924 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5925 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5926
5927 handle2.Reset();
5928 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5929 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5930
5931 // Changes to the matching proxy refreshes all groups.
5932 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5933
5934 // Idle sockets are closed.
5935 EXPECT_EQ(0, pool_->IdleSocketCount());
5936 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
5937 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
5938
5939 // The active socket, however, continues to be active.
5940 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5941 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5942
5943 // Closing it does not make it available for the pool.
5944 handle1.Reset();
5945 EXPECT_EQ(0, pool_->IdleSocketCount());
5946 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
5947}
5948
5949TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
5950 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5951
Eric Ortha2e7773212021-06-22 21:49:555952 const ClientSocketPool::GroupId kGroupId = TestGroupId(
5953 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_DISABLED);
5954 const ClientSocketPool::GroupId kGroupIdPrivacy = TestGroupId(
5955 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_ENABLED);
David Benjaminbac8dff2019-08-07 01:30:415956 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555957 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415958
5959 // Make a socket in each groups.
5960 ClientSocketHandle handle1, handle2, handle3;
5961 TestCompletionCallback callback;
5962 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525963 handle1.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415964 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5965 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5966 pool_.get(), NetLogWithSource()),
5967 IsOk());
5968 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525969 handle2.Init(kGroupIdPrivacy, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415970 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5971 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5972 pool_.get(), NetLogWithSource()),
5973 IsOk());
5974 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525975 handle3.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415976 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5977 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5978 pool_.get(), NetLogWithSource()),
5979 IsOk());
5980 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5981 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5982 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5983 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5984 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5985 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5986
5987 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5988
5989 // Active sockets continue to be active.
5990 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5991 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5992 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5993 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5994 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5995 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5996
5997 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
5998 // are unusable.
5999 handle1.Reset();
6000 handle2.Reset();
6001 handle3.Reset();
6002 EXPECT_EQ(1, pool_->IdleSocketCount());
6003 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
6004 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
6005 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
6006 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
6007}
6008
[email protected]f6d1d6eb2009-06-24 20:16:096009} // namespace
6010
6011} // namespace net