blob: ce34f2f4644b39b622905c0b38c283a07a999391 [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"
skyostil4891b25b2015-06-11 11:43:4521#include "base/single_thread_task_runner.h"
[email protected]fc9be5802013-06-11 10:56:5122#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1523#include "base/strings/stringprintf.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"
[email protected]ac790b42009-12-02 04:31:3136#include "net/base/request_priority.h"
Matt Menke4807a9a2020-11-21 00:14:4137#include "net/base/schemeful_site.h"
[email protected]f6d1d6eb2009-06-24 20:16:0938#include "net/base/test_completion_callback.h"
dalykedd30d982019-12-16 15:31:1039#include "net/dns/public/resolve_error_info.h"
Ben Schwartz3ff4dc1e62021-04-27 21:15:2340#include "net/dns/public/secure_dns_policy.h"
[email protected]277d5942010-08-11 21:02:3541#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5142#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0743#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0044#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1945#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0046#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5647#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4648#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0949#include "net/socket/client_socket_factory.h"
50#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2651#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2852#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5453#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1754#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4455#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1056#include "net/socket/stream_socket.h"
Matt Menke9fa17d52019-03-25 19:12:2657#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5158#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0159#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4060#include "net/test/test_with_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2861#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3862#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4863#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0964#include "testing/gtest/include/gtest/gtest.h"
Anton Bikineev068d2912021-05-15 20:43:5265#include "third_party/abseil-cpp/absl/types/optional.h"
Eric Ortha2e7773212021-06-22 21:49:5566#include "url/scheme_host_port.h"
67#include "url/url_constants.h"
[email protected]f6d1d6eb2009-06-24 20:16:0968
robpercival214763f2016-07-01 23:27:0169using net::test::IsError;
70using net::test::IsOk;
71
[email protected]51fdc7c2012-04-10 19:19:4872using ::testing::Invoke;
73using ::testing::Return;
74
[email protected]f6d1d6eb2009-06-24 20:16:0975namespace net {
76
77namespace {
78
[email protected]211d21722009-07-22 15:48:5379const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2080const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5981constexpr base::TimeDelta kUnusedIdleSocketTimeout =
82 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0183
Matt Menkebdf777802019-04-22 19:38:5984ClientSocketPool::GroupId TestGroupId(
Eric Ortha2e7773212021-06-22 21:49:5585 base::StringPiece host,
Matt Menkebdf777802019-04-22 19:38:5986 int port = 80,
Eric Ortha2e7773212021-06-22 21:49:5587 base::StringPiece scheme = url::kHttpScheme,
Matt Menke166443c2019-05-24 18:45:5988 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
89 NetworkIsolationKey network_isolation_key = NetworkIsolationKey()) {
Eric Ortha2e7773212021-06-22 21:49:5590 return ClientSocketPool::GroupId(url::SchemeHostPort(scheme, host, port),
dalyk5f48a132019-10-14 15:20:1991 privacy_mode, network_isolation_key,
Ben Schwartz3ff4dc1e62021-04-27 21:15:2392 SecureDnsPolicy::kAllow);
Matt Menkec6b3edf72019-03-19 17:00:3993}
94
[email protected]034df0f32013-01-07 23:17:4895// Make sure |handle| sets load times correctly when it has been assigned a
96// reused socket.
97void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
98 LoadTimingInfo load_timing_info;
99 // Only pass true in as |is_reused|, as in general, HttpStream types should
100 // have stricter concepts of reuse than socket pools.
101 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
102
103 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19104 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48105
[email protected]b258e0792013-01-12 07:11:59106 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
107 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48108}
109
110// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33111// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48112// of a connection where |is_reused| is false may consider the connection
113// reused.
114void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
115 EXPECT_FALSE(handle.is_reused());
116
117 LoadTimingInfo load_timing_info;
118 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
119
120 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19121 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48122
[email protected]b258e0792013-01-12 07:11:59123 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
124 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
125 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48126
127 TestLoadTimingInfoConnectedReused(handle);
128}
129
130// Make sure |handle| sets load times correctly, in the case that it does not
131// currently have a socket.
132void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
133 // Should only be set to true once a socket is assigned, if at all.
134 EXPECT_FALSE(handle.is_reused());
135
136 LoadTimingInfo load_timing_info;
137 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
138
139 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19140 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48141
[email protected]b258e0792013-01-12 07:11:59142 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
143 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48144}
145
[email protected]3268023f2011-05-05 00:08:10146class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09147 public:
[email protected]034df0f32013-01-07 23:17:48148 explicit MockClientSocket(net::NetLog* net_log)
149 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28150 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20151 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30152 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09153
[email protected]0dc88b32014-03-26 20:12:28154 // Sets whether the socket has unread data. If true, the next call to Read()
155 // will return 1 byte and IsConnectedAndIdle() will return false.
156 void set_has_unread_data(bool has_unread_data) {
157 has_unread_data_ = has_unread_data;
158 }
159
[email protected]3f55aa12011-12-07 02:03:33160 // Socket implementation.
dchengb03027d2014-10-21 12:00:20161 int Read(IOBuffer* /* buf */,
162 int len,
Brad Lassey3a814172018-04-26 03:30:21163 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28164 if (has_unread_data_ && len > 0) {
165 has_unread_data_ = false;
166 was_used_to_convey_data_ = true;
167 return 1;
168 }
[email protected]e86df8dc2013-03-30 13:18:28169 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33170 }
[email protected]ab838892009-06-30 18:49:05171
[email protected]a2b2cfc2017-12-06 09:06:08172 int Write(
173 IOBuffer* /* buf */,
174 int len,
Brad Lassey3a814172018-04-26 03:30:21175 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08176 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01177 was_used_to_convey_data_ = true;
178 return len;
[email protected]ab838892009-06-30 18:49:05179 }
Avi Drissman13fc8932015-12-20 04:40:46180 int SetReceiveBufferSize(int32_t size) override { return OK; }
181 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05182
[email protected]dbf036f2011-12-06 23:33:24183 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21184 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24185 connected_ = true;
186 return OK;
187 }
[email protected]f6d1d6eb2009-06-24 20:16:09188
dchengb03027d2014-10-21 12:00:20189 void Disconnect() override { connected_ = false; }
190 bool IsConnected() const override { return connected_; }
191 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28192 return connected_ && !has_unread_data_;
193 }
[email protected]0b7648c2009-07-06 20:14:01194
dchengb03027d2014-10-21 12:00:20195 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16196 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09197 }
[email protected]f6d1d6eb2009-06-24 20:16:09198
dchengb03027d2014-10-21 12:00:20199 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35200 return ERR_UNEXPECTED;
201 }
202
tfarina428341112016-09-22 13:38:20203 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02204
dchengb03027d2014-10-21 12:00:20205 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37206 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20207 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
208 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03209 void GetConnectionAttempts(ConnectionAttempts* out) const override {
210 out->clear();
211 }
212 void ClearConnectionAttempts() override {}
213 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49214 int64_t GetTotalReceivedBytes() const override {
215 NOTIMPLEMENTED();
216 return 0;
217 }
Paul Jensen0f49dec2017-12-12 23:39:58218 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45219
[email protected]f6d1d6eb2009-06-24 20:16:09220 private:
221 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28222 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20223 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01224 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09225
[email protected]ab838892009-06-30 18:49:05226 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09227};
228
[email protected]5fc08e32009-07-15 17:09:57229class TestConnectJob;
230
[email protected]f6d1d6eb2009-06-24 20:16:09231class MockClientSocketFactory : public ClientSocketFactory {
232 public:
[email protected]ab838892009-06-30 18:49:05233 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09234
danakj655b66c2016-04-16 00:51:38235 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04236 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41237 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19238 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41239 NOTREACHED();
David Benjamin24725be2019-07-24 20:57:18240 return nullptr;
[email protected]98b0e582011-06-22 14:31:41241 }
242
Helen Lid5bb9222018-04-12 15:33:09243 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07244 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38245 std::unique_ptr<
246 SocketPerformanceWatcher> /* socket_performance_watcher */,
Eric Roman2bc77162020-09-16 18:30:45247 NetworkQualityEstimator* /* network_quality_estimator */,
[email protected]0a0b7682010-08-25 17:08:07248 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19249 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09250 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09251 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09252 }
253
danakj655b66c2016-04-16 00:51:38254 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
David Benjamin24725be2019-07-24 20:57:18255 SSLClientContext* context,
Matt Menke841fc412019-03-05 23:20:12256 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27257 const HostPortPair& host_and_port,
David Benjamin24725be2019-07-24 20:57:18258 const SSLConfig& ssl_config) override {
[email protected]f6d1d6eb2009-06-24 20:16:09259 NOTIMPLEMENTED();
David Benjamin24725be2019-07-24 20:57:18260 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09261 }
Matt Menkefd956922019-02-04 23:44:03262
Matt Menke52cd95a2019-02-08 06:16:27263 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
264 std::unique_ptr<StreamSocket> stream_socket,
265 const std::string& user_agent,
266 const HostPortPair& endpoint,
267 const ProxyServer& proxy_server,
268 HttpAuthController* http_auth_controller,
269 bool tunnel,
270 bool using_spdy,
271 NextProto negotiated_protocol,
272 ProxyDelegate* proxy_delegate,
Matt Menke52cd95a2019-02-08 06:16:27273 const NetworkTrafficAnnotationTag& traffic_annotation) override {
274 NOTIMPLEMENTED();
275 return nullptr;
276 }
277
[email protected]5fc08e32009-07-15 17:09:57278 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55279
[email protected]5fc08e32009-07-15 17:09:57280 void SignalJobs();
281
[email protected]03b7c8c2013-07-20 04:38:55282 void SignalJob(size_t job);
283
284 void SetJobLoadState(size_t job, LoadState load_state);
285
Matt Menke141b87f22019-01-30 02:43:03286 // Sets the HasConnectionEstablished value of the specified job to true,
287 // without invoking the callback.
288 void SetJobHasEstablishedConnection(size_t job);
289
[email protected]f6d1d6eb2009-06-24 20:16:09290 int allocation_count() const { return allocation_count_; }
291
[email protected]f6d1d6eb2009-06-24 20:16:09292 private:
293 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57294 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09295};
296
[email protected]ab838892009-06-30 18:49:05297class TestConnectJob : public ConnectJob {
298 public:
299 enum JobType {
300 kMockJob,
301 kMockFailingJob,
302 kMockPendingJob,
303 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57304 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10305
306 // Certificate errors return a socket in addition to an error code.
307 kMockCertErrorJob,
308 kMockPendingCertErrorJob,
309
[email protected]e60e47a2010-07-14 03:37:18310 kMockAdditionalErrorStateJob,
311 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28312 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10313
314 kMockAuthChallengeOnceJob,
315 kMockAuthChallengeTwiceJob,
316 kMockAuthChallengeOnceFailingJob,
317 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05318 };
319
[email protected]994d4932010-07-12 17:55:13320 // The kMockPendingJob uses a slight delay before allowing the connect
321 // to complete.
322 static const int kPendingConnectDelay = 2;
323
[email protected]ab838892009-06-30 18:49:05324 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40325 RequestPriority request_priority,
326 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34327 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43328 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05329 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43330 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40331 : ConnectJob(request_priority,
332 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38333 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43334 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38335 delegate,
336 nullptr /* net_log */,
337 NetLogSourceType::TRANSPORT_CONNECT_JOB,
338 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58339 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05340 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18341 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03342 has_established_connection_(false),
Jeremy Romand54000b22019-07-08 18:40:16343 store_additional_error_state_(false) {}
[email protected]ab838892009-06-30 18:49:05344
[email protected]974ebd62009-08-03 23:14:34345 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13346 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34347 }
348
[email protected]03b7c8c2013-07-20 04:38:55349 void set_load_state(LoadState load_state) { load_state_ = load_state; }
350
Matt Menke141b87f22019-01-30 02:43:03351 void set_has_established_connection() {
352 DCHECK(!has_established_connection_);
353 has_established_connection_ = true;
354 }
355
[email protected]03b7c8c2013-07-20 04:38:55356 // From ConnectJob:
357
dchengb03027d2014-10-21 12:00:20358 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21359
Matt Menke141b87f22019-01-30 02:43:03360 bool HasEstablishedConnection() const override {
361 return has_established_connection_;
362 }
363
dalykedd30d982019-12-16 15:31:10364 ResolveErrorInfo GetResolveErrorInfo() const override {
365 return ResolveErrorInfo(OK);
366 }
367
Matt Menke6f84d1f12019-04-11 19:26:47368 bool IsSSLError() const override { return store_additional_error_state_; }
369
370 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
371 if (store_additional_error_state_)
372 return base::MakeRefCounted<SSLCertRequestInfo>();
373 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18374 }
375
[email protected]974ebd62009-08-03 23:14:34376 private:
[email protected]03b7c8c2013-07-20 04:38:55377 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05378
dchengb03027d2014-10-21 12:00:20379 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05380 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35381 client_socket_factory_->CreateTransportClientSocket(
Eric Roman2bc77162020-09-16 18:30:45382 ignored, nullptr, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05383 switch (job_type_) {
384 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13385 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10386 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05387 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13388 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10389 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05390 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57391 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47392
393 // Depending on execution timings, posting a delayed task can result
394 // in the task getting executed the at the earliest possible
395 // opportunity or only after returning once from the message loop and
396 // then a second call into the message loop. In order to make behavior
397 // more deterministic, we change the default delay to 2ms. This should
398 // always require us to wait for the second call into the message loop.
399 //
400 // N.B. The correct fix for this and similar timing problems is to
401 // abstract time for the purpose of unittests. Unfortunately, we have
402 // a lot of third-party components that directly call the various
403 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45404 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05405 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49406 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
407 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10408 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53409 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05410 return ERR_IO_PENDING;
411 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57412 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45413 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05414 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49415 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
416 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10417 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53418 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05419 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57420 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55421 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57422 client_socket_factory_->WaitForSignal(this);
423 waiting_success_ = true;
424 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10425 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13426 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10427 true /* cert_error */);
428 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13429 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45430 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13431 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49432 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
433 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10434 true /* async */, true /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53435 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13436 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18437 case kMockAdditionalErrorStateJob:
438 store_additional_error_state_ = true;
439 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10440 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18441 case kMockPendingAdditionalErrorStateJob:
442 set_load_state(LOAD_STATE_CONNECTING);
443 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45444 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18445 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49446 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
447 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10448 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53449 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18450 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28451 case kMockUnreadDataJob: {
452 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10453 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28454 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
455 return ret;
456 }
Matt Menkeb57663b32019-03-01 17:17:10457 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01458 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10459 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
460 return ERR_IO_PENDING;
461 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01462 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10463 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
464 return ERR_IO_PENDING;
465 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01466 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10467 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
468 return ERR_IO_PENDING;
469 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01470 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10471 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
472 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05473 default:
474 NOTREACHED();
Anton Bikineev068d2912021-05-15 20:43:52475 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05476 return ERR_FAILED;
477 }
478 }
479
Lily Chen02ef29a2018-11-30 16:31:43480 void ChangePriorityInternal(RequestPriority priority) override {}
481
Matt Menkeb57663b32019-03-01 17:17:10482 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13483 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03484 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05485 if (succeed) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19486 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52487 absl::nullopt);
Bence Békybdbb0e72018-08-07 21:42:59488 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10489 } else if (cert_error) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19490 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52491 absl::nullopt);
Matt Menkeb57663b32019-03-01 17:17:10492 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40493 } else {
[email protected]e772db3f2010-07-12 18:11:13494 result = ERR_CONNECTION_FAILED;
Anton Bikineev068d2912021-05-15 20:43:52495 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05496 }
[email protected]2ab05b52009-07-01 23:57:58497
498 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30499 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05500 return result;
501 }
502
Matt Menkeb57663b32019-03-01 17:17:10503 void DoAdvanceAuthChallenge(int remaining_challenges,
504 bool succeed_after_last_challenge) {
505 base::ThreadTaskRunnerHandle::Get()->PostTask(
506 FROM_HERE,
507 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
508 weak_factory_.GetWeakPtr(), remaining_challenges,
509 succeed_after_last_challenge));
510 }
511
512 void InvokeNextProxyAuthCallback(int remaining_challenges,
513 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01514 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10515 if (remaining_challenges == 0) {
516 DoConnect(succeed_after_last_challenge, true /* was_async */,
517 false /* cert_error */);
518 return;
519 }
520
521 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
522 // The auth tests here are just focused on ConnectJob bookkeeping.
523 HttpResponseInfo info;
524 NotifyDelegateOfProxyAuth(
525 info, nullptr /* http_auth_controller */,
526 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
527 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
528 succeed_after_last_challenge));
529 }
530
[email protected]5fc08e32009-07-15 17:09:57531 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05532 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57533 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21534 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03535 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18536 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05537
Jeremy Romand54000b22019-07-08 18:40:16538 base::WeakPtrFactory<TestConnectJob> weak_factory_{this};
[email protected]d5492c52013-11-10 20:44:39539
[email protected]ab838892009-06-30 18:49:05540 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
541};
542
[email protected]d80a4322009-08-14 07:07:49543class TestConnectJobFactory
Matt Menke16f5c2e52019-03-25 21:50:40544 : public TransportClientSocketPool::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05545 public:
[email protected]034df0f32013-01-07 23:17:48546 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
547 NetLog* net_log)
Matt Menkea6f99ad2019-03-08 02:26:43548 : common_connect_job_params_(
549 nullptr /* client_socket_factory */,
550 nullptr /* host_resolver */,
Matt Menkeb88837e2019-03-20 11:50:40551 nullptr /* http_auth_cache */,
552 nullptr /* http_auth_handler_factory */,
553 nullptr /* spdy_session_pool */,
Matt Menkeb5fb42b2019-03-22 17:26:13554 nullptr /* quic_supported_versions */,
Matt Menkeb88837e2019-03-20 11:50:40555 nullptr /* quic_stream_factory */,
Matt Menkea6f99ad2019-03-08 02:26:43556 nullptr /* proxy_delegate */,
Matt Menked732ea42019-03-08 12:05:00557 nullptr /* http_user_agent_settings */,
David Benjamin24725be2019-07-24 20:57:18558 nullptr /* ssl_client_context */,
Matt Menkea6f99ad2019-03-08 02:26:43559 nullptr /* socket_performance_watcher_factory */,
560 nullptr /* network_quality_estimator */,
561 net_log,
562 nullptr /* websocket_endpoint_lock_manager */),
563 job_type_(TestConnectJob::kMockJob),
Raul Tambre94493c652019-03-11 17:18:35564 job_types_(nullptr),
Matt Menkea6f99ad2019-03-08 02:26:43565 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05566
Chris Watkins7a41d3552017-12-01 02:13:27567 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05568
569 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
570
[email protected]51fdc7c2012-04-10 19:19:48571 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
572 job_types_ = job_types;
573 CHECK(!job_types_->empty());
574 }
575
[email protected]974ebd62009-08-03 23:14:34576 void set_timeout_duration(base::TimeDelta timeout_duration) {
577 timeout_duration_ = timeout_duration;
578 }
579
[email protected]3f55aa12011-12-07 02:03:33580 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55581
danakj655b66c2016-04-16 00:51:38582 std::unique_ptr<ConnectJob> NewConnectJob(
Matt Menkeaafff542019-04-22 22:09:36583 ClientSocketPool::GroupId group_id,
584 scoped_refptr<ClientSocketPool::SocketParams> socket_params,
Anton Bikineev068d2912021-05-15 20:43:52585 const absl::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Matt Menke16f5c2e52019-03-25 21:50:40586 RequestPriority request_priority,
587 SocketTag socket_tag,
mostynbba063d6032014-10-09 11:01:13588 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48589 EXPECT_TRUE(!job_types_ || !job_types_->empty());
590 TestConnectJob::JobType job_type = job_type_;
591 if (job_types_ && !job_types_->empty()) {
592 job_type = job_types_->front();
593 job_types_->pop_front();
594 }
Matt Menkea6f99ad2019-03-08 02:26:43595 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40596 job_type, request_priority, socket_tag, timeout_duration_,
597 &common_connect_job_params_, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05598 }
599
600 private:
Matt Menkea6f99ad2019-03-08 02:26:43601 const CommonConnectJobParams common_connect_job_params_;
[email protected]ab838892009-06-30 18:49:05602 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48603 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34604 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57605 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05606
607 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
608};
609
[email protected]a937a06d2009-08-19 21:19:24610} // namespace
611
[email protected]a937a06d2009-08-19 21:19:24612namespace {
613
[email protected]5fc08e32009-07-15 17:09:57614void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26615 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57616 (*it)->Signal();
617 }
618 waiting_jobs_.clear();
619}
620
[email protected]03b7c8c2013-07-20 04:38:55621void MockClientSocketFactory::SignalJob(size_t job) {
622 ASSERT_LT(job, waiting_jobs_.size());
623 waiting_jobs_[job]->Signal();
624 waiting_jobs_.erase(waiting_jobs_.begin() + job);
625}
626
627void MockClientSocketFactory::SetJobLoadState(size_t job,
628 LoadState load_state) {
629 ASSERT_LT(job, waiting_jobs_.size());
630 waiting_jobs_[job]->set_load_state(load_state);
631}
632
Matt Menke141b87f22019-01-30 02:43:03633void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
634 ASSERT_LT(job, waiting_jobs_.size());
635 waiting_jobs_[job]->set_has_established_connection();
636}
637
Gabriel Charette694c3c332019-08-19 14:53:05638class ClientSocketPoolBaseTest : public TestWithTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09639 protected:
Alex Clarke0def2092018-12-10 12:01:45640 ClientSocketPoolBaseTest()
Gabriel Charette694c3c332019-08-19 14:53:05641 : TestWithTaskEnvironment(
642 base::test::TaskEnvironment::TimeSource::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03643 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54644 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40645 TransportClientSocketPool::connect_backup_jobs_enabled();
646 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54647 }
[email protected]2431756e2010-09-29 20:26:13648
dcheng67be2b1f2014-10-27 21:47:29649 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40650 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54651 connect_backup_jobs_enabled_);
652 }
[email protected]c9d6a1d2009-07-14 16:15:20653
Matt Menke9fa17d52019-03-25 19:12:26654 void CreatePool(int max_sockets,
655 int max_sockets_per_group,
656 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59657 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
658 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26659 ClientSocketPool::used_idle_socket_timeout(),
660 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16661 }
662
David Benjaminbac8dff2019-08-07 01:30:41663 void CreatePoolWithIdleTimeouts(
664 int max_sockets,
665 int max_sockets_per_group,
666 base::TimeDelta unused_idle_socket_timeout,
667 base::TimeDelta used_idle_socket_timeout,
668 bool enable_backup_connect_jobs = false,
669 ProxyServer proxy_server = ProxyServer::Direct()) {
[email protected]c9d6a1d2009-07-14 16:15:20670 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26671 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
672 std::make_unique<TestConnectJobFactory>(&client_socket_factory_,
673 &net_log_);
674 connect_job_factory_ = connect_job_factory.get();
675 pool_ = TransportClientSocketPool::CreateForTesting(
676 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
David Benjaminbac8dff2019-08-07 01:30:41677 used_idle_socket_timeout, proxy_server, std::move(connect_job_factory),
Matt Menke9fa17d52019-03-25 19:12:26678 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20679 }
[email protected]f6d1d6eb2009-06-24 20:16:09680
mmenked3641e12016-01-28 16:06:15681 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39682 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33683 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15684 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39685 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15686 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33687 }
688
Matt Menkec6b3edf72019-03-19 17:00:39689 int StartRequest(const ClientSocketPool::GroupId& group_id,
690 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15691 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39692 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09693 }
694
[email protected]2431756e2010-09-29 20:26:13695 int GetOrderOfRequest(size_t index) const {
696 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09697 }
698
[email protected]2431756e2010-09-29 20:26:13699 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
700 return test_base_.ReleaseOneConnection(keep_alive);
701 }
702
703 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
704 test_base_.ReleaseAllConnections(keep_alive);
705 }
706
Matt Menke433de6d2020-03-04 00:24:11707 // Expects a single NetLogEventType::SOCKET_POOL_CLOSING_SOCKET in |net_log_|.
708 // It should be logged for the provided source and have the indicated reason.
709 void ExpectSocketClosedWithReason(NetLogSource expected_source,
710 const char* expected_reason) {
711 auto entries = net_log_.GetEntriesForSourceWithType(
712 expected_source, NetLogEventType::SOCKET_POOL_CLOSING_SOCKET,
713 NetLogEventPhase::NONE);
714 ASSERT_EQ(1u, entries.size());
715 ASSERT_TRUE(entries[0].HasParams());
716 ASSERT_TRUE(entries[0].params.is_dict());
717 const std::string* reason = entries[0].params.FindStringKey("reason");
718 ASSERT_TRUE(reason);
719 EXPECT_EQ(expected_reason, *reason);
720 }
721
[email protected]2431756e2010-09-29 20:26:13722 TestSocketRequest* request(int i) { return test_base_.request(i); }
723 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38724 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42725 return test_base_.requests();
726 }
rdsmith29dbad12017-02-17 02:22:18727 // Only counts the requests that get sockets asynchronously;
728 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13729 size_t completion_count() const { return test_base_.completion_count(); }
730
Matt Muellerd9342e3a2019-11-26 01:41:14731 RecordingTestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54732 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09733 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04734 TestConnectJobFactory* connect_job_factory_;
Matt Menke9fa17d52019-03-25 19:12:26735 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19736 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26737 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13738 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09739};
740
[email protected]5fc08e32009-07-15 17:09:57741TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53742 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20743
[email protected]6ecf2b92011-12-15 01:14:52744 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06745 ClientSocketHandle handle;
Matt Muellerd9342e3a2019-11-26 01:41:14746 RecordingBoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48747 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53748
Matt Menkef09e64c2019-04-23 22:16:28749 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:52750 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28751 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
752 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
753 pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09754 EXPECT_TRUE(handle.is_initialized());
755 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48756 TestLoadTimingInfoConnectedNotReused(handle);
757
[email protected]f6d1d6eb2009-06-24 20:16:09758 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48759 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30760
Eric Roman79cc7552019-07-19 02:17:54761 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40762
Matt Menke9fa17d52019-03-25 19:12:26763 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53764 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26765 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00766 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26767 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
768 EXPECT_TRUE(LogContainsEvent(
769 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
770 NetLogEventPhase::NONE));
771 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00772 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
773 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26774 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09775}
776
[email protected]ab838892009-06-30 18:49:05777TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53778 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20779
[email protected]ab838892009-06-30 18:49:05780 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Muellerd9342e3a2019-11-26 01:41:14781 RecordingBoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53782
[email protected]2431756e2010-09-29 20:26:13783 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52784 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18785 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13786 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51787 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50788 EXPECT_EQ(
789 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:52790 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28791 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
792 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
793 pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13794 EXPECT_FALSE(handle.socket());
795 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51796 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48797 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30798
Eric Roman79cc7552019-07-19 02:17:54799 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40800
Matt Menke9fa17d52019-03-25 19:12:26801 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17802 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26803 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00804 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26805 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
806 EXPECT_TRUE(LogContainsEvent(
807 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
808 NetLogEventPhase::NONE));
809 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09810}
811
Matt Menke433de6d2020-03-04 00:24:11812// Test releasing an open socket into the socket pool, telling the socket pool
813// to close the socket.
814TEST_F(ClientSocketPoolBaseTest, ReleaseAndCloseConnection) {
815 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
816
817 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
818 ASSERT_TRUE(request(0)->handle()->socket());
819 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
820 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
821
822 EXPECT_EQ(0, pool_->IdleSocketCount());
823 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
824
825 ExpectSocketClosedWithReason(
826 source, TransportClientSocketPool::kClosedConnectionReturnedToPool);
827}
828
829TEST_F(ClientSocketPoolBaseTest, SocketWithUnreadDataReturnedToPool) {
830 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
831 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
832
833 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
834 ASSERT_TRUE(request(0)->handle()->socket());
835 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
836 EXPECT_TRUE(request(0)->handle()->socket()->IsConnected());
837 EXPECT_FALSE(request(0)->handle()->socket()->IsConnectedAndIdle());
838 ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE);
839
840 EXPECT_EQ(0, pool_->IdleSocketCount());
841 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
842
843 ExpectSocketClosedWithReason(
844 source, TransportClientSocketPool::kDataReceivedUnexpectedly);
845}
846
Matt Menkef6edce752019-03-19 17:21:56847// Make sure different groups do not share sockets.
848TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59849 base::test::ScopedFeatureList feature_list;
850 feature_list.InitAndEnableFeature(
851 features::kPartitionConnectionsByNetworkIsolationKey);
852
Matt Menkef6edce752019-03-19 17:21:56853 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
854
855 const HostPortPair kHostPortPairs[] = {
856 {"a", 80},
857 {"a", 443},
858 {"b", 80},
859 };
860
Eric Ortha2e7773212021-06-22 21:49:55861 const char* const kSchemes[] = {
862 url::kHttpScheme,
863 url::kHttpsScheme,
Matt Menkef6edce752019-03-19 17:21:56864 };
865
Matt Menkebdf777802019-04-22 19:38:59866 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
867 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56868
Matt Menke4807a9a2020-11-21 00:14:41869 const SchemefulSite kSiteA(GURL("http://a.test/"));
870 const SchemefulSite kSiteB(GURL("http://b.test/"));
Matt Menke166443c2019-05-24 18:45:59871 const NetworkIsolationKey kNetworkIsolationKeys[] = {
Matt Menke4807a9a2020-11-21 00:14:41872 NetworkIsolationKey(kSiteA, kSiteA),
873 NetworkIsolationKey(kSiteB, kSiteB),
Matt Menke166443c2019-05-24 18:45:59874 };
875
Ben Schwartz3ff4dc1e62021-04-27 21:15:23876 const SecureDnsPolicy kSecureDnsPolicys[] = {SecureDnsPolicy::kAllow,
877 SecureDnsPolicy::kDisable};
dalyk5f48a132019-10-14 15:20:19878
Matt Menkef6edce752019-03-19 17:21:56879 int total_idle_sockets = 0;
880
881 // Walk through each GroupId, making sure that requesting a socket for one
882 // group does not return a previously connected socket for another group.
883 for (const auto& host_port_pair : kHostPortPairs) {
884 SCOPED_TRACE(host_port_pair.ToString());
Eric Ortha2e7773212021-06-22 21:49:55885 for (const char* scheme : kSchemes) {
886 SCOPED_TRACE(scheme);
Matt Menkef6edce752019-03-19 17:21:56887 for (const auto& privacy_mode : kPrivacyModes) {
888 SCOPED_TRACE(privacy_mode);
Matt Menke166443c2019-05-24 18:45:59889 for (const auto& network_isolation_key : kNetworkIsolationKeys) {
890 SCOPED_TRACE(network_isolation_key.ToString());
Ben Schwartz3ff4dc1e62021-04-27 21:15:23891 for (const auto& secure_dns_policy : kSecureDnsPolicys) {
892 SCOPED_TRACE(static_cast<int>(secure_dns_policy));
Matt Menkef6edce752019-03-19 17:21:56893
dalyk5f48a132019-10-14 15:20:19894 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56895
dalyk5f48a132019-10-14 15:20:19896 ClientSocketPool::GroupId group_id(
Eric Ortha2e7773212021-06-22 21:49:55897 url::SchemeHostPort(scheme, host_port_pair.host(),
898 host_port_pair.port()),
899 privacy_mode, network_isolation_key, secure_dns_policy);
Matt Menkef6edce752019-03-19 17:21:56900
dalyk5f48a132019-10-14 15:20:19901 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56902
dalyk5f48a132019-10-14 15:20:19903 TestCompletionCallback callback;
904 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56905
dalyk5f48a132019-10-14 15:20:19906 // Since the group is empty, requesting a socket should not complete
907 // synchronously.
Anton Bikineev068d2912021-05-15 20:43:52908 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19909 DEFAULT_PRIORITY, SocketTag(),
910 ClientSocketPool::RespectLimits::ENABLED,
911 callback.callback(),
912 ClientSocketPool::ProxyAuthCallback(),
913 pool_.get(), NetLogWithSource()),
914 IsError(ERR_IO_PENDING));
915 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
916 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56917
dalyk5f48a132019-10-14 15:20:19918 EXPECT_THAT(callback.WaitForResult(), IsOk());
919 EXPECT_TRUE(handle.socket());
920 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
921 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56922
dalyk5f48a132019-10-14 15:20:19923 // Return socket to pool.
924 handle.Reset();
925 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56926
dalyk5f48a132019-10-14 15:20:19927 // Requesting a socket again should return the same socket as
928 // before, so should complete synchronously.
Anton Bikineev068d2912021-05-15 20:43:52929 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19930 DEFAULT_PRIORITY, SocketTag(),
931 ClientSocketPool::RespectLimits::ENABLED,
932 callback.callback(),
933 ClientSocketPool::ProxyAuthCallback(),
934 pool_.get(), NetLogWithSource()),
935 IsOk());
936 EXPECT_TRUE(handle.socket());
937 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56938
dalyk5f48a132019-10-14 15:20:19939 // Return socket to pool again.
940 handle.Reset();
941 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56942
dalyk5f48a132019-10-14 15:20:19943 ++total_idle_sockets;
944 }
Matt Menke166443c2019-05-24 18:45:59945 }
Matt Menkef6edce752019-03-19 17:21:56946 }
947 }
948 }
949}
950
[email protected]211d21722009-07-22 15:48:53951TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
952 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
953
[email protected]9e743cd2010-03-16 07:03:53954 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30955
Matt Menkec6b3edf72019-03-19 17:00:39956 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
957 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
958 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
959 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53960
[email protected]2431756e2010-09-29 20:26:13961 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53962 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13963 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53964
Matt Menkec6b3edf72019-03-19 17:00:39965 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
966 IsError(ERR_IO_PENDING));
967 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
968 IsError(ERR_IO_PENDING));
969 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
970 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53971
[email protected]2431756e2010-09-29 20:26:13972 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53973
[email protected]2431756e2010-09-29 20:26:13974 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53975 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13976 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53977
978 EXPECT_EQ(1, GetOrderOfRequest(1));
979 EXPECT_EQ(2, GetOrderOfRequest(2));
980 EXPECT_EQ(3, GetOrderOfRequest(3));
981 EXPECT_EQ(4, GetOrderOfRequest(4));
982 EXPECT_EQ(5, GetOrderOfRequest(5));
983 EXPECT_EQ(6, GetOrderOfRequest(6));
984 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17985
986 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13987 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53988}
989
990TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
991 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
992
[email protected]9e743cd2010-03-16 07:03:53993 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30994
[email protected]211d21722009-07-22 15:48:53995 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39996 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
997 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
998 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
999 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531000
[email protected]2431756e2010-09-29 20:26:131001 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531002 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131003 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531004
1005 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:391006 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1007 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531008
[email protected]2431756e2010-09-29 20:26:131009 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531010
[email protected]2431756e2010-09-29 20:26:131011 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531012 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131013 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531014
1015 EXPECT_EQ(1, GetOrderOfRequest(1));
1016 EXPECT_EQ(2, GetOrderOfRequest(2));
1017 EXPECT_EQ(3, GetOrderOfRequest(3));
1018 EXPECT_EQ(4, GetOrderOfRequest(4));
1019 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:171020
1021 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131022 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531023}
1024
1025TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
1026 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1027
Matt Menkec6b3edf72019-03-19 17:00:391028 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
1029 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
1030 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1031 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:531032
[email protected]2431756e2010-09-29 20:26:131033 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531034 client_socket_factory_.allocation_count());
1035
Matt Menkec6b3edf72019-03-19 17:00:391036 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
1037 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1038 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531039
[email protected]2431756e2010-09-29 20:26:131040 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531041
[email protected]2431756e2010-09-29 20:26:131042 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531043
1044 // First 4 requests don't have to wait, and finish in order.
1045 EXPECT_EQ(1, GetOrderOfRequest(1));
1046 EXPECT_EQ(2, GetOrderOfRequest(2));
1047 EXPECT_EQ(3, GetOrderOfRequest(3));
1048 EXPECT_EQ(4, GetOrderOfRequest(4));
1049
Matt Menkec6b3edf72019-03-19 17:00:391050 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1051 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531052 EXPECT_EQ(7, GetOrderOfRequest(5));
1053 EXPECT_EQ(6, GetOrderOfRequest(6));
1054 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171055
1056 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131057 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531058}
1059
rdsmith29dbad12017-02-17 02:22:181060// Test reprioritizing a request before completion doesn't interfere with
1061// its completion.
1062TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1063 CreatePool(kDefaultMaxSockets, 1);
1064
Matt Menkec6b3edf72019-03-19 17:00:391065 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1066 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181067 EXPECT_TRUE(request(0)->handle()->socket());
1068 EXPECT_FALSE(request(1)->handle()->socket());
1069
Lily Chenecebf932018-11-02 17:15:431070 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181071
1072 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1073
1074 EXPECT_TRUE(request(1)->handle()->socket());
1075}
1076
1077// Reprioritize a request up past another one and make sure that changes the
1078// completion order.
1079TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1080 CreatePool(kDefaultMaxSockets, 1);
1081
Matt Menkec6b3edf72019-03-19 17:00:391082 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1083 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1084 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181085 EXPECT_TRUE(request(0)->handle()->socket());
1086 EXPECT_FALSE(request(1)->handle()->socket());
1087 EXPECT_FALSE(request(2)->handle()->socket());
1088
1089 request(2)->handle()->SetPriority(HIGHEST);
1090
1091 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1092
1093 EXPECT_EQ(1, GetOrderOfRequest(1));
1094 EXPECT_EQ(3, GetOrderOfRequest(2));
1095 EXPECT_EQ(2, GetOrderOfRequest(3));
1096}
1097
1098// Reprioritize a request without changing relative priorities and check
1099// that the order doesn't change.
1100TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1101 CreatePool(kDefaultMaxSockets, 1);
1102
Matt Menkec6b3edf72019-03-19 17:00:391103 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1104 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1105 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181106 EXPECT_TRUE(request(0)->handle()->socket());
1107 EXPECT_FALSE(request(1)->handle()->socket());
1108 EXPECT_FALSE(request(2)->handle()->socket());
1109
1110 request(2)->handle()->SetPriority(MEDIUM);
1111
1112 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1113
1114 EXPECT_EQ(1, GetOrderOfRequest(1));
1115 EXPECT_EQ(2, GetOrderOfRequest(2));
1116 EXPECT_EQ(3, GetOrderOfRequest(3));
1117}
1118
1119// Reprioritize a request past down another one and make sure that changes the
1120// completion order.
1121TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1122 CreatePool(kDefaultMaxSockets, 1);
1123
Matt Menkec6b3edf72019-03-19 17:00:391124 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1125 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1126 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181127 EXPECT_TRUE(request(0)->handle()->socket());
1128 EXPECT_FALSE(request(1)->handle()->socket());
1129 EXPECT_FALSE(request(2)->handle()->socket());
1130
1131 request(1)->handle()->SetPriority(LOW);
1132
1133 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1134
1135 EXPECT_EQ(1, GetOrderOfRequest(1));
1136 EXPECT_EQ(3, GetOrderOfRequest(2));
1137 EXPECT_EQ(2, GetOrderOfRequest(3));
1138}
1139
1140// Reprioritize a request to the same level as another and confirm it is
1141// put after the old request.
1142TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1143 CreatePool(kDefaultMaxSockets, 1);
1144
Matt Menkec6b3edf72019-03-19 17:00:391145 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1146 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1147 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181148 EXPECT_TRUE(request(0)->handle()->socket());
1149 EXPECT_FALSE(request(1)->handle()->socket());
1150 EXPECT_FALSE(request(2)->handle()->socket());
1151
1152 request(1)->handle()->SetPriority(MEDIUM);
1153
1154 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1155
1156 EXPECT_EQ(1, GetOrderOfRequest(1));
1157 EXPECT_EQ(3, GetOrderOfRequest(2));
1158 EXPECT_EQ(2, GetOrderOfRequest(3));
1159}
1160
[email protected]211d21722009-07-22 15:48:531161TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1162 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1163
Matt Menkec6b3edf72019-03-19 17:00:391164 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1165 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1166 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1167 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531168
[email protected]2431756e2010-09-29 20:26:131169 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531170 client_socket_factory_.allocation_count());
1171
Matt Menkec6b3edf72019-03-19 17:00:391172 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1173 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1174 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531175
[email protected]2431756e2010-09-29 20:26:131176 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531177
[email protected]2431756e2010-09-29 20:26:131178 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531179 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131180 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531181
1182 // First 4 requests don't have to wait, and finish in order.
1183 EXPECT_EQ(1, GetOrderOfRequest(1));
1184 EXPECT_EQ(2, GetOrderOfRequest(2));
1185 EXPECT_EQ(3, GetOrderOfRequest(3));
1186 EXPECT_EQ(4, GetOrderOfRequest(4));
1187
1188 // Request ("b", 7) has the highest priority, but we can't make new socket for
1189 // group "b", because it has reached the per-group limit. Then we make
1190 // socket for ("c", 6), because it has higher priority than ("a", 4),
1191 // and we still can't make a socket for group "b".
1192 EXPECT_EQ(5, GetOrderOfRequest(5));
1193 EXPECT_EQ(6, GetOrderOfRequest(6));
1194 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171195
1196 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131197 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531198}
1199
1200// Make sure that we count connecting sockets against the total limit.
1201TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1202 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1203
Matt Menkec6b3edf72019-03-19 17:00:391204 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1205 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1206 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531207
1208 // Create one asynchronous request.
1209 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391210 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1211 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531212
[email protected]6b175382009-10-13 06:47:471213 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1214 // actually become pending until 2ms after they have been created. In order
1215 // to flush all tasks, we need to wait so that we know there are no
1216 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451217 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471218
[email protected]211d21722009-07-22 15:48:531219 // The next synchronous request should wait for its turn.
1220 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391221 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1222 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531223
[email protected]2431756e2010-09-29 20:26:131224 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531225
[email protected]2431756e2010-09-29 20:26:131226 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531227 client_socket_factory_.allocation_count());
1228
1229 EXPECT_EQ(1, GetOrderOfRequest(1));
1230 EXPECT_EQ(2, GetOrderOfRequest(2));
1231 EXPECT_EQ(3, GetOrderOfRequest(3));
1232 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171233 EXPECT_EQ(5, GetOrderOfRequest(5));
1234
1235 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131236 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531237}
1238
[email protected]6427fe22010-04-16 22:27:411239TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1240 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1241 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1242
Matt Menkec6b3edf72019-03-19 17:00:391243 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1244 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1245 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1246 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411247
1248 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1249
1250 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1251
Matt Menkec6b3edf72019-03-19 17:00:391252 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1253 IsError(ERR_IO_PENDING));
1254 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1255 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411256
1257 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1258
[email protected]2431756e2010-09-29 20:26:131259 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411260 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131261 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411262 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131263 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1264 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411265 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1266}
1267
[email protected]d7027bb2010-05-10 18:58:541268TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1269 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1270 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1271
1272 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521273 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501274 EXPECT_EQ(
1275 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521276 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281277 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1278 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1279 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541280
1281 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241282 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521283 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501284 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391285 handles[i].Init(
Anton Bikineev068d2912021-05-15 20:43:521286 TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281287 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1288 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1289 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541290 }
1291
1292 // One will be stalled, cancel all the handles now.
1293 // This should hit the OnAvailableSocketSlot() code where we previously had
1294 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241295 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541296 handles[i].Reset();
1297}
1298
[email protected]eb5a99382010-07-11 03:18:261299TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541300 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1301 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1302
[email protected]eb5a99382010-07-11 03:18:261303 {
1304 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521305 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261306 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Eric Ortha2e7773212021-06-22 21:49:551307 EXPECT_EQ(OK, handles[i].Init(TestGroupId("a" + base::NumberToString(i)),
1308 params_, absl::nullopt, DEFAULT_PRIORITY,
1309 SocketTag(),
1310 ClientSocketPool::RespectLimits::ENABLED,
1311 callbacks[i].callback(),
1312 ClientSocketPool::ProxyAuthCallback(),
1313 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261314 }
1315
1316 // Force a stalled group.
1317 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521318 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201319 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391320 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521321 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281322 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1323 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1324 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261325
1326 // Cancel the stalled request.
1327 stalled_handle.Reset();
1328
1329 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1330 EXPECT_EQ(0, pool_->IdleSocketCount());
1331
1332 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541333 }
1334
[email protected]43a21b82010-06-10 21:30:541335 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1336 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261337}
[email protected]43a21b82010-06-10 21:30:541338
[email protected]eb5a99382010-07-11 03:18:261339TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1340 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1341 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1342
1343 {
1344 ClientSocketHandle handles[kDefaultMaxSockets];
1345 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521346 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201347 EXPECT_EQ(ERR_IO_PENDING,
Eric Ortha2e7773212021-06-22 21:49:551348 handles[i].Init(
1349 TestGroupId("a" + base::NumberToString(i)), params_,
1350 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1351 ClientSocketPool::RespectLimits::ENABLED,
1352 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1353 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261354 }
1355
1356 // Force a stalled group.
1357 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1358 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521359 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201360 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391361 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521362 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281363 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1364 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1365 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261366
1367 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261368 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1369 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1370 TestGroupId("foo")));
1371 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1372 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261373
1374 // Cancel the stalled request.
1375 handles[0].Reset();
1376
[email protected]eb5a99382010-07-11 03:18:261377 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261378 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1379 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1380 TestGroupId("foo")));
1381 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1382 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261383
1384 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011385 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261386
1387 EXPECT_EQ(kDefaultMaxSockets + 1,
1388 client_socket_factory_.allocation_count());
1389 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261390 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1391 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1392 TestGroupId("foo")));
1393 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1394 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261395
1396 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541397 }
1398
[email protected]eb5a99382010-07-11 03:18:261399 EXPECT_EQ(1, pool_->IdleSocketCount());
1400}
[email protected]43a21b82010-06-10 21:30:541401
[email protected]eb5a99382010-07-11 03:18:261402TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1403 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1404 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541405
[email protected]eb5a99382010-07-11 03:18:261406 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521407 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261408 {
[email protected]51fdc7c2012-04-10 19:19:481409 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261410 ClientSocketHandle handles[kDefaultMaxSockets];
1411 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521412 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391413 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281414 OK, handles[i].Init(
Eric Ortha2e7773212021-06-22 21:49:551415 TestGroupId(base::StringPrintf("take-2-%d", i)), params_,
Anton Bikineev068d2912021-05-15 20:43:521416 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:281417 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1418 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1419 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261420 }
1421
1422 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1423 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481424 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261425
1426 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201427 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391428 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521429 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281430 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1431 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1432 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481433 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261434
1435 // Dropping out of scope will close all handles and return them to idle.
1436 }
[email protected]43a21b82010-06-10 21:30:541437
1438 // But if we wait for it, the released idle sockets will be closed in
1439 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011440 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261441
1442 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1443 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541444}
1445
1446// Regression test for http://crbug.com/40952.
1447TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261448 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1449 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541450 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1451
1452 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1453 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521454 TestCompletionCallback callback;
Eric Ortha2e7773212021-06-22 21:49:551455 EXPECT_EQ(
1456 OK,
1457 handle.Init(TestGroupId("a" + base::NumberToString(i)), params_,
1458 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1459 ClientSocketPool::RespectLimits::ENABLED,
1460 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1461 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541462 }
1463
1464 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281465 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541466
1467 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1468 // reuse a socket.
1469 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1470 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521471 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541472
Eric Ortha2e7773212021-06-22 21:49:551473 // "a0" is special here, since it should be the first entry in the sorted map,
[email protected]43a21b82010-06-10 21:30:541474 // which is the one which we would close an idle socket for. We shouldn't
1475 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391476 EXPECT_EQ(OK, handle.Init(
Eric Ortha2e7773212021-06-22 21:49:551477 TestGroupId("a0"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281478 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391479 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1480 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541481
1482 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1483 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1484}
1485
[email protected]ab838892009-06-30 18:49:051486TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531487 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091488
Matt Menkec6b3edf72019-03-19 17:00:391489 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1490 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1491 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1492 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1493 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1494 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1495 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1496 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091497
[email protected]2431756e2010-09-29 20:26:131498 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201499 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1500 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131501 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1502 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091503
[email protected]c9d6a1d2009-07-14 16:15:201504 EXPECT_EQ(1, GetOrderOfRequest(1));
1505 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031506 EXPECT_EQ(8, GetOrderOfRequest(3));
1507 EXPECT_EQ(6, GetOrderOfRequest(4));
1508 EXPECT_EQ(4, GetOrderOfRequest(5));
1509 EXPECT_EQ(3, GetOrderOfRequest(6));
1510 EXPECT_EQ(5, GetOrderOfRequest(7));
1511 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171512
1513 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131514 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091515}
1516
[email protected]ab838892009-06-30 18:49:051517TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531518 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091519
Matt Menkec6b3edf72019-03-19 17:00:391520 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1521 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1522 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1523 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1524 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1525 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1526 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091527
[email protected]2431756e2010-09-29 20:26:131528 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091529
[email protected]2431756e2010-09-29 20:26:131530 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011531 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201532
[email protected]2431756e2010-09-29 20:26:131533 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201534 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131535 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1536 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091537}
1538
Matt Menke7eb405e2019-04-25 20:48:211539TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1540 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1541
1542 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1543 ClientSocketHandle handle;
1544 TestCompletionCallback callback;
1545 EXPECT_EQ(
1546 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521547 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke7eb405e2019-04-25 20:48:211548 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1549 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1550 pool_.get(), NetLogWithSource()));
1551
1552 EXPECT_THAT(callback.WaitForResult(), IsOk());
1553 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1554 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1555 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1556 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1557
1558 handle.ResetAndCloseSocket();
1559 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1560}
1561
Matt Menke99251ea42019-04-25 22:59:021562// This test will start up a socket request and then call Reset() on the handle.
1563// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211564TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531565 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201566
[email protected]ab838892009-06-30 18:49:051567 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131568 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521569 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501570 EXPECT_EQ(
1571 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521572 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281573 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1574 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1575 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131576 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211577 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1578 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1579}
1580
Matt Menke99251ea42019-04-25 22:59:021581// This test will start up a socket request and then call ResetAndCloseSocket()
1582// on the handle. The pending ConnectJob or connected socket should be
1583// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211584TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1585 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1586
Matt Menke99251ea42019-04-25 22:59:021587 // When true, the socket connects before it's canceled.
1588 for (bool cancel_when_callback_pending : {false, true}) {
1589 if (cancel_when_callback_pending) {
1590 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1591 } else {
1592 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1593 }
1594 ClientSocketHandle handle;
1595 TestCompletionCallback callback;
1596 EXPECT_EQ(
1597 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521598 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021599 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1600 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1601 pool_.get(), NetLogWithSource()));
1602 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1603 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1604
1605 if (cancel_when_callback_pending) {
1606 client_socket_factory_.SignalJobs();
1607 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1608 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1609 }
1610
1611 handle.ResetAndCloseSocket();
1612 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1613 }
Matt Menke7eb405e2019-04-25 20:48:211614}
1615
1616TEST_F(ClientSocketPoolBaseTest,
1617 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1618 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1619
Matt Menke99251ea42019-04-25 22:59:021620 // When true, the sockets connect before they're canceled.
1621 for (bool cancel_when_callback_pending : {false, true}) {
1622 if (cancel_when_callback_pending) {
1623 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1624 } else {
1625 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1626 }
Matt Menke7eb405e2019-04-25 20:48:211627
Matt Menke99251ea42019-04-25 22:59:021628 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1629 TestCompletionCallback callback;
1630 // Make |kDefaultMaxSockets + 1| socket requests.
1631 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1632 std::unique_ptr<ClientSocketHandle> handle =
1633 std::make_unique<ClientSocketHandle>();
1634 EXPECT_EQ(ERR_IO_PENDING,
1635 handle->Init(
Anton Bikineev068d2912021-05-15 20:43:521636 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021637 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1638 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1639 pool_.get(), NetLogWithSource()));
1640 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211641 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021642 EXPECT_EQ(
1643 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1644 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1645 }
1646
1647 if (cancel_when_callback_pending) {
1648 client_socket_factory_.SignalJobs();
1649 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1650 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1651 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1652 }
1653
1654 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1655 // or close a socket, since there are more requests than ConnectJobs or
1656 // sockets.
1657 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1658 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1659 if (cancel_when_callback_pending) {
1660 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1661 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1662 } else {
1663 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211664 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1665 }
Matt Menke99251ea42019-04-25 22:59:021666
1667 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1668 // or close a socket.
1669 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1670 handles[i]->ResetAndCloseSocket();
1671 if (i > 0) {
1672 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1673 if (cancel_when_callback_pending) {
1674 EXPECT_EQ(i,
1675 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1676 } else {
1677 EXPECT_EQ(static_cast<size_t>(i),
1678 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1679 }
1680 } else {
1681 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1682 }
1683 }
Matt Menke7eb405e2019-04-25 20:48:211684 }
[email protected]f6d1d6eb2009-06-24 20:16:091685}
1686
[email protected]ab838892009-06-30 18:49:051687TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531688 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201689
[email protected]ab838892009-06-30 18:49:051690 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061691 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521692 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091693
Matt Menke28ac03e2019-02-25 22:25:501694 EXPECT_EQ(
1695 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521696 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281697 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1698 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1699 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091700
1701 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211702 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1703 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091704
Matt Menke7eb405e2019-04-25 20:48:211705 // This will create a second ConnectJob, since the other ConnectJob was
1706 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521707 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501708 EXPECT_EQ(
1709 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521710 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281711 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501712 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1713 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091714
Matt Menke7eb405e2019-04-25 20:48:211715 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1716 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1717
robpercival214763f2016-07-01 23:27:011718 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091719 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211720 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1721 // One ConnectJob completed, and its socket is now assigned to |handle|.
1722 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1723 // The other ConnectJob should have either completed, or still be connecting.
1724 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1725 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091726
1727 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211728 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1729 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1730 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1731 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091732}
1733
[email protected]ab838892009-06-30 18:49:051734TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531735 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091736
Matt Menkec6b3edf72019-03-19 17:00:391737 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1738 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1739 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1740 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1741 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1742 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1743 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091744
1745 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201746 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131747 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1748 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091749
[email protected]2431756e2010-09-29 20:26:131750 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091751
[email protected]c9d6a1d2009-07-14 16:15:201752 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1753 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131754 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1755 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091756
[email protected]c9d6a1d2009-07-14 16:15:201757 EXPECT_EQ(1, GetOrderOfRequest(1));
1758 EXPECT_EQ(2, GetOrderOfRequest(2));
1759 EXPECT_EQ(5, GetOrderOfRequest(3));
1760 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131761 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1762 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201763 EXPECT_EQ(4, GetOrderOfRequest(6));
1764 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171765
1766 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131767 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091768}
1769
mmenke33d24423d2015-05-19 19:41:091770// Function to be used as a callback on socket request completion. It first
1771// disconnects the successfully connected socket from the first request, and
1772// then reuses the ClientSocketHandle to request another socket.
1773//
1774// |nested_callback| is called with the result of the second socket request.
1775void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261776 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091777 TestConnectJobFactory* test_connect_job_factory,
1778 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411779 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091780 int first_request_result) {
robpercival214763f2016-07-01 23:27:011781 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091782
1783 test_connect_job_factory->set_job_type(next_job_type);
1784
1785 // Don't allow reuse of the socket. Disconnect it and then release it.
1786 if (handle->socket())
1787 handle->socket()->Disconnect();
1788 handle->Reset();
1789
mmenke33d24423d2015-05-19 19:41:091790 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501791 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031792 TestGroupId("a"),
Anton Bikineev068d2912021-05-15 20:43:521793 ClientSocketPool::SocketParams::CreateForHttpForTesting(), absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:281794 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031795 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1796 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091797 if (rv != ERR_IO_PENDING) {
1798 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411799 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091800 } else {
1801 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521802 }
mmenke33d24423d2015-05-19 19:41:091803}
[email protected]f6d1d6eb2009-06-24 20:16:091804
mmenke33d24423d2015-05-19 19:41:091805// Tests the case where a second socket is requested in a completion callback,
1806// and the second socket connects asynchronously. Reuses the same
1807// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581808TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531809 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201810
[email protected]0b7648c2009-07-06 20:14:011811 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061812 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091813 TestCompletionCallback second_result_callback;
1814 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521815 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541816 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501817 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1818 connect_job_factory_, TestConnectJob::kMockPendingJob,
1819 &second_result_callback),
1820 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011821 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091822
robpercival214763f2016-07-01 23:27:011823 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581824}
[email protected]f6d1d6eb2009-06-24 20:16:091825
mmenke33d24423d2015-05-19 19:41:091826// Tests the case where a second socket is requested in a completion callback,
1827// and the second socket connects synchronously. Reuses the same
1828// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581829TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531830 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201831
[email protected]0b7648c2009-07-06 20:14:011832 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061833 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091834 TestCompletionCallback second_result_callback;
1835 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521836 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541837 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501838 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1839 connect_job_factory_, TestConnectJob::kMockPendingJob,
1840 &second_result_callback),
1841 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011842 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581843
robpercival214763f2016-07-01 23:27:011844 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091845}
1846
1847// Make sure that pending requests get serviced after active requests get
1848// cancelled.
[email protected]ab838892009-06-30 18:49:051849TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531850 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201851
[email protected]0b7648c2009-07-06 20:14:011852 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091853
Matt Menkec6b3edf72019-03-19 17:00:391854 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1855 IsError(ERR_IO_PENDING));
1856 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1857 IsError(ERR_IO_PENDING));
1858 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1859 IsError(ERR_IO_PENDING));
1860 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1861 IsError(ERR_IO_PENDING));
1862 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1863 IsError(ERR_IO_PENDING));
1864 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));
[email protected]f6d1d6eb2009-06-24 20:16:091868
[email protected]c9d6a1d2009-07-14 16:15:201869 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1870 // Let's cancel them.
1871 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131872 ASSERT_FALSE(request(i)->handle()->is_initialized());
1873 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091874 }
1875
[email protected]f6d1d6eb2009-06-24 20:16:091876 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131877 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011878 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131879 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091880 }
1881
[email protected]2431756e2010-09-29 20:26:131882 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1883 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091884}
1885
1886// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051887TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531888 const size_t kMaxSockets = 5;
1889 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201890
[email protected]0b7648c2009-07-06 20:14:011891 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091892
[email protected]211d21722009-07-22 15:48:531893 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1894 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091895
1896 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531897 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391898 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1899 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091900
[email protected]211d21722009-07-22 15:48:531901 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011902 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091903}
1904
mmenke9d72fe42017-05-18 22:36:071905// Make sure that pending requests that complete synchronously get serviced
1906// after active requests fail. See https://crbug.com/723748
1907TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1908 const size_t kNumberOfRequests = 10;
1909 const size_t kMaxSockets = 1;
1910 CreatePool(kMaxSockets, kMaxSockets);
1911
1912 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1913
Matt Menkec6b3edf72019-03-19 17:00:391914 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1915 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071916
1917 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1918
1919 // Queue up all the other requests
1920 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391921 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1922 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071923
1924 // Make sure all requests fail, instead of hanging.
1925 for (size_t i = 0; i < kNumberOfRequests; ++i)
1926 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1927}
1928
[email protected]5fc08e32009-07-15 17:09:571929TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531930 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571931
1932 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1933
[email protected]2431756e2010-09-29 20:26:131934 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521935 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501936 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521937 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501938 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1939 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011940 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571941
1942 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131943 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571944
Anton Bikineev068d2912021-05-15 20:43:521945 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281946 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501947 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1948 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011949 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1950 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571951
[email protected]2431756e2010-09-29 20:26:131952 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481953 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571954 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1955}
1956
xunjieli26619e72016-11-23 19:39:551957TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
Matt Menke433de6d2020-03-04 00:24:111958 const char kReason[] = "Really nifty reason";
1959
xunjieli26619e72016-11-23 19:39:551960 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1961 ClientSocketHandle handle;
1962 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141963 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501964 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521965 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501966 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1967 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551968 EXPECT_THAT(rv, IsOk());
Matt Menke433de6d2020-03-04 00:24:111969 ASSERT_TRUE(handle.socket());
1970 NetLogSource source = handle.socket()->NetLog().source();
xunjieli26619e72016-11-23 19:39:551971 handle.Reset();
1972 EXPECT_EQ(1, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111973 pool_->CloseIdleSockets(kReason);
1974 ExpectSocketClosedWithReason(source, kReason);
xunjieli26619e72016-11-23 19:39:551975}
1976
xunjieli92feb332017-03-03 17:19:231977TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231978 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1979 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141980 RecordingBoundTestNetLog log;
xunjieli92feb332017-03-03 17:19:231981 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501982 int rv = handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:521983 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501984 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1985 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231986 EXPECT_THAT(rv, IsOk());
1987 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:521988 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281989 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501990 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1991 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231992 ClientSocketHandle handle3;
Anton Bikineev068d2912021-05-15 20:43:521993 rv = handle3.Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281994 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501995 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1996 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231997 EXPECT_THAT(rv, IsOk());
1998 handle1.Reset();
1999 handle2.Reset();
2000 handle3.Reset();
2001 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:112002 pool_->CloseIdleSocketsInGroup(TestGroupId("a"), "Very good reason");
xunjieli92feb332017-03-03 17:19:232003 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:232004}
2005
xunjieli26619e72016-11-23 19:39:552006TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:552007 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2008 ClientSocketHandle handle;
2009 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142010 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502011 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522012 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502013 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2014 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:552015 EXPECT_THAT(rv, IsOk());
2016 StreamSocket* socket = handle.socket();
Matt Menke433de6d2020-03-04 00:24:112017 ASSERT_TRUE(socket);
xunjieli26619e72016-11-23 19:39:552018 handle.Reset();
2019 EXPECT_EQ(1, pool_->IdleSocketCount());
2020
2021 // Disconnect socket now to make the socket unusable.
Matt Menke433de6d2020-03-04 00:24:112022 NetLogSource source = socket->NetLog().source();
xunjieli26619e72016-11-23 19:39:552023 socket->Disconnect();
2024 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:522025 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282026 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502027 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2028 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:552029 EXPECT_THAT(rv, IsOk());
2030 EXPECT_FALSE(handle2.is_reused());
Matt Menke433de6d2020-03-04 00:24:112031
2032 // This is admittedly not an accurate error in this case, but normally code
2033 // doesn't secretly keep a raw pointers to sockets returned to the socket pool
2034 // and close them out of band, so discovering an idle socket was closed when
2035 // trying to reuse it normally means it was closed by the remote side.
2036 ExpectSocketClosedWithReason(
2037 source, TransportClientSocketPool::kRemoteSideClosedConnection);
xunjieli26619e72016-11-23 19:39:552038}
2039
[email protected]2b7523d2009-07-29 20:29:232040// Regression test for http://crbug.com/17985.
2041TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
2042 const int kMaxSockets = 3;
2043 const int kMaxSocketsPerGroup = 2;
2044 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
2045
[email protected]ac790b42009-12-02 04:31:312046 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:232047
Matt Menkec6b3edf72019-03-19 17:00:392048 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2049 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232050
2051 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:392052 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2053 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232054
2055 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:392056 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232057
2058 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:392059 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2060 IsError(ERR_IO_PENDING));
2061 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2062 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232063
Matt Menkec6b3edf72019-03-19 17:00:392064 // Release the first two sockets from TestGroupId("a"). Because this is a
2065 // keepalive, the first release will unblock the pending request for
2066 // TestGroupId("a"). The second release will unblock a request for "c",
2067 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:132068 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
2069 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:232070
2071 // Closing idle sockets should not get us into trouble, but in the bug
2072 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:392073 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke433de6d2020-03-04 00:24:112074 pool_->CloseIdleSockets("Very good reason");
[email protected]eb5a99382010-07-11 03:18:262075
[email protected]2da659e2013-05-23 20:51:342076 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282077 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232078}
2079
[email protected]4d3b05d2010-01-27 21:27:292080TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532081 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572082
2083 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132084 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522085 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142086 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502087 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522088 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502089 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2090 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012091 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392092 EXPECT_EQ(LOAD_STATE_CONNECTING,
2093 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482094 TestLoadTimingInfoNotConnected(handle);
2095
robpercival214763f2016-07-01 23:27:012096 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132097 EXPECT_TRUE(handle.is_initialized());
2098 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482099 TestLoadTimingInfoConnectedNotReused(handle);
2100
[email protected]2431756e2010-09-29 20:26:132101 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482102 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302103
Eric Roman79cc7552019-07-19 02:17:542104 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402105
Matt Menke9fa17d52019-03-25 19:12:262106 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172107 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262108 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002109 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262110 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2111 EXPECT_TRUE(LogContainsEvent(
2112 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2113 NetLogEventPhase::NONE));
2114 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002115 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2116 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262117 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572118}
2119
[email protected]4d3b05d2010-01-27 21:27:292120TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572121 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532122 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572123
2124 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132125 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522126 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142127 RecordingBoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:182128 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132129 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512130 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502131 EXPECT_EQ(
2132 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522133 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282134 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2135 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2136 pool_.get(), log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:392137 EXPECT_EQ(LOAD_STATE_CONNECTING,
2138 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012139 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132140 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512141 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302142
Eric Roman79cc7552019-07-19 02:17:542143 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402144
Matt Menke9fa17d52019-03-25 19:12:262145 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172146 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262147 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002148 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262149 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2150 EXPECT_TRUE(LogContainsEvent(
2151 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2152 NetLogEventPhase::NONE));
2153 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572154}
2155
mmenke6be122f2015-03-09 22:22:472156// Check that an async ConnectJob failure does not result in creation of a new
2157// ConnectJob when there's another pending request also waiting on its own
2158// ConnectJob. See http://crbug.com/463960.
2159TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2160 CreatePool(2, 2);
2161 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2162
Matt Menkec6b3edf72019-03-19 17:00:392163 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2164 IsError(ERR_IO_PENDING));
2165 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2166 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472167
robpercival214763f2016-07-01 23:27:012168 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2169 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472170
2171 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2172}
2173
[email protected]4d3b05d2010-01-27 21:27:292174TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102175 // TODO(eroman): Add back the log expectations! Removed them because the
2176 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532177 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572178
2179 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132180 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522181 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132182 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522183 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572184
Matt Menke28ac03e2019-02-25 22:25:502185 EXPECT_EQ(
2186 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522187 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282188 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2189 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2190 pool_.get(), NetLogWithSource()));
Matt Muellerd9342e3a2019-11-26 01:41:142191 RecordingBoundTestNetLog log2;
tfarina428341112016-09-22 13:38:202192 EXPECT_EQ(
2193 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522194 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282195 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502196 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2197 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572198
[email protected]2431756e2010-09-29 20:26:132199 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572200
[email protected]fd7b7c92009-08-20 19:38:302201
2202 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302203
robpercival214763f2016-07-01 23:27:012204 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132205 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302206
2207 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532208 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572209}
2210
[email protected]4d3b05d2010-01-27 21:27:292211TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342212 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2213
[email protected]17a0c6c2009-08-04 00:07:042214 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2215
Matt Menkec6b3edf72019-03-19 17:00:392216 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2217 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2218 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2219 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342220
Raul Tambre8335a6d2019-02-21 16:57:432221 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262222 static_cast<int>(
2223 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132224 (*requests())[2]->handle()->Reset();
2225 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432226 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262227 static_cast<int>(
2228 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342229
[email protected]2431756e2010-09-29 20:26:132230 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432231 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262232 static_cast<int>(
2233 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342234
[email protected]2431756e2010-09-29 20:26:132235 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432236 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262237 static_cast<int>(
2238 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342239}
2240
[email protected]5fc08e32009-07-15 17:09:572241// When requests and ConnectJobs are not coupled, the request will get serviced
2242// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292243TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532244 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572245
2246 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322247 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572248
[email protected]2431756e2010-09-29 20:26:132249 std::vector<TestSocketRequest*> request_order;
2250 size_t completion_count; // unused
2251 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502252 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522253 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502254 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2255 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012256 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2257 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572258
2259 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2260 // without a job.
2261 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2262
[email protected]2431756e2010-09-29 20:26:132263 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502264 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522265 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502266 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2267 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012268 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132269 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502270 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522271 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502272 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2273 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012274 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572275
2276 // Both Requests 2 and 3 are pending. We release socket 1 which should
2277 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332278 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342279 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282280 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332281 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012282 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332283 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572284
2285 // Signal job 2, which should service request 3.
2286
2287 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012288 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572289
Raul Tambre8335a6d2019-02-21 16:57:432290 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132291 EXPECT_EQ(&req1, request_order[0]);
2292 EXPECT_EQ(&req2, request_order[1]);
2293 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392294 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572295}
2296
2297// The requests are not coupled to the jobs. So, the requests should finish in
2298// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292299TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532300 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572301 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322302 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572303
[email protected]2431756e2010-09-29 20:26:132304 std::vector<TestSocketRequest*> request_order;
2305 size_t completion_count; // unused
2306 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502307 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522308 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502309 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2310 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012311 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572312
[email protected]2431756e2010-09-29 20:26:132313 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502314 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522315 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502316 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2317 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012318 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572319
2320 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322321 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572322
[email protected]2431756e2010-09-29 20:26:132323 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502324 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522325 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502326 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2327 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012328 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572329
robpercival214763f2016-07-01 23:27:012330 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2331 EXPECT_THAT(req2.WaitForResult(), IsOk());
2332 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572333
Raul Tambre8335a6d2019-02-21 16:57:432334 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132335 EXPECT_EQ(&req1, request_order[0]);
2336 EXPECT_EQ(&req2, request_order[1]);
2337 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572338}
2339
[email protected]03b7c8c2013-07-20 04:38:552340// Test GetLoadState in the case there's only one socket request.
2341TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532342 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552343 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572344
[email protected]2431756e2010-09-29 20:26:132345 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522346 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502347 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522348 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502349 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2350 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012351 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552352 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572353
[email protected]03b7c8c2013-07-20 04:38:552354 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2355 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2356
2357 // No point in completing the connection, since ClientSocketHandles only
2358 // expect the LoadState to be checked while connecting.
2359}
2360
2361// Test GetLoadState in the case there are two socket requests.
2362TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2363 CreatePool(2, 2);
2364 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2365
2366 ClientSocketHandle handle;
2367 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502368 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522369 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502370 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2371 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012372 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002373 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2374
2375 ClientSocketHandle handle2;
2376 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522377 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282378 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502379 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2380 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012381 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002382 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2383
Matt Menke4b69f932019-03-04 16:20:012384 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002385 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2386 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2387
Matt Menke4b69f932019-03-04 16:20:012388 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002389 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2390
Matt Menke4b69f932019-03-04 16:20:012391 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002392 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002393 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012394
2395 // Update the state of the second job.
2396 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2397
2398 // Only the state of the second request should have changed.
2399 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2400 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2401
2402 // Second job connects and the first request gets the socket. The
2403 // second handle switches to the state of the remaining ConnectJob.
2404 client_socket_factory_.SignalJob(1);
2405 EXPECT_THAT(callback.WaitForResult(), IsOk());
2406 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552407}
2408
2409// Test GetLoadState in the case the per-group limit is reached.
2410TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2411 CreatePool(2, 1);
2412 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2413
2414 ClientSocketHandle handle;
2415 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502416 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522417 TestGroupId("a"), params_, absl::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502418 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2419 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012420 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552421 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2422
2423 // Request another socket from the same pool, buth with a higher priority.
2424 // The first request should now be stalled at the socket group limit.
2425 ClientSocketHandle handle2;
2426 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522427 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:282428 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502429 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2430 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012431 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552432 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2433 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2434
2435 // The first handle should remain stalled as the other socket goes through
2436 // the connect process.
2437
2438 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2439 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2440 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2441
2442 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012443 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552444 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2445
2446 // Closing the second socket should cause the stalled handle to finally get a
2447 // ConnectJob.
2448 handle2.socket()->Disconnect();
2449 handle2.Reset();
2450 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2451}
2452
2453// Test GetLoadState in the case the per-pool limit is reached.
2454TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2455 CreatePool(2, 2);
2456 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2457
2458 ClientSocketHandle handle;
2459 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502460 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522461 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502462 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2463 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012464 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552465
2466 // Request for socket from another pool.
2467 ClientSocketHandle handle2;
2468 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522469 rv = handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282470 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502471 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2472 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012473 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552474
2475 // Request another socket from the first pool. Request should stall at the
2476 // socket pool limit.
2477 ClientSocketHandle handle3;
2478 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522479 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282480 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502481 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2482 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012483 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552484
2485 // The third handle should remain stalled as the other sockets in its group
2486 // goes through the connect process.
2487
2488 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2489 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2490
2491 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2492 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2493 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2494
2495 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012496 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552497 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2498
2499 // Closing a socket should allow the stalled handle to finally get a new
2500 // ConnectJob.
2501 handle.socket()->Disconnect();
2502 handle.Reset();
2503 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572504}
2505
Matt Menkeb57663b32019-03-01 17:17:102506TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132507 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102508 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132509
[email protected]2431756e2010-09-29 20:26:132510 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522511 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502512 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102513 ERR_CERT_COMMON_NAME_INVALID,
Anton Bikineev068d2912021-05-15 20:43:522514 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282515 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2516 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2517 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132518 EXPECT_TRUE(handle.is_initialized());
2519 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132520}
2521
Matt Menkeb57663b32019-03-01 17:17:102522TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132523 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2524
Matt Menkeb57663b32019-03-01 17:17:102525 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[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(
2529 ERR_IO_PENDING,
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()));
Matt Menkec6b3edf72019-03-19 17:00:392534 EXPECT_EQ(LOAD_STATE_CONNECTING,
2535 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102536 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132537 EXPECT_TRUE(handle.is_initialized());
2538 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132539}
2540
[email protected]e60e47a2010-07-14 03:37:182541TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2542 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2543 connect_job_factory_->set_job_type(
2544 TestConnectJob::kMockAdditionalErrorStateJob);
2545
[email protected]2431756e2010-09-29 20:26:132546 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522547 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502548 EXPECT_EQ(
2549 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:522550 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282551 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2552 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2553 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132554 EXPECT_FALSE(handle.is_initialized());
2555 EXPECT_FALSE(handle.socket());
2556 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512557 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182558}
2559
2560TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2561 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2562
2563 connect_job_factory_->set_job_type(
2564 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132565 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522566 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502567 EXPECT_EQ(
2568 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522569 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282570 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2571 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2572 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392573 EXPECT_EQ(LOAD_STATE_CONNECTING,
2574 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012575 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132576 EXPECT_FALSE(handle.is_initialized());
2577 EXPECT_FALSE(handle.socket());
2578 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512579 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182580}
2581
martijn003cd612016-05-19 22:24:382582// Make sure we can reuse sockets.
2583TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412584 CreatePoolWithIdleTimeouts(
2585 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032586 base::TimeDelta(), // Time out unused sockets immediately.
2587 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2588
2589 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2590
2591 ClientSocketHandle handle;
2592 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502593 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522594 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502595 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2596 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012597 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392598 EXPECT_EQ(LOAD_STATE_CONNECTING,
2599 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012600 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032601
2602 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352603 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382604 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482605 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032606 handle.Reset();
2607
2608 // Should now have one idle socket.
2609 ASSERT_EQ(1, pool_->IdleSocketCount());
2610
2611 // Request a new socket. This should reuse the old socket and complete
2612 // synchronously.
Matt Muellerd9342e3a2019-11-26 01:41:142613 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502614 rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522615 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502616 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2617 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012618 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032619 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482620 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032621
Matt Menke9fa17d52019-03-25 19:12:262622 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392623 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262624 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032625
Eric Roman79cc7552019-07-19 02:17:542626 auto entries = log.GetEntries();
Matt Menke9fa17d52019-03-25 19:12:262627 EXPECT_TRUE(LogContainsEvent(
2628 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2629 NetLogEventPhase::NONE));
2630 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032631 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262632 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032633}
2634
martijn003cd612016-05-19 22:24:382635// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172636TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032637 CreatePoolWithIdleTimeouts(
2638 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2639 base::TimeDelta(), // Time out unused sockets immediately
2640 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412641
2642 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2643
2644 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2645
2646 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522647 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502648 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522649 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502650 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2651 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012652 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392653 EXPECT_EQ(LOAD_STATE_CONNECTING,
2654 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412655
2656 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522657 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522658 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282659 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502660 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2661 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012662 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392663 EXPECT_EQ(LOAD_STATE_CONNECTING,
2664 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412665
2666 // Cancel one of the requests. Wait for the other, which will get the first
2667 // job. Release the socket. Run the loop again to make sure the second
2668 // socket is sitting idle and the first one is released (since ReleaseSocket()
2669 // just posts a DoReleaseSocket() task).
2670
2671 handle.Reset();
robpercival214763f2016-07-01 23:27:012672 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menke433de6d2020-03-04 00:24:112673 // Get the NetLogSource for the socket, so the time out reason can be checked
2674 // at the end of the test.
2675 NetLogSource net_log_source2 = handle2.socket()->NetLog().source();
[email protected]64770b7d2011-11-16 04:30:412676 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352677 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382678 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412679 handle2.Reset();
2680
[email protected]e7b1c6d2c2012-05-05 00:54:032681 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2682 // actually become pending until 2ms after they have been created. In order
2683 // to flush all tasks, we need to wait so that we know there are no
2684 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452685 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412686
[email protected]e7b1c6d2c2012-05-05 00:54:032687 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412688 ASSERT_EQ(2, pool_->IdleSocketCount());
2689
2690 // Request a new socket. This should cleanup the unused and timed out ones.
2691 // A new socket will be created rather than reusing the idle one.
Matt Muellerd9342e3a2019-11-26 01:41:142692 RecordingBoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522693 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522694 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282695 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502696 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2697 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012698 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2699 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412700 EXPECT_FALSE(handle.is_reused());
2701
[email protected]e7b1c6d2c2012-05-05 00:54:032702 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262703 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392704 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262705 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412706
Eric Roman79cc7552019-07-19 02:17:542707 auto entries = log.GetEntries();
[email protected]64770b7d2011-11-16 04:30:412708 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002709 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
Matt Menke433de6d2020-03-04 00:24:112710 ExpectSocketClosedWithReason(
2711 net_log_source2, TransportClientSocketPool::kIdleTimeLimitExpired);
[email protected]64770b7d2011-11-16 04:30:412712}
2713
[email protected]2041cf342010-02-19 03:15:592714// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162715// because of multiple releasing disconnected sockets.
2716TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2717 CreatePoolWithIdleTimeouts(
2718 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2719 base::TimeDelta(), // Time out unused sockets immediately.
2720 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2721
2722 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2723
2724 // Startup 4 connect jobs. Two of them will be pending.
2725
[email protected]2431756e2010-09-29 20:26:132726 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522727 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502728 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522729 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502730 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2731 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012732 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162733
[email protected]2431756e2010-09-29 20:26:132734 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522735 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522736 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282737 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502738 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2739 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012740 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162741
[email protected]2431756e2010-09-29 20:26:132742 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522743 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522744 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282745 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502746 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2747 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012748 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162749
[email protected]2431756e2010-09-29 20:26:132750 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522751 TestCompletionCallback callback4;
Anton Bikineev068d2912021-05-15 20:43:522752 rv = handle4.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282753 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502754 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2755 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012756 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162757
2758 // Release two disconnected sockets.
2759
[email protected]2431756e2010-09-29 20:26:132760 handle.socket()->Disconnect();
2761 handle.Reset();
2762 handle2.socket()->Disconnect();
2763 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162764
robpercival214763f2016-07-01 23:27:012765 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132766 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012767 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132768 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162769}
2770
[email protected]d7027bb2010-05-10 18:58:542771// Regression test for http://crbug.com/42267.
2772// When DoReleaseSocket() is processed for one socket, it is blocked because the
2773// other stalled groups all have releasing sockets, so no progress can be made.
2774TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2775 CreatePoolWithIdleTimeouts(
2776 4 /* socket limit */, 4 /* socket limit per group */,
2777 base::TimeDelta(), // Time out unused sockets immediately.
2778 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2779
2780 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2781
2782 // Max out the socket limit with 2 per group.
2783
[email protected]2431756e2010-09-29 20:26:132784 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522785 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132786 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522787 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542788
2789 for (int i = 0; i < 2; ++i) {
Anton Bikineev068d2912021-05-15 20:43:522790 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282791 LOWEST, SocketTag(),
2792 ClientSocketPool::RespectLimits::ENABLED,
2793 callback_a[i].callback(),
2794 ClientSocketPool::ProxyAuthCallback(),
2795 pool_.get(), NetLogWithSource()));
Anton Bikineev068d2912021-05-15 20:43:522796 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282797 LOWEST, SocketTag(),
2798 ClientSocketPool::RespectLimits::ENABLED,
2799 callback_b[i].callback(),
2800 ClientSocketPool::ProxyAuthCallback(),
2801 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542802 }
[email protected]b89f7e42010-05-20 20:37:002803
[email protected]d7027bb2010-05-10 18:58:542804 // Make 4 pending requests, 2 per group.
2805
2806 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282807 EXPECT_EQ(
2808 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522809 handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282810 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2811 callback_a[i].callback(),
2812 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2813 NetLogWithSource()));
2814 EXPECT_EQ(
2815 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522816 handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282817 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2818 callback_b[i].callback(),
2819 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2820 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542821 }
2822
2823 // Release b's socket first. The order is important, because in
2824 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2825 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2826 // first, which has a releasing socket, so it refuses to start up another
2827 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132828 handle_b[0].socket()->Disconnect();
2829 handle_b[0].Reset();
2830 handle_a[0].socket()->Disconnect();
2831 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542832
2833 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282834 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542835
[email protected]2431756e2010-09-29 20:26:132836 handle_b[1].socket()->Disconnect();
2837 handle_b[1].Reset();
2838 handle_a[1].socket()->Disconnect();
2839 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542840
2841 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012842 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2843 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542844 }
2845}
2846
[email protected]fd4fe0b2010-02-08 23:02:152847TEST_F(ClientSocketPoolBaseTest,
2848 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2849 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2850
2851 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2852
Matt Menkec6b3edf72019-03-19 17:00:392853 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2854 IsError(ERR_IO_PENDING));
2855 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2856 IsError(ERR_IO_PENDING));
2857 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2858 IsError(ERR_IO_PENDING));
2859 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2860 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152861
robpercival214763f2016-07-01 23:27:012862 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2863 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132864 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152865
2866 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132867 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012868 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152869
[email protected]2431756e2010-09-29 20:26:132870 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012871 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132872 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152873
2874 EXPECT_EQ(1, GetOrderOfRequest(1));
2875 EXPECT_EQ(2, GetOrderOfRequest(2));
2876 EXPECT_EQ(3, GetOrderOfRequest(3));
2877 EXPECT_EQ(4, GetOrderOfRequest(4));
2878
2879 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132880 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152881}
2882
[email protected]6ecf2b92011-12-15 01:14:522883class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042884 public:
Matt Menke9fa17d52019-03-25 19:12:262885 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132886 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182887 bool reset_releasing_handle)
2888 : pool_(pool),
2889 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042890 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522891
Chris Watkins7a41d3552017-12-01 02:13:272892 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042893
2894 ClientSocketHandle* handle() { return &handle_; }
2895
Bence Béky8ddc2492018-06-13 01:02:042896 CompletionOnceCallback callback() {
2897 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2898 base::Unretained(this));
2899 }
[email protected]4f1e4982010-03-02 18:31:042900
2901 private:
[email protected]6ecf2b92011-12-15 01:14:522902 void OnComplete(int result) {
2903 SetResult(result);
2904 if (reset_releasing_handle_)
2905 handle_.Reset();
2906
Matt Menkec6b3edf72019-03-19 17:00:392907 EXPECT_EQ(
2908 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032909 handle2_.Init(
2910 TestGroupId("a"),
2911 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:522912 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032913 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2914 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522915 }
2916
Matt Menke9fa17d52019-03-25 19:12:262917 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182918 int expected_result_;
2919 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042920 ClientSocketHandle handle_;
2921 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042922};
2923
[email protected]e60e47a2010-07-14 03:37:182924
2925TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2926 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2927
Matt Menkec6b3edf72019-03-19 17:00:392928 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2929 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2930 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182931
[email protected]2431756e2010-09-29 20:26:132932 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182933 client_socket_factory_.allocation_count());
2934
2935 connect_job_factory_->set_job_type(
2936 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2937 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282938 EXPECT_EQ(ERR_IO_PENDING,
2939 req.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522940 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282941 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2942 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2943 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182944 // The next job should complete synchronously
2945 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2946
robpercival214763f2016-07-01 23:27:012947 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182948 EXPECT_FALSE(req.handle()->is_initialized());
2949 EXPECT_FALSE(req.handle()->socket());
2950 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512951 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182952}
2953
[email protected]b6501d3d2010-06-03 23:53:342954// http://crbug.com/44724 regression test.
2955// We start releasing the pool when we flush on network change. When that
2956// happens, the only active references are in the ClientSocketHandles. When a
2957// ConnectJob completes and calls back into the last ClientSocketHandle, that
2958// callback can release the last reference and delete the pool. After the
2959// callback finishes, we go back to the stack frame within the now-deleted pool.
2960// Executing any code that refers to members of the now-deleted pool can cause
2961// crashes.
2962TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2963 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2964 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2965
2966 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522967 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502968 EXPECT_EQ(
2969 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522970 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282971 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2972 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2973 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342974
Matt Menke433de6d2020-03-04 00:24:112975 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]b6501d3d2010-06-03 23:53:342976
2977 // We'll call back into this now.
2978 callback.WaitForResult();
2979}
2980
[email protected]a7e38572010-06-07 18:22:242981TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2982 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2983 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2984
2985 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522986 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502987 EXPECT_EQ(
2988 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522989 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282990 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2991 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2992 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012993 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242994 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:112995 NetLogSource source = handle.socket()->NetLog().source();
[email protected]a7e38572010-06-07 18:22:242996
Matt Menke433de6d2020-03-04 00:24:112997 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]a7e38572010-06-07 18:22:242998
2999 handle.Reset();
fdoray5eeb7642016-06-22 16:11:283000 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:243001
Matt Menke28ac03e2019-02-25 22:25:503002 EXPECT_EQ(
3003 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523004 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283005 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3006 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3007 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013008 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243009 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113010
3011 ExpectSocketClosedWithReason(
3012 source, TransportClientSocketPool::kSocketGenerationOutOfDate);
[email protected]a7e38572010-06-07 18:22:243013}
3014
[email protected]6ecf2b92011-12-15 01:14:523015class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:143016 public:
Matt Menke9fa17d52019-03-25 19:12:263017 ConnectWithinCallback(
3018 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:193019 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:263020 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:393021 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:143022
Chris Watkins7a41d3552017-12-01 02:13:273023 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:143024
3025 int WaitForNestedResult() {
3026 return nested_callback_.WaitForResult();
3027 }
3028
Bence Béky8ddc2492018-06-13 01:02:043029 CompletionOnceCallback callback() {
3030 return base::BindOnce(&ConnectWithinCallback::OnComplete,
3031 base::Unretained(this));
3032 }
[email protected]6ecf2b92011-12-15 01:14:523033
[email protected]06f92462010-08-31 19:24:143034 private:
[email protected]6ecf2b92011-12-15 01:14:523035 void OnComplete(int result) {
3036 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:283037 EXPECT_EQ(
3038 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523039 handle_.Init(group_id_, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283040 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3041 nested_callback_.callback(),
3042 ClientSocketPool::ProxyAuthCallback(), pool_,
3043 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:523044 }
3045
Matt Menkec6b3edf72019-03-19 17:00:393046 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:193047 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:263048 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:143049 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:523050 TestCompletionCallback nested_callback_;
3051
3052 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:143053};
3054
3055TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
3056 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3057
3058 // First job will be waiting until it gets aborted.
3059 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3060
3061 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:393062 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:503063 EXPECT_EQ(
3064 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523065 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283066 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3067 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3068 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:143069
3070 // Second job will be started during the first callback, and will
3071 // asynchronously complete with OK.
3072 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menke433de6d2020-03-04 00:24:113073 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
robpercival214763f2016-07-01 23:27:013074 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
3075 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:143076}
3077
Matt Menke141b87f22019-01-30 02:43:033078TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:263079 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3080 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033081
3082 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3083 ClientSocketHandle handle;
3084 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503085 EXPECT_EQ(
3086 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523087 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283088 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3089 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3090 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033091 // The backup timer fires but doesn't start a new ConnectJob while resolving
3092 // the hostname.
3093 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3094 FastForwardBy(base::TimeDelta::FromMilliseconds(
3095 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3096 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3097
3098 // Once the ConnectJob has finished resolving the hostname, the backup timer
3099 // will create a ConnectJob when it fires.
3100 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
3101 FastForwardBy(base::TimeDelta::FromMilliseconds(
3102 ClientSocketPool::kMaxConnectRetryIntervalMs));
3103 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3104}
3105
3106// Test that no backup socket is created when a ConnectJob connects before it
3107// completes.
3108TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263109 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3110 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033111
3112 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3113 ClientSocketHandle handle;
3114 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503115 EXPECT_EQ(
3116 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523117 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283118 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3119 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3120 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033121 // The backup timer fires but doesn't start a new ConnectJob while resolving
3122 // the hostname.
3123 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3124 FastForwardBy(base::TimeDelta::FromMilliseconds(
3125 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3126 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3127
3128 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3129 client_socket_factory_.SetJobHasEstablishedConnection(0);
3130 FastForwardBy(base::TimeDelta::FromMilliseconds(
3131 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3132 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3133}
3134
[email protected]25eea382010-07-10 23:55:263135// Cancel a pending socket request while we're at max sockets,
3136// and verify that the backup socket firing doesn't cause a crash.
3137TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3138 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263139 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3140 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263141
[email protected]4baaf9d2010-08-31 15:15:443142 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3143 // timer.
[email protected]25eea382010-07-10 23:55:263144 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3145 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523146 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503147 EXPECT_EQ(
3148 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523149 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283150 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3151 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3152 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263153
3154 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3155 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3156 ClientSocketHandle handles[kDefaultMaxSockets];
3157 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:523158 TestCompletionCallback callback;
Anton Bikineev068d2912021-05-15 20:43:523159 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283160 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203161 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503162 callback.callback(),
3163 ClientSocketPool::ProxyAuthCallback(),
3164 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263165 }
3166
fdoray5eeb7642016-06-22 16:11:283167 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263168
3169 // Cancel the pending request.
3170 handle.Reset();
3171
3172 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453173 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003174 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263175
[email protected]25eea382010-07-10 23:55:263176 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3177}
3178
[email protected]3f00be82010-09-27 19:50:023179TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263180 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3181 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443182
3183 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3184 // timer.
3185 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3186 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523187 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503188 EXPECT_EQ(
3189 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523190 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283191 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3192 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3193 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263194 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3195 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3196 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3197 TestGroupId("bar")));
3198 EXPECT_EQ(
3199 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443200
3201 // Cancel the socket request. This should cancel the backup timer. Wait for
3202 // the backup time to see if it indeed got canceled.
3203 handle.Reset();
3204 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453205 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003206 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263207 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3208 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443209}
3210
[email protected]3f00be82010-09-27 19:50:023211TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263212 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3213 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023214
3215 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3216 // timer.
3217 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3218 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523219 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503220 EXPECT_EQ(
3221 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523222 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283223 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3224 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3225 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023226 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3227 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523228 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203229 EXPECT_EQ(
3230 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523231 handle2.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283232 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503233 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3234 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263235 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3236 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023237
3238 // Cancel request 1 and then complete request 2. With the requests finished,
3239 // the backup timer should be cancelled.
3240 handle.Reset();
robpercival214763f2016-07-01 23:27:013241 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023242 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453243 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003244 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023245}
3246
[email protected]eb5a99382010-07-11 03:18:263247// Test delayed socket binding for the case where we have two connects,
3248// and while one is waiting on a connect, the other frees up.
3249// The socket waiting on a connect should switch immediately to the freed
3250// up socket.
3251TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3252 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3253 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3254
3255 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523256 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503257 EXPECT_EQ(
3258 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523259 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283260 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503261 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3262 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013263 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263264
3265 // No idle sockets, no pending jobs.
3266 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263267 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263268
3269 // Create a second socket to the same host, but this one will wait.
3270 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3271 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503272 EXPECT_EQ(
3273 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523274 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283275 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503276 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3277 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263278 // No idle sockets, and one connecting job.
3279 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263280 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263281
3282 // Return the first handle to the pool. This will initiate the delayed
3283 // binding.
3284 handle1.Reset();
3285
fdoray5eeb7642016-06-22 16:11:283286 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263287
3288 // Still no idle sockets, still one pending connect job.
3289 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263290 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263291
3292 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013293 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263294
3295 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263296 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263297
3298 // Finally, signal the waiting Connect.
3299 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263300 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263301
fdoray5eeb7642016-06-22 16:11:283302 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263303}
3304
3305// Test delayed socket binding when a group is at capacity and one
3306// of the group's sockets frees up.
3307TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3308 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3309 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3310
3311 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523312 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503313 EXPECT_EQ(
3314 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523315 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283316 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503317 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3318 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013319 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263320
3321 // No idle sockets, no pending jobs.
3322 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263323 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263324
3325 // Create a second socket to the same host, but this one will wait.
3326 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3327 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503328 EXPECT_EQ(
3329 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523330 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283331 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503332 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3333 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263334 // No idle sockets, and one connecting job.
3335 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263336 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263337
3338 // Return the first handle to the pool. This will initiate the delayed
3339 // binding.
3340 handle1.Reset();
3341
fdoray5eeb7642016-06-22 16:11:283342 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263343
3344 // Still no idle sockets, still one pending connect job.
3345 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263346 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263347
3348 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013349 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263350
3351 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263352 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263353
3354 // Finally, signal the waiting Connect.
3355 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263356 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263357
fdoray5eeb7642016-06-22 16:11:283358 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263359}
3360
3361// Test out the case where we have one socket connected, one
3362// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513363// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263364// should complete, by taking the first socket's idle socket.
3365TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3366 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3367 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3368
3369 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523370 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503371 EXPECT_EQ(
3372 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523373 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283374 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503375 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3376 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013377 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263378
3379 // No idle sockets, no pending jobs.
3380 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263381 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263382
3383 // Create a second socket to the same host, but this one will wait.
3384 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3385 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503386 EXPECT_EQ(
3387 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523388 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283389 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503390 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3391 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263392 // No idle sockets, and one connecting job.
3393 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263394 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263395
3396 // Return the first handle to the pool. This will initiate the delayed
3397 // binding.
3398 handle1.Reset();
3399
fdoray5eeb7642016-06-22 16:11:283400 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263401
3402 // Still no idle sockets, still one pending connect job.
3403 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263404 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263405
3406 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013407 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263408
3409 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263410 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263411
3412 // Finally, signal the waiting Connect.
3413 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263414 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263415
fdoray5eeb7642016-06-22 16:11:283416 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263417}
3418
[email protected]2abfe90a2010-08-25 17:49:513419// Cover the case where on an available socket slot, we have one pending
3420// request that completes synchronously, thereby making the Group empty.
3421TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3422 const int kUnlimitedSockets = 100;
3423 const int kOneSocketPerGroup = 1;
3424 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3425
3426 // Make the first request asynchronous fail.
3427 // This will free up a socket slot later.
3428 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3429
3430 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523431 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203432 EXPECT_EQ(
3433 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523434 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283435 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503436 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3437 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263438 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513439
3440 // Make the second request synchronously fail. This should make the Group
3441 // empty.
3442 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3443 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523444 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513445 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3446 // when created.
tfarina428341112016-09-22 13:38:203447 EXPECT_EQ(
3448 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523449 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283450 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503451 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3452 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513453
Matt Menke9fa17d52019-03-25 19:12:263454 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513455
robpercival214763f2016-07-01 23:27:013456 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3457 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263458 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513459}
3460
[email protected]e1b54dc2010-10-06 21:27:223461TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3462 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3463
3464 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3465
3466 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523467 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203468 EXPECT_EQ(
3469 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523470 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283471 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503472 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3473 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223474
3475 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523476 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203477 EXPECT_EQ(
3478 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523479 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283480 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503481 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3482 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223483 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523484 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203485 EXPECT_EQ(
3486 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523487 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283488 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503489 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3490 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223491
robpercival214763f2016-07-01 23:27:013492 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3493 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3494 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223495
3496 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353497 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383498 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353499 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383500 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223501
3502 handle1.Reset();
3503 handle2.Reset();
3504 handle3.Reset();
3505
Matt Menkec6b3edf72019-03-19 17:00:393506 EXPECT_EQ(OK, handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:523507 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283508 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393509 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3510 pool_.get(), NetLogWithSource()));
3511 EXPECT_EQ(OK, handle2.Init(
Anton Bikineev068d2912021-05-15 20:43:523512 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283513 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393514 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3515 pool_.get(), NetLogWithSource()));
3516 EXPECT_EQ(OK, handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:523517 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283518 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393519 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3520 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223521
3522 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3523 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3524 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3525}
3526
[email protected]2c2bef152010-10-13 00:55:033527TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3528 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3529 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3530
Anton Bikineev068d2912021-05-15 20:43:523531 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283532 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033533
Matt Menke9fa17d52019-03-25 19:12:263534 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3535 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3536 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3537 TestGroupId("a")));
3538 EXPECT_EQ(2u,
3539 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393540 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033541
3542 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523543 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203544 EXPECT_EQ(
3545 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523546 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283547 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503548 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3549 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033550
3551 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523552 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203553 EXPECT_EQ(
3554 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523555 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283556 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503557 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3558 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033559
Matt Menke9fa17d52019-03-25 19:12:263560 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3561 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3562 TestGroupId("a")));
3563 EXPECT_EQ(0u,
3564 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393565 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033566
robpercival214763f2016-07-01 23:27:013567 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3568 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033569 handle1.Reset();
3570 handle2.Reset();
3571
Matt Menke9fa17d52019-03-25 19:12:263572 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3573 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3574 TestGroupId("a")));
3575 EXPECT_EQ(0u,
3576 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393577 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033578}
3579
3580TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3581 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3582 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3583
3584 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523585 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203586 EXPECT_EQ(
3587 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523588 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283589 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503590 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3591 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033592
Matt Menke9fa17d52019-03-25 19:12:263593 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3594 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3595 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3596 TestGroupId("a")));
3597 EXPECT_EQ(0u,
3598 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393599 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033600
Anton Bikineev068d2912021-05-15 20:43:523601 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283602 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033603
Matt Menke9fa17d52019-03-25 19:12:263604 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3605 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3606 TestGroupId("a")));
3607 EXPECT_EQ(1u,
3608 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393609 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033610
3611 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523612 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203613 EXPECT_EQ(
3614 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523615 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283616 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503617 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3618 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033619
Matt Menke9fa17d52019-03-25 19:12:263620 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3621 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3622 TestGroupId("a")));
3623 EXPECT_EQ(0u,
3624 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393625 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033626
robpercival214763f2016-07-01 23:27:013627 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3628 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033629 handle1.Reset();
3630 handle2.Reset();
3631
Matt Menke9fa17d52019-03-25 19:12:263632 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3633 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3634 TestGroupId("a")));
3635 EXPECT_EQ(0u,
3636 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393637 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033638}
3639
3640TEST_F(ClientSocketPoolBaseTest,
3641 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3642 CreatePool(4, 4);
3643 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3644
3645 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523646 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203647 EXPECT_EQ(
3648 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523649 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283650 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503651 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3652 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033653
3654 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523655 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203656 EXPECT_EQ(
3657 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523658 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283659 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503660 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3661 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033662
3663 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523664 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203665 EXPECT_EQ(
3666 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523667 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283668 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503669 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3670 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033671
Matt Menke9fa17d52019-03-25 19:12:263672 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3673 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3674 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3675 TestGroupId("a")));
3676 EXPECT_EQ(0u,
3677 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393678 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033679
Anton Bikineev068d2912021-05-15 20:43:523680 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283681 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033682
Matt Menke9fa17d52019-03-25 19:12:263683 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3684 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3685 TestGroupId("a")));
3686 EXPECT_EQ(0u,
3687 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393688 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033689
robpercival214763f2016-07-01 23:27:013690 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3691 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3692 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033693 handle1.Reset();
3694 handle2.Reset();
3695 handle3.Reset();
3696
Matt Menke9fa17d52019-03-25 19:12:263697 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3698 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3699 TestGroupId("a")));
3700 EXPECT_EQ(0u,
3701 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393702 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033703}
3704
3705TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3706 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3707 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3708
Matt Menke9fa17d52019-03-25 19:12:263709 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033710
Anton Bikineev068d2912021-05-15 20:43:523711 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283712 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033713
Matt Menke9fa17d52019-03-25 19:12:263714 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433715 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393716 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263717 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3718 EXPECT_EQ(
3719 kDefaultMaxSockets,
3720 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3721 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433722 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263723 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3724 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033725
Matt Menke9fa17d52019-03-25 19:12:263726 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033727
Anton Bikineev068d2912021-05-15 20:43:523728 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283729 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033730
Matt Menke9fa17d52019-03-25 19:12:263731 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033732}
3733
3734TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3735 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3736 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3737
Matt Menke9fa17d52019-03-25 19:12:263738 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033739
Anton Bikineev068d2912021-05-15 20:43:523740 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283741 kDefaultMaxSockets - 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033742
Matt Menke9fa17d52019-03-25 19:12:263743 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433744 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393745 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263746 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3747 EXPECT_EQ(
3748 kDefaultMaxSockets - 1,
3749 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3750 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433751 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263752 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3753 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483754 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033755
Matt Menke9fa17d52019-03-25 19:12:263756 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033757
Anton Bikineev068d2912021-05-15 20:43:523758 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283759 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033760
Matt Menke9fa17d52019-03-25 19:12:263761 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3762 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483763 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033764}
3765
3766TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3767 CreatePool(4, 4);
3768 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3769
3770 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523771 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203772 EXPECT_EQ(
3773 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523774 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283775 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503776 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3777 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013778 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033779 handle1.Reset();
3780
Matt Menke9fa17d52019-03-25 19:12:263781 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3782 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3783 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3784 TestGroupId("a")));
3785 EXPECT_EQ(0u,
3786 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393787 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033788
Anton Bikineev068d2912021-05-15 20:43:523789 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283790 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033791
Matt Menke9fa17d52019-03-25 19:12:263792 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3793 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3794 TestGroupId("a")));
3795 EXPECT_EQ(1u,
3796 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393797 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033798}
3799
3800TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3801 CreatePool(4, 4);
3802 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3803
3804 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523805 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203806 EXPECT_EQ(
3807 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523808 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283809 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503810 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3811 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013812 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033813
Matt Menke9fa17d52019-03-25 19:12:263814 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3815 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3816 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3817 TestGroupId("a")));
3818 EXPECT_EQ(0u,
3819 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393820 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263821 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033822
Anton Bikineev068d2912021-05-15 20:43:523823 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283824 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033825
Matt Menke9fa17d52019-03-25 19:12:263826 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3827 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3828 TestGroupId("a")));
3829 EXPECT_EQ(1u,
3830 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393831 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263832 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033833}
3834
3835TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3836 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3837 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3838
Anton Bikineev068d2912021-05-15 20:43:523839 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283840 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033841
Matt Menke9fa17d52019-03-25 19:12:263842 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3843 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3844 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3845 TestGroupId("a")));
3846 EXPECT_EQ(0u,
3847 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433848 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393849 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033850
Anton Bikineev068d2912021-05-15 20:43:523851 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283852 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033853
Matt Menke9fa17d52019-03-25 19:12:263854 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3855 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3856 TestGroupId("b")));
3857 EXPECT_EQ(0u,
3858 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433859 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393860 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033861}
3862
[email protected]3c819f522010-12-02 02:03:123863TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3864 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3865 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3866
Anton Bikineev068d2912021-05-15 20:43:523867 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283868 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123869
Matt Menke9fa17d52019-03-25 19:12:263870 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523871
3872 connect_job_factory_->set_job_type(
3873 TestConnectJob::kMockAdditionalErrorStateJob);
Anton Bikineev068d2912021-05-15 20:43:523874 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283875 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523876
Matt Menke9fa17d52019-03-25 19:12:263877 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123878}
3879
[email protected]8159a1c2012-06-07 00:00:103880TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033881 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433882 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033883
Anton Bikineev068d2912021-05-15 20:43:523884 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283885 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033886
Matt Menke9fa17d52019-03-25 19:12:263887 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3888 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3889 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3890 TestGroupId("a")));
3891 EXPECT_EQ(2u,
3892 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3893 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393894 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033895
Anton Bikineev068d2912021-05-15 20:43:523896 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283897 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263898 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3899 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3900 TestGroupId("a")));
3901 EXPECT_EQ(2u,
3902 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3903 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393904 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033905
3906 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523907 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203908 EXPECT_EQ(
3909 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523910 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283911 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503912 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3913 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433914
3915 client_socket_factory_.SignalJob(0);
3916 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3917
Matt Menke9fa17d52019-03-25 19:12:263918 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3919 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3920 TestGroupId("a")));
3921 EXPECT_EQ(1u,
3922 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3923 EXPECT_EQ(1, 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 handle2;
[email protected]6ecf2b92011-12-15 01:14:523927 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433928 EXPECT_EQ(
3929 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523930 handle2.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 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3933 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433934 client_socket_factory_.SignalJob(0);
3935 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033936
Matt Menke9fa17d52019-03-25 19:12:263937 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3938 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3939 TestGroupId("a")));
3940 EXPECT_EQ(0u,
3941 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3942 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393943 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103944
[email protected]2c2bef152010-10-13 00:55:033945 handle1.Reset();
3946 handle2.Reset();
3947
Matt Menke9fa17d52019-03-25 19:12:263948 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3949 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3950 TestGroupId("a")));
3951 EXPECT_EQ(0u,
3952 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3953 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393954 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033955
Anton Bikineev068d2912021-05-15 20:43:523956 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283957 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263958 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3959 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3960 TestGroupId("a")));
3961 EXPECT_EQ(0u,
3962 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3963 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393964 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033965}
3966
3967TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3968 CreatePool(4, 4);
3969 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3970
Anton Bikineev068d2912021-05-15 20:43:523971 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:283972 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033973
Matt Menke9fa17d52019-03-25 19:12:263974 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3975 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3976 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3977 TestGroupId("a")));
3978 EXPECT_EQ(1u,
3979 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393980 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033981
Anton Bikineev068d2912021-05-15 20:43:523982 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283983 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263984 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3985 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3986 TestGroupId("a")));
3987 EXPECT_EQ(2u,
3988 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393989 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033990
Anton Bikineev068d2912021-05-15 20:43:523991 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 3,
Matt Menkef09e64c2019-04-23 22:16:283992 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263993 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3994 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3995 TestGroupId("a")));
3996 EXPECT_EQ(3u,
3997 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393998 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033999
Anton Bikineev068d2912021-05-15 20:43:524000 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284001 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264002 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4003 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4004 TestGroupId("a")));
4005 EXPECT_EQ(3u,
4006 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394007 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034008}
4009
4010TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
4011 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434012 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:034013
Anton Bikineev068d2912021-05-15 20:43:524014 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284015 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:034016
Matt Menke9fa17d52019-03-25 19:12:264017 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4018 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4019 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4020 TestGroupId("a")));
4021 EXPECT_EQ(1u,
4022 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394023 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034024
4025 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524026 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204027 EXPECT_EQ(
4028 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524029 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284030 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504031 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4032 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034033
Matt Menke9fa17d52019-03-25 19:12:264034 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4035 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4036 TestGroupId("a")));
4037 EXPECT_EQ(0u,
4038 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394039 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034040
Lily Chenecebf932018-11-02 17:15:434041 client_socket_factory_.SignalJobs();
4042 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4043
Matt Menke9fa17d52019-03-25 19:12:264044 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4045 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4046 TestGroupId("a")));
4047 EXPECT_EQ(0u,
4048 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394049 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264050 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034051
[email protected]0dc88b32014-03-26 20:12:284052 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:484053 // starts, it has a connect start time.
4054 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:034055 handle1.Reset();
4056
Matt Menkec6b3edf72019-03-19 17:00:394057 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034058}
4059
[email protected]034df0f32013-01-07 23:17:484060// Checks that fully connected preconnect jobs have no connect times, and are
4061// marked as reused.
4062TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
4063 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4064 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Anton Bikineev068d2912021-05-15 20:43:524065 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284066 NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:484067
Matt Menke9fa17d52019-03-25 19:12:264068 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4069 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4070 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4071 TestGroupId("a")));
4072 EXPECT_EQ(0u,
4073 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394074 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484075
4076 ClientSocketHandle handle;
4077 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394078 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524079 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284080 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394081 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4082 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484083
4084 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394085 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484086
4087 TestLoadTimingInfoConnectedReused(handle);
4088 handle.Reset();
4089 TestLoadTimingInfoNotConnected(handle);
4090}
4091
[email protected]dcbe168a2010-12-02 03:14:464092// http://crbug.com/64940 regression test.
4093TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4094 const int kMaxTotalSockets = 3;
4095 const int kMaxSocketsPerGroup = 2;
4096 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434097 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464098
Matt Menkef6edce752019-03-19 17:21:564099 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464100 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4101
4102 // Set up one idle socket in "a".
4103 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524104 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204105 EXPECT_EQ(
4106 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524107 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284108 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504109 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4110 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264111 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4112 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4113 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4114 TestGroupId("a")));
4115 EXPECT_EQ(0u,
4116 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394117 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464118
Lily Chenecebf932018-11-02 17:15:434119 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014120 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264121 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4122 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4123 TestGroupId("a")));
4124 EXPECT_EQ(0u,
4125 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4126 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434127
[email protected]dcbe168a2010-12-02 03:14:464128 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394129 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464130
4131 // Set up two active sockets in "b".
4132 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524133 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204134 EXPECT_EQ(
4135 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524136 handle1.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284137 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504138 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4139 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204140 EXPECT_EQ(
4141 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524142 handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284143 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504144 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4145 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464146
Matt Menke9fa17d52019-03-25 19:12:264147 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4148 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4149 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4150 TestGroupId("b")));
4151 EXPECT_EQ(0u,
4152 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394153 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434154
4155 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014156 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4157 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394158 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264159 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4160 TestGroupId("b")));
4161 EXPECT_EQ(0u,
4162 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4163 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464164
4165 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4166 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4167 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4168 // sockets for "a", and "b" should still have 2 active sockets.
4169
Anton Bikineev068d2912021-05-15 20:43:524170 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:284171 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264172 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4173 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4174 TestGroupId("a")));
4175 EXPECT_EQ(0u,
4176 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394177 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264178 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4179 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4180 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4181 TestGroupId("b")));
4182 EXPECT_EQ(0u,
4183 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394184 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264185 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464186
4187 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4188 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4189 // "a" should result in closing 1 for "b".
4190 handle1.Reset();
4191 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394192 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264193 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464194
Anton Bikineev068d2912021-05-15 20:43:524195 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:284196 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264197 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4198 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4199 TestGroupId("a")));
4200 EXPECT_EQ(1u,
4201 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394202 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264203 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4204 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4205 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4206 TestGroupId("b")));
4207 EXPECT_EQ(0u,
4208 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394209 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264210 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464211}
4212
[email protected]b7b8be42011-07-12 12:46:414213TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264214 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4215 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074216
4217 // Make the ConnectJob hang until it times out, shorten the timeout.
4218 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4219 connect_job_factory_->set_timeout_duration(
4220 base::TimeDelta::FromMilliseconds(500));
Anton Bikineev068d2912021-05-15 20:43:524221 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284222 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264223 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4224 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4225 TestGroupId("a")));
4226 EXPECT_EQ(1u,
4227 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394228 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074229
[email protected]b7b8be42011-07-12 12:46:414230 // Verify the backup timer doesn't create a backup job, by making
4231 // the backup job a pending job instead of a waiting job, so it
4232 // *would* complete if it were created.
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594233 base::RunLoop loop;
[email protected]a9fc8fc2011-05-10 02:41:074234 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454235 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Lukasz Krakowiak855292082020-06-19 12:43:584236 FROM_HERE, loop.QuitClosure(), base::TimeDelta::FromSeconds(1));
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594237 loop.Run();
Matt Menke9fa17d52019-03-25 19:12:264238 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074239}
4240
[email protected]b7b8be42011-07-12 12:46:414241TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264242 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4243 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074244
4245 // Make the ConnectJob hang forever.
4246 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Anton Bikineev068d2912021-05-15 20:43:524247 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284248 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264249 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4250 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4251 TestGroupId("a")));
4252 EXPECT_EQ(1u,
4253 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394254 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284255 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074256
4257 // Make the backup job be a pending job, so it completes normally.
4258 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4259 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524260 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504261 EXPECT_EQ(
4262 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524263 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284264 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4265 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4266 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414267 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264268 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4269 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4270 TestGroupId("a")));
4271 EXPECT_EQ(0u,
4272 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394273 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264274 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014275 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074276
4277 // The hung connect job should still be there, but everything else should be
4278 // complete.
Matt Menke9fa17d52019-03-25 19:12:264279 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4280 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4281 TestGroupId("a")));
4282 EXPECT_EQ(1u,
4283 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394284 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264285 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074286}
4287
[email protected]0dc88b32014-03-26 20:12:284288// Tests that a preconnect that starts out with unread data can still be used.
4289// http://crbug.com/334467
4290TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4291 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4292 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4293
Anton Bikineev068d2912021-05-15 20:43:524294 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284295 NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284296
Matt Menke9fa17d52019-03-25 19:12:264297 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4298 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4299 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4300 TestGroupId("a")));
4301 EXPECT_EQ(0u,
4302 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394303 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284304
4305 // Fail future jobs to be sure that handle receives the preconnected socket
4306 // rather than closing it and making a new one.
4307 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4308 ClientSocketHandle handle;
4309 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394310 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524311 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284312 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394313 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4314 pool_.get(), 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(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264323 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284324
4325 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354326 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284327
4328 TestLoadTimingInfoConnectedReused(handle);
4329 handle.Reset();
4330
4331 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394332 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284333}
4334
Lily Chenecebf932018-11-02 17:15:434335TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4336 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4337 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4338
4339 ClientSocketHandle handle1;
4340 TestCompletionCallback callback1;
4341 EXPECT_EQ(
4342 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524343 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284344 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504345 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4346 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434347
Matt Menke9fa17d52019-03-25 19:12:264348 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4349 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4350 TestGroupId("a")));
4351 EXPECT_EQ(0u,
4352 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394353 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434354
Matt Menkec6b3edf72019-03-19 17:00:394355 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4356 &handle1));
Lily Chenecebf932018-11-02 17:15:434357}
4358
4359TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4360 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4361 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4362
4363 ClientSocketHandle handle1;
4364 TestCompletionCallback callback1;
4365 EXPECT_EQ(
4366 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524367 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284368 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504369 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4370 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434371
Matt Menke9fa17d52019-03-25 19:12:264372 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4373 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4374 TestGroupId("a")));
4375 EXPECT_EQ(0u,
4376 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394377 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434378
4379 ClientSocketHandle handle2;
4380 TestCompletionCallback callback2;
4381 EXPECT_EQ(
4382 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524383 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284384 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504385 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4386 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434387
Matt Menke9fa17d52019-03-25 19:12:264388 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4389 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4390 TestGroupId("a")));
4391 EXPECT_EQ(0u,
4392 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394393 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434394
Matt Menkec6b3edf72019-03-19 17:00:394395 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4396 &handle1));
4397 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4398 &handle2));
Lily Chenecebf932018-11-02 17:15:434399
4400 // One job completes. The other request should still have its job.
4401 client_socket_factory_.SignalJob(0);
4402 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4403
Matt Menke9fa17d52019-03-25 19:12:264404 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4405 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4406 TestGroupId("a")));
4407 EXPECT_EQ(0u,
4408 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4409 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394410 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434411
Matt Menkec6b3edf72019-03-19 17:00:394412 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4413 &handle2));
Lily Chenecebf932018-11-02 17:15:434414}
4415
4416TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4417 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4418 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4419
Anton Bikineev068d2912021-05-15 20:43:524420 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284421 NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434422
Matt Menke9fa17d52019-03-25 19:12:264423 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4424 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4425 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4426 TestGroupId("a")));
4427 EXPECT_EQ(1u,
4428 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394429 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434430
4431 ClientSocketHandle handle1;
4432 TestCompletionCallback callback1;
4433 EXPECT_EQ(
4434 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524435 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284436 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504437 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4438 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434439
Matt Menke9fa17d52019-03-25 19:12:264440 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4441 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4442 TestGroupId("a")));
4443 EXPECT_EQ(0u,
4444 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394445 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434446
Matt Menkec6b3edf72019-03-19 17:00:394447 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4448 &handle1));
Lily Chenecebf932018-11-02 17:15:434449}
4450
4451TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4452 CreatePool(kDefaultMaxSockets, 1);
4453 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4454
4455 ClientSocketHandle handle1;
4456 TestCompletionCallback callback1;
4457 EXPECT_EQ(
4458 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524459 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284460 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504461 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4462 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434463
Matt Menke9fa17d52019-03-25 19:12:264464 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4465 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4466 TestGroupId("a")));
4467 EXPECT_EQ(0u,
4468 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394469 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434470
Matt Menkec6b3edf72019-03-19 17:00:394471 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4472 &handle1));
Lily Chenecebf932018-11-02 17:15:434473
4474 // Insert a higher priority request
4475 ClientSocketHandle handle2;
4476 TestCompletionCallback callback2;
4477 EXPECT_EQ(
4478 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524479 handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284480 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504481 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4482 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434483
Matt Menke9fa17d52019-03-25 19:12:264484 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4485 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4486 TestGroupId("a")));
4487 EXPECT_EQ(0u,
4488 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394489 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434490
4491 // The highest priority request should steal the job from the default priority
4492 // request.
Matt Menkec6b3edf72019-03-19 17:00:394493 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4494 &handle2));
4495 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4496 &handle1));
Lily Chenecebf932018-11-02 17:15:434497}
4498
4499TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4500 CreatePool(3, 3);
4501 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4502
4503 ClientSocketHandle handle_lowest;
4504 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284505 EXPECT_EQ(
4506 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524507 handle_lowest.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284508 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4509 callback_lowest.callback(),
4510 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4511 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434512
Matt Menke9fa17d52019-03-25 19:12:264513 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4514 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4515 TestGroupId("a")));
4516 EXPECT_EQ(0u,
4517 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394518 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434519
4520 ClientSocketHandle handle_highest;
4521 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284522 EXPECT_EQ(
4523 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524524 handle_highest.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284525 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4526 callback_highest.callback(),
4527 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4528 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434529
Matt Menke9fa17d52019-03-25 19:12:264530 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4531 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4532 TestGroupId("a")));
4533 EXPECT_EQ(0u,
4534 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394535 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434536
4537 ClientSocketHandle handle_low;
4538 TestCompletionCallback callback_low;
4539 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284540 handle_low.Init(
Anton Bikineev068d2912021-05-15 20:43:524541 TestGroupId("a"), params_, absl::nullopt, LOW, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284542 ClientSocketPool::RespectLimits::ENABLED,
4543 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4544 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434545
Matt Menke9fa17d52019-03-25 19:12:264546 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4547 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4548 TestGroupId("a")));
4549 EXPECT_EQ(0u,
4550 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394551 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434552
4553 ClientSocketHandle handle_lowest2;
4554 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284555 EXPECT_EQ(
4556 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524557 handle_lowest2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284558 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4559 callback_lowest2.callback(),
4560 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4561 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434562
Matt Menke9fa17d52019-03-25 19:12:264563 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4564 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4565 TestGroupId("a")));
4566 EXPECT_EQ(0u,
4567 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394568 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434569
4570 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394571 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4572 &handle_highest));
4573 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4574 &handle_low));
4575 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4576 &handle_lowest));
4577 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4578 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434579
4580 // Add another request with medium priority. It should steal the job from the
4581 // lowest priority request with a job.
4582 ClientSocketHandle handle_medium;
4583 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284584 EXPECT_EQ(
4585 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524586 handle_medium.Init(TestGroupId("a"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:284587 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4588 callback_medium.callback(),
4589 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4590 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434591
Matt Menke9fa17d52019-03-25 19:12:264592 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4593 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4594 TestGroupId("a")));
4595 EXPECT_EQ(0u,
4596 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394597 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4598 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4599 &handle_highest));
4600 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4601 &handle_medium));
4602 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4603 &handle_low));
4604 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4605 &handle_lowest));
4606 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4607 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434608}
4609
4610TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4611 CreatePool(kDefaultMaxSockets, 1);
4612 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4613
4614 ClientSocketHandle handle1;
4615 TestCompletionCallback callback1;
4616 EXPECT_EQ(
4617 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524618 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284619 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504620 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4621 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434622
Matt Menke9fa17d52019-03-25 19:12:264623 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4624 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4625 TestGroupId("a")));
4626 EXPECT_EQ(0u,
4627 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394628 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434629
4630 ClientSocketHandle handle2;
4631 TestCompletionCallback callback2;
4632 EXPECT_EQ(
4633 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524634 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284635 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504636 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4637 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434638
Matt Menke9fa17d52019-03-25 19:12:264639 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4640 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4641 TestGroupId("a")));
4642 EXPECT_EQ(0u,
4643 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394644 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434645
4646 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394647 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4648 &handle1));
4649 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4650 &handle2));
Lily Chenecebf932018-11-02 17:15:434651
4652 // Reprioritizing the second request places it above the first, and it steals
4653 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394654 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4655 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4656 &handle2));
4657 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4658 &handle1));
Lily Chenecebf932018-11-02 17:15:434659}
4660
4661TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4662 CreatePool(kDefaultMaxSockets, 1);
4663 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4664
4665 ClientSocketHandle handle1;
4666 TestCompletionCallback callback1;
4667 EXPECT_EQ(
4668 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524669 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284670 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504671 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4672 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434673
Matt Menke9fa17d52019-03-25 19:12:264674 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4675 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4676 TestGroupId("a")));
4677 EXPECT_EQ(0u,
4678 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394679 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434680
Matt Menkec6b3edf72019-03-19 17:00:394681 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4682 &handle1));
Lily Chenecebf932018-11-02 17:15:434683
4684 ClientSocketHandle handle2;
4685 TestCompletionCallback callback2;
4686 EXPECT_EQ(
4687 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524688 handle2.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 callback2.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
4700 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394701 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4702 &handle1));
4703 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4704 &handle2));
Lily Chenecebf932018-11-02 17:15:434705
4706 // The second request should get a job upon cancelling the first request.
4707 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264708 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4709 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4710 TestGroupId("a")));
4711 EXPECT_EQ(0u,
4712 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394713 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434714
Matt Menkec6b3edf72019-03-19 17:00:394715 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4716 &handle2));
Lily Chenecebf932018-11-02 17:15:434717}
4718
4719TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4720 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4721 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4722
4723 ClientSocketHandle handle1;
4724 TestCompletionCallback callback1;
4725 EXPECT_EQ(
4726 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524727 handle1.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284728 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504729 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4730 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434731
Matt Menke9fa17d52019-03-25 19:12:264732 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4733 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4734 TestGroupId("a")));
4735 EXPECT_EQ(0u,
4736 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394737 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434738
4739 ClientSocketHandle handle2;
4740 TestCompletionCallback callback2;
4741 EXPECT_EQ(
4742 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524743 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284744 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504745 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4746 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434747
Matt Menke9fa17d52019-03-25 19:12:264748 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4749 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4750 TestGroupId("a")));
4751 EXPECT_EQ(0u,
4752 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394753 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434754
Matt Menkec6b3edf72019-03-19 17:00:394755 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4756 &handle1));
4757 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4758 &handle2));
Lily Chenecebf932018-11-02 17:15:434759
4760 // The lower-priority job completes first. The higher-priority request should
4761 // get the socket, and the lower-priority request should get the remaining
4762 // job.
4763 client_socket_factory_.SignalJob(1);
4764 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264765 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4766 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4767 TestGroupId("a")));
4768 EXPECT_EQ(0u,
4769 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4770 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394771 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434772 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394773 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4774 &handle2));
Lily Chenecebf932018-11-02 17:15:434775}
4776
[email protected]043b68c82013-08-22 23:41:524777class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204778 public:
Matt Menke9fa17d52019-03-25 19:12:264779 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394780 const ClientSocketPool::GroupId& group_id)
4781 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524782 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204783 }
4784
Daniel Cheng4496d0822018-04-26 21:52:154785 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204786
Matt Menke9fa17d52019-03-25 19:12:264787 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504788 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034789 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524790 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284791 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4792 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204793 }
4794
Matt Menke9fa17d52019-03-25 19:12:264795 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504796 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034797 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524798 absl::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504799 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4800 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204801 }
4802
4803 bool ReleaseOneConnection() {
4804 if (!handle_.is_initialized() || !can_release_connection_) {
4805 return false;
4806 }
4807 handle_.socket()->Disconnect();
4808 handle_.Reset();
4809 return true;
4810 }
4811
4812 void set_can_release_connection(bool can_release_connection) {
4813 can_release_connection_ = can_release_connection;
4814 }
4815
4816 MOCK_METHOD0(CloseOneIdleConnection, bool());
4817
4818 private:
Matt Menke9fa17d52019-03-25 19:12:264819 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204820 ClientSocketHandle handle_;
4821 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394822 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204823 bool can_release_connection_;
4824};
4825
[email protected]58e562f2013-04-22 17:32:204826// Tests the basic case of closing an idle socket in a higher layered pool when
4827// a new request is issued and the lower layer pool is stalled.
4828TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4829 CreatePool(1, 1);
4830 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4831
Matt Menkec6b3edf72019-03-19 17:00:394832 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014833 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204834 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4835 .WillOnce(Invoke(&mock_layered_pool,
4836 &MockLayeredPool::ReleaseOneConnection));
4837 ClientSocketHandle handle;
4838 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504839 EXPECT_EQ(
4840 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524841 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284842 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4843 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4844 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014845 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204846}
4847
Matt Menke833678642019-03-05 22:05:514848// Tests the case that trying to close an idle socket in a higher layered pool
4849// fails.
4850TEST_F(ClientSocketPoolBaseTest,
4851 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4852 CreatePool(1, 1);
4853 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4854
Matt Menkec6b3edf72019-03-19 17:00:394855 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514856 mock_layered_pool.set_can_release_connection(false);
4857 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4858 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4859 .WillOnce(Invoke(&mock_layered_pool,
4860 &MockLayeredPool::ReleaseOneConnection));
4861 ClientSocketHandle handle;
4862 TestCompletionCallback callback;
4863 EXPECT_EQ(
4864 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524865 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284866 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4867 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4868 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514869 base::RunLoop().RunUntilIdle();
4870 EXPECT_FALSE(callback.have_result());
4871}
4872
[email protected]58e562f2013-04-22 17:32:204873// Same as above, but the idle socket is in the same group as the stalled
4874// socket, and closes the only other request in its group when closing requests
4875// in higher layered pools. This generally shouldn't happen, but it may be
4876// possible if a higher level pool issues a request and the request is
4877// subsequently cancelled. Even if it's not possible, best not to crash.
4878TEST_F(ClientSocketPoolBaseTest,
4879 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4880 CreatePool(2, 2);
4881 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4882
4883 // Need a socket in another group for the pool to be stalled (If a group
4884 // has the maximum number of connections already, it's not stalled).
4885 ClientSocketHandle handle1;
4886 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524887 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284888 DEFAULT_PRIORITY, SocketTag(),
4889 ClientSocketPool::RespectLimits::ENABLED,
4890 callback1.callback(),
4891 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4892 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204893
Matt Menkec6b3edf72019-03-19 17:00:394894 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014895 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204896 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4897 .WillOnce(Invoke(&mock_layered_pool,
4898 &MockLayeredPool::ReleaseOneConnection));
4899 ClientSocketHandle handle;
4900 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284901 EXPECT_EQ(ERR_IO_PENDING,
4902 handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524903 TestGroupId("group2"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284904 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4905 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4906 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014907 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204908}
4909
4910// Tests the case when an idle socket can be closed when a new request is
4911// issued, and the new request belongs to a group that was previously stalled.
4912TEST_F(ClientSocketPoolBaseTest,
4913 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4914 CreatePool(2, 2);
4915 std::list<TestConnectJob::JobType> job_types;
4916 job_types.push_back(TestConnectJob::kMockJob);
4917 job_types.push_back(TestConnectJob::kMockJob);
4918 job_types.push_back(TestConnectJob::kMockJob);
4919 job_types.push_back(TestConnectJob::kMockJob);
4920 connect_job_factory_->set_job_types(&job_types);
4921
4922 ClientSocketHandle handle1;
4923 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524924 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284925 DEFAULT_PRIORITY, SocketTag(),
4926 ClientSocketPool::RespectLimits::ENABLED,
4927 callback1.callback(),
4928 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4929 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204930
Matt Menkec6b3edf72019-03-19 17:00:394931 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014932 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204933 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4934 .WillRepeatedly(Invoke(&mock_layered_pool,
4935 &MockLayeredPool::ReleaseOneConnection));
4936 mock_layered_pool.set_can_release_connection(false);
4937
4938 // The third request is made when the socket pool is in a stalled state.
4939 ClientSocketHandle handle3;
4940 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:284941 EXPECT_EQ(ERR_IO_PENDING,
4942 handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:524943 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284944 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4945 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4946 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204947
4948 base::RunLoop().RunUntilIdle();
4949 EXPECT_FALSE(callback3.have_result());
4950
4951 // The fourth request is made when the pool is no longer stalled. The third
4952 // request should be serviced first, since it was issued first and has the
4953 // same priority.
4954 mock_layered_pool.set_can_release_connection(true);
4955 ClientSocketHandle handle4;
4956 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:284957 EXPECT_EQ(ERR_IO_PENDING,
4958 handle4.Init(
Anton Bikineev068d2912021-05-15 20:43:524959 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284960 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4961 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4962 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014963 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204964 EXPECT_FALSE(callback4.have_result());
4965
4966 // Closing a handle should free up another socket slot.
4967 handle1.Reset();
robpercival214763f2016-07-01 23:27:014968 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204969}
4970
4971// Tests the case when an idle socket can be closed when a new request is
4972// issued, and the new request belongs to a group that was previously stalled.
4973//
4974// The two differences from the above test are that the stalled requests are not
4975// in the same group as the layered pool's request, and the the fourth request
4976// has a higher priority than the third one, so gets a socket first.
4977TEST_F(ClientSocketPoolBaseTest,
4978 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4979 CreatePool(2, 2);
4980 std::list<TestConnectJob::JobType> job_types;
4981 job_types.push_back(TestConnectJob::kMockJob);
4982 job_types.push_back(TestConnectJob::kMockJob);
4983 job_types.push_back(TestConnectJob::kMockJob);
4984 job_types.push_back(TestConnectJob::kMockJob);
4985 connect_job_factory_->set_job_types(&job_types);
4986
4987 ClientSocketHandle handle1;
4988 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524989 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284990 DEFAULT_PRIORITY, SocketTag(),
4991 ClientSocketPool::RespectLimits::ENABLED,
4992 callback1.callback(),
4993 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4994 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204995
Matt Menkec6b3edf72019-03-19 17:00:394996 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014997 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204998 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4999 .WillRepeatedly(Invoke(&mock_layered_pool,
5000 &MockLayeredPool::ReleaseOneConnection));
5001 mock_layered_pool.set_can_release_connection(false);
5002
5003 // The third request is made when the socket pool is in a stalled state.
5004 ClientSocketHandle handle3;
5005 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:205006 EXPECT_EQ(
5007 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525008 handle3.Init(TestGroupId("group3"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:285009 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505010 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5011 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205012
5013 base::RunLoop().RunUntilIdle();
5014 EXPECT_FALSE(callback3.have_result());
5015
5016 // The fourth request is made when the pool is no longer stalled. This
5017 // request has a higher priority than the third request, so is serviced first.
5018 mock_layered_pool.set_can_release_connection(true);
5019 ClientSocketHandle handle4;
5020 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:205021 EXPECT_EQ(
5022 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525023 handle4.Init(TestGroupId("group3"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:285024 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505025 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5026 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015027 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205028 EXPECT_FALSE(callback3.have_result());
5029
5030 // Closing a handle should free up another socket slot.
5031 handle1.Reset();
robpercival214763f2016-07-01 23:27:015032 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205033}
5034
5035TEST_F(ClientSocketPoolBaseTest,
5036 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
5037 CreatePool(1, 1);
5038 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5039
Matt Menkec6b3edf72019-03-19 17:00:395040 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:015041 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205042 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
5043 .WillRepeatedly(Invoke(&mock_layered_pool1,
5044 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:395045 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:015046 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
5047 IsOk());
[email protected]58e562f2013-04-22 17:32:205048 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
5049 .WillRepeatedly(Invoke(&mock_layered_pool2,
5050 &MockLayeredPool::ReleaseOneConnection));
5051 ClientSocketHandle handle;
5052 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:505053 EXPECT_EQ(
5054 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525055 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285056 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5057 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5058 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015059 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205060}
5061
[email protected]b021ece62013-06-11 11:06:335062// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:155063// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
5064// socket instead of a request with the same priority that was issued earlier,
5065// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:335066TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:335067 CreatePool(1, 1);
5068
5069 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395070 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5071 TestGroupId("a"), MAXIMUM_PRIORITY,
5072 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265073 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335074
5075 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5076
mmenked3641e12016-01-28 16:06:155077 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395078 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155079 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265080 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335081
mmenked3641e12016-01-28 16:06:155082 // Issue a request that ignores the limits, so a new ConnectJob is
5083 // created.
5084 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395085 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155086 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265087 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335088
robpercival214763f2016-07-01 23:27:015089 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335090 EXPECT_FALSE(request(1)->have_result());
5091}
5092
[email protected]c55fabd2013-11-04 23:26:565093// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155094// issued for a request with RespectLimits::DISABLED is not cancelled when a
5095// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565096TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565097 CreatePool(1, 1);
5098
5099 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395100 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5101 TestGroupId("a"), MAXIMUM_PRIORITY,
5102 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265103 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565104
5105 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5106
mmenked3641e12016-01-28 16:06:155107 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395108 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155109 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265110 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565111
mmenked3641e12016-01-28 16:06:155112 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5113 // created.
5114 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395115 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155116 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265117 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335118
mmenked3641e12016-01-28 16:06:155119 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335120 // should not be cancelled.
5121 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265122 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335123
robpercival214763f2016-07-01 23:27:015124 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335125 EXPECT_FALSE(request(1)->have_result());
5126}
5127
Matt Menkeb57663b32019-03-01 17:17:105128TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5129 CreatePool(1, 1);
5130
5131 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5132
5133 ClientSocketHandle handle;
5134 TestCompletionCallback callback;
5135 EXPECT_EQ(
5136 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525137 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285138 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5139 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5140 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105141
Matt Menke9fa17d52019-03-25 19:12:265142 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105143
5144 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5145 EXPECT_FALSE(handle.is_initialized());
5146 EXPECT_FALSE(handle.socket());
5147
5148 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265149 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105150}
5151
5152class TestAuthHelper {
5153 public:
5154 TestAuthHelper() = default;
5155 ~TestAuthHelper() = default;
5156
Matt Menkec6b3edf72019-03-19 17:00:395157 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195158 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265159 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395160 RequestPriority priority = DEFAULT_PRIORITY,
5161 ClientSocketPool::RespectLimits respect_limits =
5162 ClientSocketPool::RespectLimits::ENABLED,
5163 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105164 EXPECT_EQ(ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525165 handle_.Init(group_id_in, params, absl::nullopt, priority,
Matt Menkef09e64c2019-04-23 22:16:285166 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105167 base::BindRepeating(&TestAuthHelper::AuthCallback,
5168 base::Unretained(this)),
5169 pool, NetLogWithSource()));
5170 }
5171
5172 void WaitForAuth() {
5173 run_loop_ = std::make_unique<base::RunLoop>();
5174 run_loop_->Run();
5175 run_loop_.reset();
5176 }
5177
5178 void WaitForAuthAndRestartSync() {
5179 restart_sync_ = true;
5180 WaitForAuth();
5181 restart_sync_ = false;
5182 }
5183
5184 void WaitForAuthAndResetHandleSync() {
5185 reset_handle_sync_ = true;
5186 WaitForAuth();
5187 reset_handle_sync_ = false;
5188 }
5189
5190 void RestartWithAuth() {
5191 DCHECK(restart_with_auth_callback_);
5192 std::move(restart_with_auth_callback_).Run();
5193 }
5194
5195 int WaitForResult() {
5196 int result = callback_.WaitForResult();
5197 // There shouldn't be any callback waiting to be invoked once the request is
5198 // complete.
5199 EXPECT_FALSE(restart_with_auth_callback_);
5200 // The socket should only be initialized on success.
5201 EXPECT_EQ(result == OK, handle_.is_initialized());
5202 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5203 return result;
5204 }
5205
5206 ClientSocketHandle* handle() { return &handle_; }
5207 int auth_count() const { return auth_count_; }
5208 int have_result() const { return callback_.have_result(); }
5209
5210 private:
5211 void AuthCallback(const HttpResponseInfo& response,
5212 HttpAuthController* auth_controller,
5213 base::OnceClosure restart_with_auth_callback) {
5214 EXPECT_FALSE(restart_with_auth_callback_);
5215 EXPECT_TRUE(restart_with_auth_callback);
5216
5217 // Once there's a result, this method shouldn't be invoked again.
5218 EXPECT_FALSE(callback_.have_result());
5219
5220 ++auth_count_;
5221 run_loop_->Quit();
5222 if (restart_sync_) {
5223 std::move(restart_with_auth_callback).Run();
5224 return;
5225 }
5226
5227 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5228
5229 if (reset_handle_sync_) {
5230 handle_.Reset();
5231 return;
5232 }
5233 }
5234
5235 std::unique_ptr<base::RunLoop> run_loop_;
5236 base::OnceClosure restart_with_auth_callback_;
5237
5238 bool restart_sync_ = false;
5239 bool reset_handle_sync_ = false;
5240
5241 ClientSocketHandle handle_;
5242 int auth_count_ = 0;
5243 TestCompletionCallback callback_;
5244
5245 DISALLOW_COPY_AND_ASSIGN(TestAuthHelper);
5246};
5247
5248TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5249 CreatePool(1, 1);
5250 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5251
5252 TestAuthHelper auth_helper;
5253 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265254 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015255 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395256 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105257
5258 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265259 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015260 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395261 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105262
5263 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265264 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015265 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395266 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105267
5268 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5269 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265270 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5271 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395272 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105273 EXPECT_EQ(0, pool_->IdleSocketCount());
5274}
5275
5276TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5277 CreatePool(1, 1);
5278 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5279
5280 TestAuthHelper auth_helper;
5281 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265282 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015283 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395284 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105285
5286 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265287 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015288 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395289 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105290
5291 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5292 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265293 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5294 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395295 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105296 EXPECT_EQ(0, pool_->IdleSocketCount());
5297}
5298
5299TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5300 CreatePool(1, 1);
5301 connect_job_factory_->set_job_type(
5302 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5303
5304 TestAuthHelper auth_helper;
5305 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265306 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105307
5308 auth_helper.WaitForAuth();
5309 auth_helper.RestartWithAuth();
5310 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5311
5312 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265313 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105314 EXPECT_EQ(0, pool_->IdleSocketCount());
5315}
5316
5317TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5318 CreatePool(1, 1);
5319 connect_job_factory_->set_job_type(
5320 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5321
5322 TestAuthHelper auth_helper;
5323 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265324 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105325
5326 auth_helper.WaitForAuthAndRestartSync();
5327 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5328
5329 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265330 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105331 EXPECT_EQ(0, pool_->IdleSocketCount());
5332}
5333
5334TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5335 CreatePool(1, 1);
5336 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5337
5338 TestAuthHelper auth_helper;
5339 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265340 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105341
5342 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265343 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105344
5345 auth_helper.handle()->Reset();
5346
5347 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265348 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105349 EXPECT_EQ(0, pool_->IdleSocketCount());
5350 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5351 EXPECT_FALSE(auth_helper.handle()->socket());
5352}
5353
5354TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5355 CreatePool(1, 1);
5356 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5357
5358 TestAuthHelper auth_helper;
5359 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265360 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105361
5362 auth_helper.WaitForAuthAndResetHandleSync();
5363 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265364 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105365 EXPECT_EQ(0, pool_->IdleSocketCount());
5366 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5367 EXPECT_FALSE(auth_helper.handle()->socket());
5368}
5369
5370TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5371 CreatePool(1, 1);
5372 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5373
5374 TestAuthHelper auth_helper;
5375 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265376 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105377
5378 auth_helper.WaitForAuth();
5379
Matt Menke433de6d2020-03-04 00:24:115380 pool_->FlushWithError(ERR_FAILED, "Network changed");
Matt Menkeb57663b32019-03-01 17:17:105381 base::RunLoop().RunUntilIdle();
5382
5383 // When flushing the socket pool, bound sockets should delay returning the
5384 // error until completion.
5385 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265386 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105387 EXPECT_EQ(0, pool_->IdleSocketCount());
5388
5389 auth_helper.RestartWithAuth();
5390 // The callback should be called asynchronously.
5391 EXPECT_FALSE(auth_helper.have_result());
5392
5393 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265394 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105395 EXPECT_EQ(0, pool_->IdleSocketCount());
5396}
5397
5398TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5399 CreatePool(1, 1);
5400 connect_job_factory_->set_job_type(
5401 TestConnectJob::kMockAuthChallengeTwiceJob);
5402
5403 TestAuthHelper auth_helper;
5404 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265405 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015406 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395407 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105408
5409 auth_helper.WaitForAuth();
5410 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265411 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105412 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015413 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395414 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105415
5416 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265417 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015418 EXPECT_EQ(2, auth_helper.auth_count());
5419 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395420 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015421
Matt Menkeb57663b32019-03-01 17:17:105422 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265423 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105424 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015425 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395426 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105427
5428 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5429 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265430 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5431 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395432 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105433 EXPECT_EQ(0, pool_->IdleSocketCount());
5434}
5435
5436TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5437 CreatePool(1, 1);
5438 connect_job_factory_->set_job_type(
5439 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5440
5441 TestAuthHelper auth_helper;
5442 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265443 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105444
5445 auth_helper.WaitForAuth();
5446 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265447 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105448 EXPECT_EQ(1, auth_helper.auth_count());
5449
5450 auth_helper.WaitForAuth();
5451 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265452 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105453 EXPECT_EQ(2, auth_helper.auth_count());
5454
5455 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5456 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265457 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105458 EXPECT_EQ(0, pool_->IdleSocketCount());
5459}
5460
5461// Makes sure that when a bound request is destroyed, a new ConnectJob is
5462// created, if needed.
5463TEST_F(ClientSocketPoolBaseTest,
5464 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5465 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5466 connect_job_factory_->set_job_type(
5467 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5468
5469 // First request creates a ConnectJob.
5470 TestAuthHelper auth_helper1;
5471 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265472 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105473
5474 // A second request come in, but no new ConnectJob is needed, since the limit
5475 // has been reached.
5476 TestAuthHelper auth_helper2;
5477 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265478 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105479
5480 // Run until the auth callback for the first request is invoked.
5481 auth_helper1.WaitForAuth();
5482 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265483 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5484 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395485 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105486
5487 // Make connect jobs succeed, then cancel the first request, which should
5488 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5489 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5490 auth_helper1.handle()->Reset();
5491 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265492 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105493
5494 // The second ConnectJob should succeed.
5495 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5496 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265497 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105498}
5499
5500// Makes sure that when a bound request is destroyed, a new ConnectJob is
5501// created for another group, if needed.
5502TEST_F(ClientSocketPoolBaseTest,
5503 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5504 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5505 connect_job_factory_->set_job_type(
5506 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5507
5508 // First request creates a ConnectJob.
5509 TestAuthHelper auth_helper1;
5510 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265511 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105512
5513 // A second request come in, but no new ConnectJob is needed, since the limit
5514 // has been reached.
5515 TestAuthHelper auth_helper2;
5516 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395517 ClientSocketPool::RespectLimits::ENABLED,
5518 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265519 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5520 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105521
5522 // Run until the auth callback for the first request is invoked.
5523 auth_helper1.WaitForAuth();
5524 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265525 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5526 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395527 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265528 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5529 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395530 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105531
5532 // Make connect jobs succeed, then cancel the first request, which should
5533 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5534 // other group.
5535 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5536 auth_helper1.handle()->Reset();
5537 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265538 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5539 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105540
5541 // The second ConnectJob should succeed.
5542 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5543 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265544 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5545 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105546}
5547
5548// Test that once an auth challenge is bound, that's the request that gets all
5549// subsequent calls and the socket itself.
5550TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5551 CreatePool(1, 1);
5552 connect_job_factory_->set_job_type(
5553 TestConnectJob::kMockAuthChallengeTwiceJob);
5554
5555 // First request creates a ConnectJob.
5556 TestAuthHelper auth_helper1;
5557 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265558 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105559
5560 // A second, higher priority request is made.
5561 TestAuthHelper auth_helper2;
5562 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265563 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105564
5565 // Run until the auth callback for the second request is invoked.
5566 auth_helper2.WaitForAuth();
5567 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265568 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5569 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395570 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105571
5572 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5573 // ConnectJob.
5574 TestAuthHelper auth_helper3;
5575 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265576 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105577
5578 // Start a higher job that ignores limits, creating a hanging socket. It
5579 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5580 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5581 TestAuthHelper auth_helper4;
5582 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5583 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265584 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105585
5586 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5587 // again.
5588 auth_helper2.RestartWithAuth();
5589 auth_helper2.WaitForAuth();
5590 EXPECT_EQ(0, auth_helper1.auth_count());
5591 EXPECT_FALSE(auth_helper1.have_result());
5592 EXPECT_EQ(2, auth_helper2.auth_count());
5593 EXPECT_FALSE(auth_helper2.have_result());
5594 EXPECT_EQ(0, auth_helper3.auth_count());
5595 EXPECT_FALSE(auth_helper3.have_result());
5596 EXPECT_EQ(0, auth_helper4.auth_count());
5597 EXPECT_FALSE(auth_helper4.have_result());
5598
5599 // Advance auth again, and |auth_helper2| should get the socket.
5600 auth_helper2.RestartWithAuth();
5601 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5602 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5603 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265604 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5605 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105606 EXPECT_EQ(0, auth_helper1.auth_count());
5607 EXPECT_FALSE(auth_helper1.have_result());
5608 EXPECT_EQ(0, auth_helper3.auth_count());
5609 EXPECT_FALSE(auth_helper3.have_result());
5610 EXPECT_EQ(0, auth_helper4.auth_count());
5611 EXPECT_FALSE(auth_helper4.have_result());
5612
5613 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5614 // socket request should be able to claim it.
5615 auth_helper2.handle()->Reset();
5616 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5617 EXPECT_EQ(0, auth_helper1.auth_count());
5618 EXPECT_FALSE(auth_helper1.have_result());
5619 EXPECT_EQ(0, auth_helper3.auth_count());
5620 EXPECT_FALSE(auth_helper3.have_result());
5621 EXPECT_EQ(0, auth_helper4.auth_count());
5622}
5623
David Benjaminbac8dff2019-08-07 01:30:415624enum class RefreshType {
5625 kServer,
5626 kProxy,
5627};
5628
5629// Common base class to test RefreshGroup() when called from either
5630// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5631//
5632// Tests which test behavior specific to one or the other case should use
5633// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5634// when the pool's proxy matches.
5635class ClientSocketPoolBaseRefreshTest
5636 : public ClientSocketPoolBaseTest,
5637 public testing::WithParamInterface<RefreshType> {
5638 public:
5639 void CreatePoolForRefresh(int max_sockets,
5640 int max_sockets_per_group,
5641 bool enable_backup_connect_jobs = false) {
5642 switch (GetParam()) {
5643 case RefreshType::kServer:
5644 CreatePool(max_sockets, max_sockets_per_group,
5645 enable_backup_connect_jobs);
5646 break;
5647 case RefreshType::kProxy:
5648 CreatePoolWithIdleTimeouts(
5649 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5650 ClientSocketPool::used_idle_socket_timeout(),
5651 enable_backup_connect_jobs,
5652 ProxyServer::FromPacString("HTTPS myproxy:70"));
5653 break;
5654 }
5655 }
5656
5657 static ClientSocketPool::GroupId GetGroupId() {
Eric Ortha2e7773212021-06-22 21:49:555658 return TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415659 }
5660
David Benjamin6dd7e882019-10-10 02:35:235661 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5662 // Note this GroupId will match GetGroupId() unless
5663 // kPartitionConnectionsByNetworkIsolationKey is enabled.
Matt Menke4807a9a2020-11-21 00:14:415664 const SchemefulSite kSite(GURL("https://b/"));
5665 const NetworkIsolationKey kNetworkIsolationKey(kSite, kSite);
Eric Ortha2e7773212021-06-22 21:49:555666 return TestGroupId("a", 443, url::kHttpsScheme,
David Benjamin6dd7e882019-10-10 02:35:235667 PrivacyMode::PRIVACY_MODE_DISABLED,
5668 kNetworkIsolationKey);
5669 }
5670
David Benjaminbac8dff2019-08-07 01:30:415671 void OnSSLConfigForServerChanged() {
5672 switch (GetParam()) {
5673 case RefreshType::kServer:
5674 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5675 break;
5676 case RefreshType::kProxy:
5677 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5678 break;
5679 }
5680 }
5681};
5682
5683INSTANTIATE_TEST_SUITE_P(RefreshType,
5684 ClientSocketPoolBaseRefreshTest,
5685 ::testing::Values(RefreshType::kServer,
5686 RefreshType::kProxy));
5687
5688TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5689 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5690 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245691
5692 // First job will be waiting until it gets aborted.
5693 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5694
5695 ClientSocketHandle handle;
5696 TestCompletionCallback callback;
5697 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525698 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285699 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5700 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5701 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245702 IsError(ERR_IO_PENDING));
5703
5704 // Switch connect job types, so creating a new ConnectJob will result in
5705 // success.
5706 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5707
David Benjaminbac8dff2019-08-07 01:30:415708 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245709 EXPECT_EQ(OK, callback.WaitForResult());
5710 ASSERT_TRUE(handle.socket());
5711 EXPECT_EQ(0, pool_->IdleSocketCount());
5712 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5713 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5714 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5715 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5716}
5717
David Benjaminbac8dff2019-08-07 01:30:415718TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235719 base::test::ScopedFeatureList feature_list;
5720 feature_list.InitAndEnableFeature(
5721 features::kPartitionConnectionsByNetworkIsolationKey);
5722
David Benjaminbac8dff2019-08-07 01:30:415723 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5724 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235725 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245726
Anton Bikineev068d2912021-05-15 20:43:525727 pool_->RequestSockets(kGroupId, params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:285728 NetLogWithSource());
Anton Bikineev068d2912021-05-15 20:43:525729 pool_->RequestSockets(kGroupIdInPartition, params_, absl::nullopt, 2,
David Benjamin6dd7e882019-10-10 02:35:235730 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245731 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235732 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5733 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245734 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235735 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245736
David Benjaminbac8dff2019-08-07 01:30:415737 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245738 EXPECT_EQ(0, pool_->IdleSocketCount());
5739 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235740 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245741}
5742
5743TEST_F(ClientSocketPoolBaseTest,
5744 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5745 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415746 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555747 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415748 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555749 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245750
Anton Bikineev068d2912021-05-15 20:43:525751 pool_->RequestSockets(kOtherGroupId, params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:285752 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245753 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5754 EXPECT_EQ(2, pool_->IdleSocketCount());
5755 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5756
David Benjaminbac8dff2019-08-07 01:30:415757 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245758 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5759 EXPECT_EQ(2, pool_->IdleSocketCount());
5760 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5761}
5762
David Benjaminbac8dff2019-08-07 01:30:415763TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5764 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5765 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245766
5767 ClientSocketHandle handle;
5768 TestCompletionCallback callback;
5769 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525770 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285771 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5772 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5773 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245774 IsOk());
5775 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5776 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5777
David Benjaminbac8dff2019-08-07 01:30:415778 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245779
5780 handle.Reset();
5781 EXPECT_EQ(0, pool_->IdleSocketCount());
5782 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5783}
5784
5785TEST_F(ClientSocketPoolBaseTest,
5786 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5787 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415788 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555789 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415790 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555791 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245792
5793 ClientSocketHandle handle;
5794 TestCompletionCallback callback;
5795 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525796 handle.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285797 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5798 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5799 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245800 IsOk());
5801 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5802 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5803
David Benjaminbac8dff2019-08-07 01:30:415804 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245805
5806 handle.Reset();
5807 EXPECT_EQ(1, pool_->IdleSocketCount());
5808 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5809 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5810}
5811
David Benjaminbac8dff2019-08-07 01:30:415812TEST_P(ClientSocketPoolBaseRefreshTest,
5813 RefreshGroupReplacesBoundConnectJobOnConnect) {
5814 CreatePoolForRefresh(1, 1);
5815 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245816 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5817
5818 TestAuthHelper auth_helper;
5819 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5820 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5821 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5822
5823 auth_helper.WaitForAuth();
5824
5825 // This should update the generation, but not cancel the old ConnectJob - it's
5826 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415827 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245828
5829 // Providing auth credentials and restarting the request with them will cause
5830 // the ConnectJob to complete successfully, but the result will be discarded
5831 // because of the generation mismatch.
5832 auth_helper.RestartWithAuth();
5833
5834 // Despite using ConnectJobs that simulate a single challenge, a second
5835 // challenge will be seen, due to using a new ConnectJob.
5836 auth_helper.WaitForAuth();
5837 auth_helper.RestartWithAuth();
5838
5839 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5840 EXPECT_TRUE(auth_helper.handle()->socket());
5841 EXPECT_EQ(2, auth_helper.auth_count());
5842
5843 // When released, the socket will be returned to the socket pool, and
5844 // available for reuse.
5845 auth_helper.handle()->Reset();
5846 EXPECT_EQ(1, pool_->IdleSocketCount());
5847 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5848 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5849}
5850
David Benjaminbac8dff2019-08-07 01:30:415851TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5852 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5853 kUnusedIdleSocketTimeout,
5854 ClientSocketPool::used_idle_socket_timeout(),
5855 false /* no backup connect jobs */,
5856 ProxyServer::FromPacString("HTTPS myproxy:70"));
5857
5858 const ClientSocketPool::GroupId kGroupId1 =
Eric Ortha2e7773212021-06-22 21:49:555859 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415860 const ClientSocketPool::GroupId kGroupId2 =
Eric Ortha2e7773212021-06-22 21:49:555861 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415862 const ClientSocketPool::GroupId kGroupId3 =
Eric Ortha2e7773212021-06-22 21:49:555863 TestGroupId("c", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415864
5865 // Make three sockets in three different groups. The third socket is released
5866 // to the pool as idle.
5867 ClientSocketHandle handle1, handle2, handle3;
5868 TestCompletionCallback callback;
5869 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525870 handle1.Init(kGroupId1, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415871 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5872 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5873 pool_.get(), NetLogWithSource()),
5874 IsOk());
5875 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525876 handle2.Init(kGroupId2, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415877 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5878 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5879 pool_.get(), NetLogWithSource()),
5880 IsOk());
5881 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525882 handle3.Init(kGroupId3, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415883 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5884 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5885 pool_.get(), NetLogWithSource()),
5886 IsOk());
5887 handle3.Reset();
5888 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5889 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5890 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5891 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5892 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5893 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5894
5895 // Changes to some other proxy do not affect the pool. The idle socket remains
5896 // alive and closing |handle2| makes the socket available for the pool.
5897 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5898
5899 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5900 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5901 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5902 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5903 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5904 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5905
5906 handle2.Reset();
5907 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5908 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5909
5910 // Changes to the matching proxy refreshes all groups.
5911 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5912
5913 // Idle sockets are closed.
5914 EXPECT_EQ(0, pool_->IdleSocketCount());
5915 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
5916 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
5917
5918 // The active socket, however, continues to be active.
5919 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5920 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5921
5922 // Closing it does not make it available for the pool.
5923 handle1.Reset();
5924 EXPECT_EQ(0, pool_->IdleSocketCount());
5925 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
5926}
5927
5928TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
5929 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5930
Eric Ortha2e7773212021-06-22 21:49:555931 const ClientSocketPool::GroupId kGroupId = TestGroupId(
5932 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_DISABLED);
5933 const ClientSocketPool::GroupId kGroupIdPrivacy = TestGroupId(
5934 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_ENABLED);
David Benjaminbac8dff2019-08-07 01:30:415935 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555936 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415937
5938 // Make a socket in each groups.
5939 ClientSocketHandle handle1, handle2, handle3;
5940 TestCompletionCallback callback;
5941 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525942 handle1.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415943 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5944 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5945 pool_.get(), NetLogWithSource()),
5946 IsOk());
5947 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525948 handle2.Init(kGroupIdPrivacy, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415949 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5950 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5951 pool_.get(), NetLogWithSource()),
5952 IsOk());
5953 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525954 handle3.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415955 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5956 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5957 pool_.get(), NetLogWithSource()),
5958 IsOk());
5959 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5960 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5961 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5962 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5963 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5964 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5965
5966 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5967
5968 // Active sockets continue to be active.
5969 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5970 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5971 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5972 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5973 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5974 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5975
5976 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
5977 // are unusable.
5978 handle1.Reset();
5979 handle2.Reset();
5980 handle3.Reset();
5981 EXPECT_EQ(1, pool_->IdleSocketCount());
5982 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5983 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5984 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5985 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5986}
5987
[email protected]f6d1d6eb2009-06-24 20:16:095988} // namespace
5989
5990} // namespace net