blob: 4201c684afcd193ad1815f9c1b47cbdcbbd8fd53 [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"
Eric Ortha9b8be02021-06-29 23:09:0851#include "net/socket/connect_job_factory.h"
tfarina5dd13c22016-11-16 12:08:2652#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2853#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5454#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1755#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4456#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1057#include "net/socket/stream_socket.h"
Matt Menke9fa17d52019-03-25 19:12:2658#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5159#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0160#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4061#include "net/test/test_with_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2862#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3863#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4864#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0965#include "testing/gtest/include/gtest/gtest.h"
Anton Bikineev068d2912021-05-15 20:43:5266#include "third_party/abseil-cpp/absl/types/optional.h"
Eric Ortha2e7773212021-06-22 21:49:5567#include "url/scheme_host_port.h"
68#include "url/url_constants.h"
[email protected]f6d1d6eb2009-06-24 20:16:0969
robpercival214763f2016-07-01 23:27:0170using net::test::IsError;
71using net::test::IsOk;
72
[email protected]51fdc7c2012-04-10 19:19:4873using ::testing::Invoke;
74using ::testing::Return;
75
[email protected]f6d1d6eb2009-06-24 20:16:0976namespace net {
77
78namespace {
79
[email protected]211d21722009-07-22 15:48:5380const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2081const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5982constexpr base::TimeDelta kUnusedIdleSocketTimeout =
83 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0184
Matt Menkebdf777802019-04-22 19:38:5985ClientSocketPool::GroupId TestGroupId(
Eric Ortha2e7773212021-06-22 21:49:5586 base::StringPiece host,
Matt Menkebdf777802019-04-22 19:38:5987 int port = 80,
Eric Ortha2e7773212021-06-22 21:49:5588 base::StringPiece scheme = url::kHttpScheme,
Matt Menke166443c2019-05-24 18:45:5989 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
90 NetworkIsolationKey network_isolation_key = NetworkIsolationKey()) {
Eric Ortha2e7773212021-06-22 21:49:5591 return ClientSocketPool::GroupId(url::SchemeHostPort(scheme, host, port),
dalyk5f48a132019-10-14 15:20:1992 privacy_mode, network_isolation_key,
Ben Schwartz3ff4dc1e62021-04-27 21:15:2393 SecureDnsPolicy::kAllow);
Matt Menkec6b3edf72019-03-19 17:00:3994}
95
[email protected]034df0f32013-01-07 23:17:4896// Make sure |handle| sets load times correctly when it has been assigned a
97// reused socket.
98void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
99 LoadTimingInfo load_timing_info;
100 // Only pass true in as |is_reused|, as in general, HttpStream types should
101 // have stricter concepts of reuse than socket pools.
102 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
103
104 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19105 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48106
[email protected]b258e0792013-01-12 07:11:59107 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
108 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48109}
110
111// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33112// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48113// of a connection where |is_reused| is false may consider the connection
114// reused.
115void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
116 EXPECT_FALSE(handle.is_reused());
117
118 LoadTimingInfo load_timing_info;
119 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
120
121 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19122 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48123
[email protected]b258e0792013-01-12 07:11:59124 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
125 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
126 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48127
128 TestLoadTimingInfoConnectedReused(handle);
129}
130
131// Make sure |handle| sets load times correctly, in the case that it does not
132// currently have a socket.
133void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
134 // Should only be set to true once a socket is assigned, if at all.
135 EXPECT_FALSE(handle.is_reused());
136
137 LoadTimingInfo load_timing_info;
138 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
139
140 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19141 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48142
[email protected]b258e0792013-01-12 07:11:59143 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
144 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48145}
146
[email protected]3268023f2011-05-05 00:08:10147class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09148 public:
[email protected]034df0f32013-01-07 23:17:48149 explicit MockClientSocket(net::NetLog* net_log)
150 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28151 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20152 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30153 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09154
[email protected]0dc88b32014-03-26 20:12:28155 // Sets whether the socket has unread data. If true, the next call to Read()
156 // will return 1 byte and IsConnectedAndIdle() will return false.
157 void set_has_unread_data(bool has_unread_data) {
158 has_unread_data_ = has_unread_data;
159 }
160
[email protected]3f55aa12011-12-07 02:03:33161 // Socket implementation.
dchengb03027d2014-10-21 12:00:20162 int Read(IOBuffer* /* buf */,
163 int len,
Brad Lassey3a814172018-04-26 03:30:21164 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28165 if (has_unread_data_ && len > 0) {
166 has_unread_data_ = false;
167 was_used_to_convey_data_ = true;
168 return 1;
169 }
[email protected]e86df8dc2013-03-30 13:18:28170 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33171 }
[email protected]ab838892009-06-30 18:49:05172
[email protected]a2b2cfc2017-12-06 09:06:08173 int Write(
174 IOBuffer* /* buf */,
175 int len,
Brad Lassey3a814172018-04-26 03:30:21176 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08177 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01178 was_used_to_convey_data_ = true;
179 return len;
[email protected]ab838892009-06-30 18:49:05180 }
Avi Drissman13fc8932015-12-20 04:40:46181 int SetReceiveBufferSize(int32_t size) override { return OK; }
182 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05183
[email protected]dbf036f2011-12-06 23:33:24184 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21185 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24186 connected_ = true;
187 return OK;
188 }
[email protected]f6d1d6eb2009-06-24 20:16:09189
dchengb03027d2014-10-21 12:00:20190 void Disconnect() override { connected_ = false; }
191 bool IsConnected() const override { return connected_; }
192 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28193 return connected_ && !has_unread_data_;
194 }
[email protected]0b7648c2009-07-06 20:14:01195
dchengb03027d2014-10-21 12:00:20196 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16197 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09198 }
[email protected]f6d1d6eb2009-06-24 20:16:09199
dchengb03027d2014-10-21 12:00:20200 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35201 return ERR_UNEXPECTED;
202 }
203
tfarina428341112016-09-22 13:38:20204 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02205
dchengb03027d2014-10-21 12:00:20206 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37207 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20208 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
209 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03210 void GetConnectionAttempts(ConnectionAttempts* out) const override {
211 out->clear();
212 }
213 void ClearConnectionAttempts() override {}
214 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49215 int64_t GetTotalReceivedBytes() const override {
216 NOTIMPLEMENTED();
217 return 0;
218 }
Paul Jensen0f49dec2017-12-12 23:39:58219 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45220
[email protected]f6d1d6eb2009-06-24 20:16:09221 private:
222 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28223 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20224 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01225 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09226
[email protected]ab838892009-06-30 18:49:05227 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09228};
229
[email protected]5fc08e32009-07-15 17:09:57230class TestConnectJob;
231
[email protected]f6d1d6eb2009-06-24 20:16:09232class MockClientSocketFactory : public ClientSocketFactory {
233 public:
[email protected]ab838892009-06-30 18:49:05234 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09235
danakj655b66c2016-04-16 00:51:38236 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04237 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41238 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19239 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41240 NOTREACHED();
David Benjamin24725be2019-07-24 20:57:18241 return nullptr;
[email protected]98b0e582011-06-22 14:31:41242 }
243
Helen Lid5bb9222018-04-12 15:33:09244 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07245 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38246 std::unique_ptr<
247 SocketPerformanceWatcher> /* socket_performance_watcher */,
Eric Roman2bc77162020-09-16 18:30:45248 NetworkQualityEstimator* /* network_quality_estimator */,
[email protected]0a0b7682010-08-25 17:08:07249 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19250 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09251 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09252 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09253 }
254
danakj655b66c2016-04-16 00:51:38255 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
David Benjamin24725be2019-07-24 20:57:18256 SSLClientContext* context,
Matt Menke841fc412019-03-05 23:20:12257 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27258 const HostPortPair& host_and_port,
David Benjamin24725be2019-07-24 20:57:18259 const SSLConfig& ssl_config) override {
[email protected]f6d1d6eb2009-06-24 20:16:09260 NOTIMPLEMENTED();
David Benjamin24725be2019-07-24 20:57:18261 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09262 }
Matt Menkefd956922019-02-04 23:44:03263
Matt Menke52cd95a2019-02-08 06:16:27264 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
265 std::unique_ptr<StreamSocket> stream_socket,
266 const std::string& user_agent,
267 const HostPortPair& endpoint,
268 const ProxyServer& proxy_server,
269 HttpAuthController* http_auth_controller,
270 bool tunnel,
271 bool using_spdy,
272 NextProto negotiated_protocol,
273 ProxyDelegate* proxy_delegate,
Matt Menke52cd95a2019-02-08 06:16:27274 const NetworkTrafficAnnotationTag& traffic_annotation) override {
275 NOTIMPLEMENTED();
276 return nullptr;
277 }
278
[email protected]5fc08e32009-07-15 17:09:57279 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55280
[email protected]5fc08e32009-07-15 17:09:57281 void SignalJobs();
282
[email protected]03b7c8c2013-07-20 04:38:55283 void SignalJob(size_t job);
284
285 void SetJobLoadState(size_t job, LoadState load_state);
286
Matt Menke141b87f22019-01-30 02:43:03287 // Sets the HasConnectionEstablished value of the specified job to true,
288 // without invoking the callback.
289 void SetJobHasEstablishedConnection(size_t job);
290
[email protected]f6d1d6eb2009-06-24 20:16:09291 int allocation_count() const { return allocation_count_; }
292
[email protected]f6d1d6eb2009-06-24 20:16:09293 private:
294 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57295 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09296};
297
[email protected]ab838892009-06-30 18:49:05298class TestConnectJob : public ConnectJob {
299 public:
300 enum JobType {
301 kMockJob,
302 kMockFailingJob,
303 kMockPendingJob,
304 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57305 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10306
307 // Certificate errors return a socket in addition to an error code.
308 kMockCertErrorJob,
309 kMockPendingCertErrorJob,
310
[email protected]e60e47a2010-07-14 03:37:18311 kMockAdditionalErrorStateJob,
312 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28313 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10314
315 kMockAuthChallengeOnceJob,
316 kMockAuthChallengeTwiceJob,
317 kMockAuthChallengeOnceFailingJob,
318 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05319 };
320
[email protected]994d4932010-07-12 17:55:13321 // The kMockPendingJob uses a slight delay before allowing the connect
322 // to complete.
323 static const int kPendingConnectDelay = 2;
324
[email protected]ab838892009-06-30 18:49:05325 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40326 RequestPriority request_priority,
327 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34328 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43329 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05330 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43331 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40332 : ConnectJob(request_priority,
333 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38334 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43335 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38336 delegate,
337 nullptr /* net_log */,
338 NetLogSourceType::TRANSPORT_CONNECT_JOB,
339 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58340 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05341 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18342 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03343 has_established_connection_(false),
Jeremy Romand54000b22019-07-08 18:40:16344 store_additional_error_state_(false) {}
[email protected]ab838892009-06-30 18:49:05345
[email protected]974ebd62009-08-03 23:14:34346 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13347 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34348 }
349
[email protected]03b7c8c2013-07-20 04:38:55350 void set_load_state(LoadState load_state) { load_state_ = load_state; }
351
Matt Menke141b87f22019-01-30 02:43:03352 void set_has_established_connection() {
353 DCHECK(!has_established_connection_);
354 has_established_connection_ = true;
355 }
356
[email protected]03b7c8c2013-07-20 04:38:55357 // From ConnectJob:
358
dchengb03027d2014-10-21 12:00:20359 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21360
Matt Menke141b87f22019-01-30 02:43:03361 bool HasEstablishedConnection() const override {
362 return has_established_connection_;
363 }
364
dalykedd30d982019-12-16 15:31:10365 ResolveErrorInfo GetResolveErrorInfo() const override {
366 return ResolveErrorInfo(OK);
367 }
368
Matt Menke6f84d1f12019-04-11 19:26:47369 bool IsSSLError() const override { return store_additional_error_state_; }
370
371 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
372 if (store_additional_error_state_)
373 return base::MakeRefCounted<SSLCertRequestInfo>();
374 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18375 }
376
[email protected]974ebd62009-08-03 23:14:34377 private:
[email protected]03b7c8c2013-07-20 04:38:55378 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05379
dchengb03027d2014-10-21 12:00:20380 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05381 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35382 client_socket_factory_->CreateTransportClientSocket(
Eric Roman2bc77162020-09-16 18:30:45383 ignored, nullptr, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05384 switch (job_type_) {
385 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13386 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10387 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05388 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13389 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10390 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05391 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57392 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47393
394 // Depending on execution timings, posting a delayed task can result
395 // in the task getting executed the at the earliest possible
396 // opportunity or only after returning once from the message loop and
397 // then a second call into the message loop. In order to make behavior
398 // more deterministic, we change the default delay to 2ms. This should
399 // always require us to wait for the second call into the message loop.
400 //
401 // N.B. The correct fix for this and similar timing problems is to
402 // abstract time for the purpose of unittests. Unfortunately, we have
403 // a lot of third-party components that directly call the various
404 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45405 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05406 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49407 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
408 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10409 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53410 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05411 return ERR_IO_PENDING;
412 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57413 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45414 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05415 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49416 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
417 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10418 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53419 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05420 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57421 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55422 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57423 client_socket_factory_->WaitForSignal(this);
424 waiting_success_ = true;
425 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10426 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13427 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10428 true /* cert_error */);
429 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13430 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45431 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13432 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49433 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
434 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10435 true /* async */, true /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53436 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13437 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18438 case kMockAdditionalErrorStateJob:
439 store_additional_error_state_ = true;
440 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10441 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18442 case kMockPendingAdditionalErrorStateJob:
443 set_load_state(LOAD_STATE_CONNECTING);
444 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45445 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18446 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49447 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
448 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10449 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53450 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18451 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28452 case kMockUnreadDataJob: {
453 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10454 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28455 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
456 return ret;
457 }
Matt Menkeb57663b32019-03-01 17:17:10458 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01459 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10460 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
461 return ERR_IO_PENDING;
462 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01463 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10464 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
465 return ERR_IO_PENDING;
466 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01467 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10468 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
469 return ERR_IO_PENDING;
470 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01471 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10472 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
473 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05474 default:
475 NOTREACHED();
Anton Bikineev068d2912021-05-15 20:43:52476 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05477 return ERR_FAILED;
478 }
479 }
480
Lily Chen02ef29a2018-11-30 16:31:43481 void ChangePriorityInternal(RequestPriority priority) override {}
482
Matt Menkeb57663b32019-03-01 17:17:10483 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13484 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03485 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05486 if (succeed) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19487 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52488 absl::nullopt);
Bence Békybdbb0e72018-08-07 21:42:59489 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10490 } else if (cert_error) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19491 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
Anton Bikineev068d2912021-05-15 20:43:52492 absl::nullopt);
Matt Menkeb57663b32019-03-01 17:17:10493 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40494 } else {
[email protected]e772db3f2010-07-12 18:11:13495 result = ERR_CONNECTION_FAILED;
Anton Bikineev068d2912021-05-15 20:43:52496 SetSocket(std::unique_ptr<StreamSocket>(), absl::nullopt);
[email protected]ab838892009-06-30 18:49:05497 }
[email protected]2ab05b52009-07-01 23:57:58498
499 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30500 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05501 return result;
502 }
503
Matt Menkeb57663b32019-03-01 17:17:10504 void DoAdvanceAuthChallenge(int remaining_challenges,
505 bool succeed_after_last_challenge) {
506 base::ThreadTaskRunnerHandle::Get()->PostTask(
507 FROM_HERE,
508 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
509 weak_factory_.GetWeakPtr(), remaining_challenges,
510 succeed_after_last_challenge));
511 }
512
513 void InvokeNextProxyAuthCallback(int remaining_challenges,
514 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01515 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10516 if (remaining_challenges == 0) {
517 DoConnect(succeed_after_last_challenge, true /* was_async */,
518 false /* cert_error */);
519 return;
520 }
521
522 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
523 // The auth tests here are just focused on ConnectJob bookkeeping.
524 HttpResponseInfo info;
525 NotifyDelegateOfProxyAuth(
526 info, nullptr /* http_auth_controller */,
527 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
528 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
529 succeed_after_last_challenge));
530 }
531
[email protected]5fc08e32009-07-15 17:09:57532 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05533 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57534 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21535 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03536 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18537 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05538
Jeremy Romand54000b22019-07-08 18:40:16539 base::WeakPtrFactory<TestConnectJob> weak_factory_{this};
[email protected]d5492c52013-11-10 20:44:39540
[email protected]ab838892009-06-30 18:49:05541 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
542};
543
Eric Ortha9b8be02021-06-29 23:09:08544class TestConnectJobFactory : public ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05545 public:
Eric Ortha9b8be02021-06-29 23:09:08546 explicit TestConnectJobFactory(MockClientSocketFactory* client_socket_factory)
547 : client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05548
Peter Boström293b1342021-09-22 17:31:43549 TestConnectJobFactory(const TestConnectJobFactory&) = delete;
550 TestConnectJobFactory& operator=(const TestConnectJobFactory&) = delete;
551
Chris Watkins7a41d3552017-12-01 02:13:27552 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05553
554 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
555
[email protected]51fdc7c2012-04-10 19:19:48556 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
557 job_types_ = job_types;
558 CHECK(!job_types_->empty());
559 }
560
[email protected]974ebd62009-08-03 23:14:34561 void set_timeout_duration(base::TimeDelta timeout_duration) {
562 timeout_duration_ = timeout_duration;
563 }
564
[email protected]3f55aa12011-12-07 02:03:33565 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55566
Eric Ortha9b8be02021-06-29 23:09:08567 std::unique_ptr<ConnectJob> CreateConnectJob(
Eric Orthc98a3e62021-07-02 17:46:37568 Endpoint endpoint,
Eric Ortha9b8be02021-06-29 23:09:08569 const ProxyServer& proxy_server,
Anton Bikineev068d2912021-05-15 20:43:52570 const absl::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Eric Ortha9b8be02021-06-29 23:09:08571 const SSLConfig* ssl_config_for_origin,
572 const SSLConfig* ssl_config_for_proxy,
573 bool force_tunnel,
574 PrivacyMode privacy_mode,
575 const OnHostResolutionCallback& resolution_callback,
Matt Menke16f5c2e52019-03-25 21:50:40576 RequestPriority request_priority,
577 SocketTag socket_tag,
Eric Ortha9b8be02021-06-29 23:09:08578 const NetworkIsolationKey& network_isolation_key,
579 SecureDnsPolicy secure_dns_policy,
580 const CommonConnectJobParams* common_connect_job_params,
mostynbba063d6032014-10-09 11:01:13581 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48582 EXPECT_TRUE(!job_types_ || !job_types_->empty());
583 TestConnectJob::JobType job_type = job_type_;
584 if (job_types_ && !job_types_->empty()) {
585 job_type = job_types_->front();
586 job_types_->pop_front();
587 }
Matt Menkea6f99ad2019-03-08 02:26:43588 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40589 job_type, request_priority, socket_tag, timeout_duration_,
Eric Ortha9b8be02021-06-29 23:09:08590 common_connect_job_params, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05591 }
592
593 private:
Eric Ortha9b8be02021-06-29 23:09:08594 TestConnectJob::JobType job_type_ = TestConnectJob::kMockJob;
595 std::list<TestConnectJob::JobType>* job_types_ = nullptr;
[email protected]974ebd62009-08-03 23:14:34596 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57597 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05598};
599
[email protected]a937a06d2009-08-19 21:19:24600} // namespace
601
[email protected]a937a06d2009-08-19 21:19:24602namespace {
603
[email protected]5fc08e32009-07-15 17:09:57604void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26605 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57606 (*it)->Signal();
607 }
608 waiting_jobs_.clear();
609}
610
[email protected]03b7c8c2013-07-20 04:38:55611void MockClientSocketFactory::SignalJob(size_t job) {
612 ASSERT_LT(job, waiting_jobs_.size());
613 waiting_jobs_[job]->Signal();
614 waiting_jobs_.erase(waiting_jobs_.begin() + job);
615}
616
617void MockClientSocketFactory::SetJobLoadState(size_t job,
618 LoadState load_state) {
619 ASSERT_LT(job, waiting_jobs_.size());
620 waiting_jobs_[job]->set_load_state(load_state);
621}
622
Matt Menke141b87f22019-01-30 02:43:03623void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
624 ASSERT_LT(job, waiting_jobs_.size());
625 waiting_jobs_[job]->set_has_established_connection();
626}
627
Gabriel Charette694c3c332019-08-19 14:53:05628class ClientSocketPoolBaseTest : public TestWithTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09629 protected:
Alex Clarke0def2092018-12-10 12:01:45630 ClientSocketPoolBaseTest()
Gabriel Charette694c3c332019-08-19 14:53:05631 : TestWithTaskEnvironment(
632 base::test::TaskEnvironment::TimeSource::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03633 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54634 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40635 TransportClientSocketPool::connect_backup_jobs_enabled();
636 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54637 }
[email protected]2431756e2010-09-29 20:26:13638
dcheng67be2b1f2014-10-27 21:47:29639 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40640 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54641 connect_backup_jobs_enabled_);
642 }
[email protected]c9d6a1d2009-07-14 16:15:20643
Matt Menke9fa17d52019-03-25 19:12:26644 void CreatePool(int max_sockets,
645 int max_sockets_per_group,
646 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59647 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
648 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26649 ClientSocketPool::used_idle_socket_timeout(),
650 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16651 }
652
David Benjaminbac8dff2019-08-07 01:30:41653 void CreatePoolWithIdleTimeouts(
654 int max_sockets,
655 int max_sockets_per_group,
656 base::TimeDelta unused_idle_socket_timeout,
657 base::TimeDelta used_idle_socket_timeout,
658 bool enable_backup_connect_jobs = false,
659 ProxyServer proxy_server = ProxyServer::Direct()) {
[email protected]c9d6a1d2009-07-14 16:15:20660 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26661 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
Eric Ortha9b8be02021-06-29 23:09:08662 std::make_unique<TestConnectJobFactory>(&client_socket_factory_);
Matt Menke9fa17d52019-03-25 19:12:26663 connect_job_factory_ = connect_job_factory.get();
664 pool_ = TransportClientSocketPool::CreateForTesting(
665 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
Eric Ortha9b8be02021-06-29 23:09:08666 used_idle_socket_timeout, proxy_server, /*is_for_websockets=*/false,
667 &common_connect_job_params_, std::move(connect_job_factory),
Matt Menke9fa17d52019-03-25 19:12:26668 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20669 }
[email protected]f6d1d6eb2009-06-24 20:16:09670
mmenked3641e12016-01-28 16:06:15671 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39672 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33673 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15674 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39675 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15676 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33677 }
678
Matt Menkec6b3edf72019-03-19 17:00:39679 int StartRequest(const ClientSocketPool::GroupId& group_id,
680 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15681 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39682 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09683 }
684
[email protected]2431756e2010-09-29 20:26:13685 int GetOrderOfRequest(size_t index) const {
686 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09687 }
688
[email protected]2431756e2010-09-29 20:26:13689 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
690 return test_base_.ReleaseOneConnection(keep_alive);
691 }
692
693 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
694 test_base_.ReleaseAllConnections(keep_alive);
695 }
696
Matt Menke433de6d2020-03-04 00:24:11697 // Expects a single NetLogEventType::SOCKET_POOL_CLOSING_SOCKET in |net_log_|.
698 // It should be logged for the provided source and have the indicated reason.
699 void ExpectSocketClosedWithReason(NetLogSource expected_source,
700 const char* expected_reason) {
701 auto entries = net_log_.GetEntriesForSourceWithType(
702 expected_source, NetLogEventType::SOCKET_POOL_CLOSING_SOCKET,
703 NetLogEventPhase::NONE);
704 ASSERT_EQ(1u, entries.size());
705 ASSERT_TRUE(entries[0].HasParams());
706 ASSERT_TRUE(entries[0].params.is_dict());
707 const std::string* reason = entries[0].params.FindStringKey("reason");
708 ASSERT_TRUE(reason);
709 EXPECT_EQ(expected_reason, *reason);
710 }
711
[email protected]2431756e2010-09-29 20:26:13712 TestSocketRequest* request(int i) { return test_base_.request(i); }
713 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38714 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42715 return test_base_.requests();
716 }
rdsmith29dbad12017-02-17 02:22:18717 // Only counts the requests that get sockets asynchronously;
718 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13719 size_t completion_count() const { return test_base_.completion_count(); }
720
Matt Muellerd9342e3a2019-11-26 01:41:14721 RecordingTestNetLog net_log_;
Eric Ortha9b8be02021-06-29 23:09:08722 const CommonConnectJobParams common_connect_job_params_{
723 nullptr /* client_socket_factory */,
724 nullptr /* host_resolver */,
725 nullptr /* http_auth_cache */,
726 nullptr /* http_auth_handler_factory */,
727 nullptr /* spdy_session_pool */,
728 nullptr /* quic_supported_versions */,
729 nullptr /* quic_stream_factory */,
730 nullptr /* proxy_delegate */,
731 nullptr /* http_user_agent_settings */,
732 nullptr /* ssl_client_context */,
733 nullptr /* socket_performance_watcher_factory */,
734 nullptr /* network_quality_estimator */,
735 &net_log_,
736 nullptr /* websocket_endpoint_lock_manager */};
[email protected]636b8252011-04-08 19:56:54737 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09738 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04739 TestConnectJobFactory* connect_job_factory_;
Matt Menke9fa17d52019-03-25 19:12:26740 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19741 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26742 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13743 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09744};
745
[email protected]5fc08e32009-07-15 17:09:57746TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53747 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20748
[email protected]6ecf2b92011-12-15 01:14:52749 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06750 ClientSocketHandle handle;
Matt Muellerd9342e3a2019-11-26 01:41:14751 RecordingBoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48752 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53753
Matt Menkef09e64c2019-04-23 22:16:28754 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:52755 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28756 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
757 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
758 pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09759 EXPECT_TRUE(handle.is_initialized());
760 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48761 TestLoadTimingInfoConnectedNotReused(handle);
762
[email protected]f6d1d6eb2009-06-24 20:16:09763 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48764 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30765
Eric Roman79cc7552019-07-19 02:17:54766 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40767
Matt Menke9fa17d52019-03-25 19:12:26768 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53769 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26770 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00771 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26772 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
773 EXPECT_TRUE(LogContainsEvent(
774 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
775 NetLogEventPhase::NONE));
776 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00777 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
778 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26779 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09780}
781
[email protected]ab838892009-06-30 18:49:05782TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53783 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20784
[email protected]ab838892009-06-30 18:49:05785 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Muellerd9342e3a2019-11-26 01:41:14786 RecordingBoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53787
[email protected]2431756e2010-09-29 20:26:13788 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52789 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18790 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13791 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51792 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50793 EXPECT_EQ(
794 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:52795 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:28796 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
797 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
798 pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13799 EXPECT_FALSE(handle.socket());
800 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51801 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48802 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30803
Eric Roman79cc7552019-07-19 02:17:54804 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40805
Matt Menke9fa17d52019-03-25 19:12:26806 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17807 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26808 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00809 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26810 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
811 EXPECT_TRUE(LogContainsEvent(
812 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
813 NetLogEventPhase::NONE));
814 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09815}
816
Matt Menke433de6d2020-03-04 00:24:11817// Test releasing an open socket into the socket pool, telling the socket pool
818// to close the socket.
819TEST_F(ClientSocketPoolBaseTest, ReleaseAndCloseConnection) {
820 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
821
822 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
823 ASSERT_TRUE(request(0)->handle()->socket());
824 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
825 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
826
827 EXPECT_EQ(0, pool_->IdleSocketCount());
828 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
829
830 ExpectSocketClosedWithReason(
831 source, TransportClientSocketPool::kClosedConnectionReturnedToPool);
832}
833
834TEST_F(ClientSocketPoolBaseTest, SocketWithUnreadDataReturnedToPool) {
835 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
836 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
837
838 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
839 ASSERT_TRUE(request(0)->handle()->socket());
840 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
841 EXPECT_TRUE(request(0)->handle()->socket()->IsConnected());
842 EXPECT_FALSE(request(0)->handle()->socket()->IsConnectedAndIdle());
843 ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE);
844
845 EXPECT_EQ(0, pool_->IdleSocketCount());
846 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
847
848 ExpectSocketClosedWithReason(
849 source, TransportClientSocketPool::kDataReceivedUnexpectedly);
850}
851
Matt Menkef6edce752019-03-19 17:21:56852// Make sure different groups do not share sockets.
853TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59854 base::test::ScopedFeatureList feature_list;
855 feature_list.InitAndEnableFeature(
856 features::kPartitionConnectionsByNetworkIsolationKey);
857
Matt Menkef6edce752019-03-19 17:21:56858 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
859
860 const HostPortPair kHostPortPairs[] = {
861 {"a", 80},
862 {"a", 443},
863 {"b", 80},
864 };
865
Eric Ortha2e7773212021-06-22 21:49:55866 const char* const kSchemes[] = {
867 url::kHttpScheme,
868 url::kHttpsScheme,
Matt Menkef6edce752019-03-19 17:21:56869 };
870
Matt Menkebdf777802019-04-22 19:38:59871 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
872 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56873
Matt Menke4807a9a2020-11-21 00:14:41874 const SchemefulSite kSiteA(GURL("http://a.test/"));
875 const SchemefulSite kSiteB(GURL("http://b.test/"));
Matt Menke166443c2019-05-24 18:45:59876 const NetworkIsolationKey kNetworkIsolationKeys[] = {
Matt Menke4807a9a2020-11-21 00:14:41877 NetworkIsolationKey(kSiteA, kSiteA),
878 NetworkIsolationKey(kSiteB, kSiteB),
Matt Menke166443c2019-05-24 18:45:59879 };
880
Ben Schwartz3ff4dc1e62021-04-27 21:15:23881 const SecureDnsPolicy kSecureDnsPolicys[] = {SecureDnsPolicy::kAllow,
882 SecureDnsPolicy::kDisable};
dalyk5f48a132019-10-14 15:20:19883
Matt Menkef6edce752019-03-19 17:21:56884 int total_idle_sockets = 0;
885
886 // Walk through each GroupId, making sure that requesting a socket for one
887 // group does not return a previously connected socket for another group.
888 for (const auto& host_port_pair : kHostPortPairs) {
889 SCOPED_TRACE(host_port_pair.ToString());
Eric Ortha2e7773212021-06-22 21:49:55890 for (const char* scheme : kSchemes) {
891 SCOPED_TRACE(scheme);
Matt Menkef6edce752019-03-19 17:21:56892 for (const auto& privacy_mode : kPrivacyModes) {
893 SCOPED_TRACE(privacy_mode);
Matt Menke166443c2019-05-24 18:45:59894 for (const auto& network_isolation_key : kNetworkIsolationKeys) {
895 SCOPED_TRACE(network_isolation_key.ToString());
Ben Schwartz3ff4dc1e62021-04-27 21:15:23896 for (const auto& secure_dns_policy : kSecureDnsPolicys) {
897 SCOPED_TRACE(static_cast<int>(secure_dns_policy));
Matt Menkef6edce752019-03-19 17:21:56898
dalyk5f48a132019-10-14 15:20:19899 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56900
dalyk5f48a132019-10-14 15:20:19901 ClientSocketPool::GroupId group_id(
Eric Ortha2e7773212021-06-22 21:49:55902 url::SchemeHostPort(scheme, host_port_pair.host(),
903 host_port_pair.port()),
904 privacy_mode, network_isolation_key, secure_dns_policy);
Matt Menkef6edce752019-03-19 17:21:56905
dalyk5f48a132019-10-14 15:20:19906 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56907
dalyk5f48a132019-10-14 15:20:19908 TestCompletionCallback callback;
909 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56910
dalyk5f48a132019-10-14 15:20:19911 // Since the group is empty, requesting a socket should not complete
912 // synchronously.
Anton Bikineev068d2912021-05-15 20:43:52913 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19914 DEFAULT_PRIORITY, SocketTag(),
915 ClientSocketPool::RespectLimits::ENABLED,
916 callback.callback(),
917 ClientSocketPool::ProxyAuthCallback(),
918 pool_.get(), NetLogWithSource()),
919 IsError(ERR_IO_PENDING));
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 EXPECT_THAT(callback.WaitForResult(), IsOk());
924 EXPECT_TRUE(handle.socket());
925 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
926 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56927
dalyk5f48a132019-10-14 15:20:19928 // Return socket to pool.
929 handle.Reset();
930 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56931
dalyk5f48a132019-10-14 15:20:19932 // Requesting a socket again should return the same socket as
933 // before, so should complete synchronously.
Anton Bikineev068d2912021-05-15 20:43:52934 EXPECT_THAT(handle.Init(group_id, params_, absl::nullopt,
dalyk5f48a132019-10-14 15:20:19935 DEFAULT_PRIORITY, SocketTag(),
936 ClientSocketPool::RespectLimits::ENABLED,
937 callback.callback(),
938 ClientSocketPool::ProxyAuthCallback(),
939 pool_.get(), NetLogWithSource()),
940 IsOk());
941 EXPECT_TRUE(handle.socket());
942 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56943
dalyk5f48a132019-10-14 15:20:19944 // Return socket to pool again.
945 handle.Reset();
946 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56947
dalyk5f48a132019-10-14 15:20:19948 ++total_idle_sockets;
949 }
Matt Menke166443c2019-05-24 18:45:59950 }
Matt Menkef6edce752019-03-19 17:21:56951 }
952 }
953 }
954}
955
[email protected]211d21722009-07-22 15:48:53956TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
957 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
958
[email protected]9e743cd2010-03-16 07:03:53959 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30960
Matt Menkec6b3edf72019-03-19 17:00:39961 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
962 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
963 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
964 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53965
[email protected]2431756e2010-09-29 20:26:13966 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53967 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13968 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53969
Matt Menkec6b3edf72019-03-19 17:00:39970 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
971 IsError(ERR_IO_PENDING));
972 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
973 IsError(ERR_IO_PENDING));
974 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
975 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53976
[email protected]2431756e2010-09-29 20:26:13977 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53978
[email protected]2431756e2010-09-29 20:26:13979 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53980 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13981 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53982
983 EXPECT_EQ(1, GetOrderOfRequest(1));
984 EXPECT_EQ(2, GetOrderOfRequest(2));
985 EXPECT_EQ(3, GetOrderOfRequest(3));
986 EXPECT_EQ(4, GetOrderOfRequest(4));
987 EXPECT_EQ(5, GetOrderOfRequest(5));
988 EXPECT_EQ(6, GetOrderOfRequest(6));
989 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17990
991 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13992 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53993}
994
995TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
996 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
997
[email protected]9e743cd2010-03-16 07:03:53998 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30999
[email protected]211d21722009-07-22 15:48:531000 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:391001 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1002 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1003 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1004 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531005
[email protected]2431756e2010-09-29 20:26:131006 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531007 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131008 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531009
1010 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:391011 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1012 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531013
[email protected]2431756e2010-09-29 20:26:131014 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531015
[email protected]2431756e2010-09-29 20:26:131016 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531017 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131018 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531019
1020 EXPECT_EQ(1, GetOrderOfRequest(1));
1021 EXPECT_EQ(2, GetOrderOfRequest(2));
1022 EXPECT_EQ(3, GetOrderOfRequest(3));
1023 EXPECT_EQ(4, GetOrderOfRequest(4));
1024 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:171025
1026 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131027 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531028}
1029
1030TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
1031 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1032
Matt Menkec6b3edf72019-03-19 17:00:391033 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
1034 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
1035 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1036 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:531037
[email protected]2431756e2010-09-29 20:26:131038 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531039 client_socket_factory_.allocation_count());
1040
Matt Menkec6b3edf72019-03-19 17:00:391041 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
1042 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1043 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531044
[email protected]2431756e2010-09-29 20:26:131045 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531046
[email protected]2431756e2010-09-29 20:26:131047 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531048
1049 // First 4 requests don't have to wait, and finish in order.
1050 EXPECT_EQ(1, GetOrderOfRequest(1));
1051 EXPECT_EQ(2, GetOrderOfRequest(2));
1052 EXPECT_EQ(3, GetOrderOfRequest(3));
1053 EXPECT_EQ(4, GetOrderOfRequest(4));
1054
Matt Menkec6b3edf72019-03-19 17:00:391055 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1056 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531057 EXPECT_EQ(7, GetOrderOfRequest(5));
1058 EXPECT_EQ(6, GetOrderOfRequest(6));
1059 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171060
1061 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131062 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531063}
1064
rdsmith29dbad12017-02-17 02:22:181065// Test reprioritizing a request before completion doesn't interfere with
1066// its completion.
1067TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1068 CreatePool(kDefaultMaxSockets, 1);
1069
Matt Menkec6b3edf72019-03-19 17:00:391070 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1071 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181072 EXPECT_TRUE(request(0)->handle()->socket());
1073 EXPECT_FALSE(request(1)->handle()->socket());
1074
Lily Chenecebf932018-11-02 17:15:431075 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181076
1077 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1078
1079 EXPECT_TRUE(request(1)->handle()->socket());
1080}
1081
1082// Reprioritize a request up past another one and make sure that changes the
1083// completion order.
1084TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1085 CreatePool(kDefaultMaxSockets, 1);
1086
Matt Menkec6b3edf72019-03-19 17:00:391087 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1088 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1089 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181090 EXPECT_TRUE(request(0)->handle()->socket());
1091 EXPECT_FALSE(request(1)->handle()->socket());
1092 EXPECT_FALSE(request(2)->handle()->socket());
1093
1094 request(2)->handle()->SetPriority(HIGHEST);
1095
1096 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1097
1098 EXPECT_EQ(1, GetOrderOfRequest(1));
1099 EXPECT_EQ(3, GetOrderOfRequest(2));
1100 EXPECT_EQ(2, GetOrderOfRequest(3));
1101}
1102
1103// Reprioritize a request without changing relative priorities and check
1104// that the order doesn't change.
1105TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1106 CreatePool(kDefaultMaxSockets, 1);
1107
Matt Menkec6b3edf72019-03-19 17:00:391108 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1109 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1110 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181111 EXPECT_TRUE(request(0)->handle()->socket());
1112 EXPECT_FALSE(request(1)->handle()->socket());
1113 EXPECT_FALSE(request(2)->handle()->socket());
1114
1115 request(2)->handle()->SetPriority(MEDIUM);
1116
1117 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1118
1119 EXPECT_EQ(1, GetOrderOfRequest(1));
1120 EXPECT_EQ(2, GetOrderOfRequest(2));
1121 EXPECT_EQ(3, GetOrderOfRequest(3));
1122}
1123
1124// Reprioritize a request past down another one and make sure that changes the
1125// completion order.
1126TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1127 CreatePool(kDefaultMaxSockets, 1);
1128
Matt Menkec6b3edf72019-03-19 17:00:391129 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1130 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1131 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181132 EXPECT_TRUE(request(0)->handle()->socket());
1133 EXPECT_FALSE(request(1)->handle()->socket());
1134 EXPECT_FALSE(request(2)->handle()->socket());
1135
1136 request(1)->handle()->SetPriority(LOW);
1137
1138 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1139
1140 EXPECT_EQ(1, GetOrderOfRequest(1));
1141 EXPECT_EQ(3, GetOrderOfRequest(2));
1142 EXPECT_EQ(2, GetOrderOfRequest(3));
1143}
1144
1145// Reprioritize a request to the same level as another and confirm it is
1146// put after the old request.
1147TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1148 CreatePool(kDefaultMaxSockets, 1);
1149
Matt Menkec6b3edf72019-03-19 17:00:391150 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1151 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1152 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181153 EXPECT_TRUE(request(0)->handle()->socket());
1154 EXPECT_FALSE(request(1)->handle()->socket());
1155 EXPECT_FALSE(request(2)->handle()->socket());
1156
1157 request(1)->handle()->SetPriority(MEDIUM);
1158
1159 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1160
1161 EXPECT_EQ(1, GetOrderOfRequest(1));
1162 EXPECT_EQ(3, GetOrderOfRequest(2));
1163 EXPECT_EQ(2, GetOrderOfRequest(3));
1164}
1165
[email protected]211d21722009-07-22 15:48:531166TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1167 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1168
Matt Menkec6b3edf72019-03-19 17:00:391169 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1170 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1171 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1172 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531173
[email protected]2431756e2010-09-29 20:26:131174 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531175 client_socket_factory_.allocation_count());
1176
Matt Menkec6b3edf72019-03-19 17:00:391177 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1178 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1179 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531180
[email protected]2431756e2010-09-29 20:26:131181 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531182
[email protected]2431756e2010-09-29 20:26:131183 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531184 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131185 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531186
1187 // First 4 requests don't have to wait, and finish in order.
1188 EXPECT_EQ(1, GetOrderOfRequest(1));
1189 EXPECT_EQ(2, GetOrderOfRequest(2));
1190 EXPECT_EQ(3, GetOrderOfRequest(3));
1191 EXPECT_EQ(4, GetOrderOfRequest(4));
1192
1193 // Request ("b", 7) has the highest priority, but we can't make new socket for
1194 // group "b", because it has reached the per-group limit. Then we make
1195 // socket for ("c", 6), because it has higher priority than ("a", 4),
1196 // and we still can't make a socket for group "b".
1197 EXPECT_EQ(5, GetOrderOfRequest(5));
1198 EXPECT_EQ(6, GetOrderOfRequest(6));
1199 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171200
1201 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131202 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531203}
1204
1205// Make sure that we count connecting sockets against the total limit.
1206TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1207 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1208
Matt Menkec6b3edf72019-03-19 17:00:391209 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1210 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1211 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531212
1213 // Create one asynchronous request.
1214 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391215 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1216 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531217
[email protected]6b175382009-10-13 06:47:471218 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1219 // actually become pending until 2ms after they have been created. In order
1220 // to flush all tasks, we need to wait so that we know there are no
1221 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451222 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471223
[email protected]211d21722009-07-22 15:48:531224 // The next synchronous request should wait for its turn.
1225 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391226 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1227 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531228
[email protected]2431756e2010-09-29 20:26:131229 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531230
[email protected]2431756e2010-09-29 20:26:131231 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531232 client_socket_factory_.allocation_count());
1233
1234 EXPECT_EQ(1, GetOrderOfRequest(1));
1235 EXPECT_EQ(2, GetOrderOfRequest(2));
1236 EXPECT_EQ(3, GetOrderOfRequest(3));
1237 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171238 EXPECT_EQ(5, GetOrderOfRequest(5));
1239
1240 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131241 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531242}
1243
[email protected]6427fe22010-04-16 22:27:411244TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1245 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1246 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1247
Matt Menkec6b3edf72019-03-19 17:00:391248 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1249 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1250 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1251 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411252
1253 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1254
1255 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1256
Matt Menkec6b3edf72019-03-19 17:00:391257 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1258 IsError(ERR_IO_PENDING));
1259 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1260 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411261
1262 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1263
[email protected]2431756e2010-09-29 20:26:131264 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411265 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131266 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411267 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131268 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1269 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411270 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1271}
1272
[email protected]d7027bb2010-05-10 18:58:541273TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1274 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1275 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1276
1277 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521278 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501279 EXPECT_EQ(
1280 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521281 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281282 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1283 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1284 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541285
1286 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241287 for (size_t i = 0; i < base::size(handles); ++i) {
Matt Menke28ac03e2019-02-25 22:25:501288 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391289 handles[i].Init(
Anton Bikineev068d2912021-05-15 20:43:521290 TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281291 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1292 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1293 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541294 }
1295
1296 // One will be stalled, cancel all the handles now.
1297 // This should hit the OnAvailableSocketSlot() code where we previously had
1298 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241299 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541300 handles[i].Reset();
1301}
1302
[email protected]eb5a99382010-07-11 03:18:261303TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541304 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1305 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1306
[email protected]eb5a99382010-07-11 03:18:261307 {
1308 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521309 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261310 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Eric Ortha2e7773212021-06-22 21:49:551311 EXPECT_EQ(OK, handles[i].Init(TestGroupId("a" + base::NumberToString(i)),
1312 params_, absl::nullopt, DEFAULT_PRIORITY,
1313 SocketTag(),
1314 ClientSocketPool::RespectLimits::ENABLED,
1315 callbacks[i].callback(),
1316 ClientSocketPool::ProxyAuthCallback(),
1317 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261318 }
1319
1320 // Force a stalled group.
1321 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521322 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201323 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391324 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521325 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281326 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1327 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1328 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261329
1330 // Cancel the stalled request.
1331 stalled_handle.Reset();
1332
1333 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1334 EXPECT_EQ(0, pool_->IdleSocketCount());
1335
1336 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541337 }
1338
[email protected]43a21b82010-06-10 21:30:541339 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1340 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261341}
[email protected]43a21b82010-06-10 21:30:541342
[email protected]eb5a99382010-07-11 03:18:261343TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1344 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1345 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1346
1347 {
1348 ClientSocketHandle handles[kDefaultMaxSockets];
1349 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521350 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201351 EXPECT_EQ(ERR_IO_PENDING,
Eric Ortha2e7773212021-06-22 21:49:551352 handles[i].Init(
1353 TestGroupId("a" + base::NumberToString(i)), params_,
1354 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1355 ClientSocketPool::RespectLimits::ENABLED,
1356 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1357 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261358 }
1359
1360 // Force a stalled group.
1361 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1362 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521363 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201364 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391365 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521366 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281367 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1368 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1369 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261370
1371 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261372 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1373 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1374 TestGroupId("foo")));
1375 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1376 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261377
1378 // Cancel the stalled request.
1379 handles[0].Reset();
1380
[email protected]eb5a99382010-07-11 03:18:261381 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261382 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1383 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1384 TestGroupId("foo")));
1385 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1386 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261387
1388 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011389 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261390
1391 EXPECT_EQ(kDefaultMaxSockets + 1,
1392 client_socket_factory_.allocation_count());
1393 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261394 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1395 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1396 TestGroupId("foo")));
1397 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1398 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261399
1400 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541401 }
1402
[email protected]eb5a99382010-07-11 03:18:261403 EXPECT_EQ(1, pool_->IdleSocketCount());
1404}
[email protected]43a21b82010-06-10 21:30:541405
[email protected]eb5a99382010-07-11 03:18:261406TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1407 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1408 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541409
[email protected]eb5a99382010-07-11 03:18:261410 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521411 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261412 {
[email protected]51fdc7c2012-04-10 19:19:481413 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261414 ClientSocketHandle handles[kDefaultMaxSockets];
1415 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:391416 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281417 OK, handles[i].Init(
Eric Ortha2e7773212021-06-22 21:49:551418 TestGroupId(base::StringPrintf("take-2-%d", i)), params_,
Anton Bikineev068d2912021-05-15 20:43:521419 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:281420 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1421 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1422 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261423 }
1424
1425 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1426 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481427 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261428
1429 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201430 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391431 stalled_handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521432 TestGroupId("foo"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281433 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1434 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1435 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481436 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261437
1438 // Dropping out of scope will close all handles and return them to idle.
1439 }
[email protected]43a21b82010-06-10 21:30:541440
1441 // But if we wait for it, the released idle sockets will be closed in
1442 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011443 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261444
1445 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1446 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541447}
1448
1449// Regression test for http://crbug.com/40952.
1450TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261451 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1452 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541453 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1454
1455 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1456 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521457 TestCompletionCallback callback;
Eric Ortha2e7773212021-06-22 21:49:551458 EXPECT_EQ(
1459 OK,
1460 handle.Init(TestGroupId("a" + base::NumberToString(i)), params_,
1461 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
1462 ClientSocketPool::RespectLimits::ENABLED,
1463 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1464 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541465 }
1466
1467 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281468 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541469
1470 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1471 // reuse a socket.
1472 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1473 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521474 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541475
Eric Ortha2e7773212021-06-22 21:49:551476 // "a0" is special here, since it should be the first entry in the sorted map,
[email protected]43a21b82010-06-10 21:30:541477 // which is the one which we would close an idle socket for. We shouldn't
1478 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391479 EXPECT_EQ(OK, handle.Init(
Eric Ortha2e7773212021-06-22 21:49:551480 TestGroupId("a0"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281481 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391482 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1483 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541484
1485 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1486 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1487}
1488
[email protected]ab838892009-06-30 18:49:051489TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531490 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091491
Matt Menkec6b3edf72019-03-19 17:00:391492 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1493 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1494 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1495 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1496 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1497 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1498 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1499 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091500
[email protected]2431756e2010-09-29 20:26:131501 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201502 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1503 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131504 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1505 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091506
[email protected]c9d6a1d2009-07-14 16:15:201507 EXPECT_EQ(1, GetOrderOfRequest(1));
1508 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031509 EXPECT_EQ(8, GetOrderOfRequest(3));
1510 EXPECT_EQ(6, GetOrderOfRequest(4));
1511 EXPECT_EQ(4, GetOrderOfRequest(5));
1512 EXPECT_EQ(3, GetOrderOfRequest(6));
1513 EXPECT_EQ(5, GetOrderOfRequest(7));
1514 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171515
1516 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131517 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091518}
1519
[email protected]ab838892009-06-30 18:49:051520TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531521 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091522
Matt Menkec6b3edf72019-03-19 17:00:391523 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1524 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1525 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1526 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1527 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1528 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1529 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091530
[email protected]2431756e2010-09-29 20:26:131531 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091532
[email protected]2431756e2010-09-29 20:26:131533 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011534 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201535
[email protected]2431756e2010-09-29 20:26:131536 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201537 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131538 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1539 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091540}
1541
Matt Menke7eb405e2019-04-25 20:48:211542TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1543 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1544
1545 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1546 ClientSocketHandle handle;
1547 TestCompletionCallback callback;
1548 EXPECT_EQ(
1549 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521550 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke7eb405e2019-04-25 20:48:211551 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1552 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1553 pool_.get(), NetLogWithSource()));
1554
1555 EXPECT_THAT(callback.WaitForResult(), IsOk());
1556 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1557 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1558 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1559 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1560
1561 handle.ResetAndCloseSocket();
1562 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1563}
1564
Matt Menke99251ea42019-04-25 22:59:021565// This test will start up a socket request and then call Reset() on the handle.
1566// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211567TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531568 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201569
[email protected]ab838892009-06-30 18:49:051570 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131571 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521572 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501573 EXPECT_EQ(
1574 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521575 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281576 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1577 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1578 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131579 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211580 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1581 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1582}
1583
Matt Menke99251ea42019-04-25 22:59:021584// This test will start up a socket request and then call ResetAndCloseSocket()
1585// on the handle. The pending ConnectJob or connected socket should be
1586// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211587TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1588 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1589
Matt Menke99251ea42019-04-25 22:59:021590 // When true, the socket connects before it's canceled.
1591 for (bool cancel_when_callback_pending : {false, true}) {
1592 if (cancel_when_callback_pending) {
1593 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1594 } else {
1595 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1596 }
1597 ClientSocketHandle handle;
1598 TestCompletionCallback callback;
1599 EXPECT_EQ(
1600 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521601 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021602 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1603 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1604 pool_.get(), NetLogWithSource()));
1605 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1606 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1607
1608 if (cancel_when_callback_pending) {
1609 client_socket_factory_.SignalJobs();
1610 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1611 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1612 }
1613
1614 handle.ResetAndCloseSocket();
1615 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1616 }
Matt Menke7eb405e2019-04-25 20:48:211617}
1618
1619TEST_F(ClientSocketPoolBaseTest,
1620 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1621 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1622
Matt Menke99251ea42019-04-25 22:59:021623 // When true, the sockets connect before they're canceled.
1624 for (bool cancel_when_callback_pending : {false, true}) {
1625 if (cancel_when_callback_pending) {
1626 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1627 } else {
1628 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1629 }
Matt Menke7eb405e2019-04-25 20:48:211630
Matt Menke99251ea42019-04-25 22:59:021631 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1632 TestCompletionCallback callback;
1633 // Make |kDefaultMaxSockets + 1| socket requests.
1634 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1635 std::unique_ptr<ClientSocketHandle> handle =
1636 std::make_unique<ClientSocketHandle>();
1637 EXPECT_EQ(ERR_IO_PENDING,
1638 handle->Init(
Anton Bikineev068d2912021-05-15 20:43:521639 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menke99251ea42019-04-25 22:59:021640 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1641 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1642 pool_.get(), NetLogWithSource()));
1643 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211644 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021645 EXPECT_EQ(
1646 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1647 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1648 }
1649
1650 if (cancel_when_callback_pending) {
1651 client_socket_factory_.SignalJobs();
1652 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1653 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1654 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1655 }
1656
1657 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1658 // or close a socket, since there are more requests than ConnectJobs or
1659 // sockets.
1660 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1661 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1662 if (cancel_when_callback_pending) {
1663 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1664 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1665 } else {
1666 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211667 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1668 }
Matt Menke99251ea42019-04-25 22:59:021669
1670 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1671 // or close a socket.
1672 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1673 handles[i]->ResetAndCloseSocket();
1674 if (i > 0) {
1675 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1676 if (cancel_when_callback_pending) {
1677 EXPECT_EQ(i,
1678 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1679 } else {
1680 EXPECT_EQ(static_cast<size_t>(i),
1681 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1682 }
1683 } else {
1684 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1685 }
1686 }
Matt Menke7eb405e2019-04-25 20:48:211687 }
[email protected]f6d1d6eb2009-06-24 20:16:091688}
1689
[email protected]ab838892009-06-30 18:49:051690TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531691 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201692
[email protected]ab838892009-06-30 18:49:051693 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061694 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521695 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091696
Matt Menke28ac03e2019-02-25 22:25:501697 EXPECT_EQ(
1698 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521699 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281700 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1701 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1702 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091703
1704 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211705 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1706 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091707
Matt Menke7eb405e2019-04-25 20:48:211708 // This will create a second ConnectJob, since the other ConnectJob was
1709 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521710 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501711 EXPECT_EQ(
1712 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:521713 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281714 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501715 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1716 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091717
Matt Menke7eb405e2019-04-25 20:48:211718 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1719 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1720
robpercival214763f2016-07-01 23:27:011721 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091722 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211723 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1724 // One ConnectJob completed, and its socket is now assigned to |handle|.
1725 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1726 // The other ConnectJob should have either completed, or still be connecting.
1727 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1728 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091729
1730 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211731 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1732 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1733 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1734 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091735}
1736
[email protected]ab838892009-06-30 18:49:051737TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531738 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091739
Matt Menkec6b3edf72019-03-19 17:00:391740 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1741 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1742 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1743 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1744 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1745 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1746 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091747
1748 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201749 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131750 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1751 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091752
[email protected]2431756e2010-09-29 20:26:131753 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091754
[email protected]c9d6a1d2009-07-14 16:15:201755 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1756 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131757 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1758 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091759
[email protected]c9d6a1d2009-07-14 16:15:201760 EXPECT_EQ(1, GetOrderOfRequest(1));
1761 EXPECT_EQ(2, GetOrderOfRequest(2));
1762 EXPECT_EQ(5, GetOrderOfRequest(3));
1763 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131764 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1765 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201766 EXPECT_EQ(4, GetOrderOfRequest(6));
1767 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171768
1769 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131770 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091771}
1772
mmenke33d24423d2015-05-19 19:41:091773// Function to be used as a callback on socket request completion. It first
1774// disconnects the successfully connected socket from the first request, and
1775// then reuses the ClientSocketHandle to request another socket.
1776//
1777// |nested_callback| is called with the result of the second socket request.
1778void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261779 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091780 TestConnectJobFactory* test_connect_job_factory,
1781 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411782 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091783 int first_request_result) {
robpercival214763f2016-07-01 23:27:011784 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091785
1786 test_connect_job_factory->set_job_type(next_job_type);
1787
1788 // Don't allow reuse of the socket. Disconnect it and then release it.
1789 if (handle->socket())
1790 handle->socket()->Disconnect();
1791 handle->Reset();
1792
mmenke33d24423d2015-05-19 19:41:091793 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501794 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031795 TestGroupId("a"),
Anton Bikineev068d2912021-05-15 20:43:521796 ClientSocketPool::SocketParams::CreateForHttpForTesting(), absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:281797 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031798 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1799 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091800 if (rv != ERR_IO_PENDING) {
1801 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411802 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091803 } else {
1804 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521805 }
mmenke33d24423d2015-05-19 19:41:091806}
[email protected]f6d1d6eb2009-06-24 20:16:091807
mmenke33d24423d2015-05-19 19:41:091808// Tests the case where a second socket is requested in a completion callback,
1809// and the second socket connects asynchronously. Reuses the same
1810// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581811TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531812 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201813
[email protected]0b7648c2009-07-06 20:14:011814 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061815 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091816 TestCompletionCallback second_result_callback;
1817 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521818 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541819 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501820 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1821 connect_job_factory_, TestConnectJob::kMockPendingJob,
1822 &second_result_callback),
1823 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011824 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091825
robpercival214763f2016-07-01 23:27:011826 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581827}
[email protected]f6d1d6eb2009-06-24 20:16:091828
mmenke33d24423d2015-05-19 19:41:091829// Tests the case where a second socket is requested in a completion callback,
1830// and the second socket connects synchronously. Reuses the same
1831// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581832TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531833 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201834
[email protected]0b7648c2009-07-06 20:14:011835 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061836 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091837 TestCompletionCallback second_result_callback;
1838 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521839 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541840 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501841 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1842 connect_job_factory_, TestConnectJob::kMockPendingJob,
1843 &second_result_callback),
1844 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011845 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581846
robpercival214763f2016-07-01 23:27:011847 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091848}
1849
1850// Make sure that pending requests get serviced after active requests get
1851// cancelled.
[email protected]ab838892009-06-30 18:49:051852TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531853 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201854
[email protected]0b7648c2009-07-06 20:14:011855 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091856
Matt Menkec6b3edf72019-03-19 17:00:391857 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1858 IsError(ERR_IO_PENDING));
1859 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1860 IsError(ERR_IO_PENDING));
1861 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1862 IsError(ERR_IO_PENDING));
1863 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1864 IsError(ERR_IO_PENDING));
1865 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1866 IsError(ERR_IO_PENDING));
1867 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1868 IsError(ERR_IO_PENDING));
1869 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1870 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091871
[email protected]c9d6a1d2009-07-14 16:15:201872 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1873 // Let's cancel them.
1874 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131875 ASSERT_FALSE(request(i)->handle()->is_initialized());
1876 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091877 }
1878
[email protected]f6d1d6eb2009-06-24 20:16:091879 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131880 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011881 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131882 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091883 }
1884
[email protected]2431756e2010-09-29 20:26:131885 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1886 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091887}
1888
1889// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051890TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531891 const size_t kMaxSockets = 5;
1892 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201893
[email protected]0b7648c2009-07-06 20:14:011894 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091895
[email protected]211d21722009-07-22 15:48:531896 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1897 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091898
1899 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531900 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391901 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1902 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091903
[email protected]211d21722009-07-22 15:48:531904 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011905 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091906}
1907
mmenke9d72fe42017-05-18 22:36:071908// Make sure that pending requests that complete synchronously get serviced
1909// after active requests fail. See https://crbug.com/723748
1910TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1911 const size_t kNumberOfRequests = 10;
1912 const size_t kMaxSockets = 1;
1913 CreatePool(kMaxSockets, kMaxSockets);
1914
1915 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1916
Matt Menkec6b3edf72019-03-19 17:00:391917 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1918 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071919
1920 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1921
1922 // Queue up all the other requests
1923 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391924 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1925 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071926
1927 // Make sure all requests fail, instead of hanging.
1928 for (size_t i = 0; i < kNumberOfRequests; ++i)
1929 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1930}
1931
[email protected]5fc08e32009-07-15 17:09:571932TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531933 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571934
1935 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1936
[email protected]2431756e2010-09-29 20:26:131937 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521938 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501939 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521940 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501941 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1942 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011943 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571944
1945 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131946 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571947
Anton Bikineev068d2912021-05-15 20:43:521948 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:281949 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501950 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1951 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011952 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1953 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571954
[email protected]2431756e2010-09-29 20:26:131955 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481956 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571957 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1958}
1959
xunjieli26619e72016-11-23 19:39:551960TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
Matt Menke433de6d2020-03-04 00:24:111961 const char kReason[] = "Really nifty reason";
1962
xunjieli26619e72016-11-23 19:39:551963 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1964 ClientSocketHandle handle;
1965 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141966 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501967 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:521968 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501969 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1970 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551971 EXPECT_THAT(rv, IsOk());
Matt Menke433de6d2020-03-04 00:24:111972 ASSERT_TRUE(handle.socket());
1973 NetLogSource source = handle.socket()->NetLog().source();
xunjieli26619e72016-11-23 19:39:551974 handle.Reset();
1975 EXPECT_EQ(1, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111976 pool_->CloseIdleSockets(kReason);
1977 ExpectSocketClosedWithReason(source, kReason);
xunjieli26619e72016-11-23 19:39:551978}
1979
xunjieli92feb332017-03-03 17:19:231980TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231981 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1982 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141983 RecordingBoundTestNetLog log;
xunjieli92feb332017-03-03 17:19:231984 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501985 int rv = handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:521986 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501987 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1988 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231989 EXPECT_THAT(rv, IsOk());
1990 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:521991 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281992 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501993 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1994 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231995 ClientSocketHandle handle3;
Anton Bikineev068d2912021-05-15 20:43:521996 rv = handle3.Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:281997 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501998 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1999 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:232000 EXPECT_THAT(rv, IsOk());
2001 handle1.Reset();
2002 handle2.Reset();
2003 handle3.Reset();
2004 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:112005 pool_->CloseIdleSocketsInGroup(TestGroupId("a"), "Very good reason");
xunjieli92feb332017-03-03 17:19:232006 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:232007}
2008
xunjieli26619e72016-11-23 19:39:552009TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:552010 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2011 ClientSocketHandle handle;
2012 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142013 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502014 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522015 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502016 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2017 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:552018 EXPECT_THAT(rv, IsOk());
2019 StreamSocket* socket = handle.socket();
Matt Menke433de6d2020-03-04 00:24:112020 ASSERT_TRUE(socket);
xunjieli26619e72016-11-23 19:39:552021 handle.Reset();
2022 EXPECT_EQ(1, pool_->IdleSocketCount());
2023
2024 // Disconnect socket now to make the socket unusable.
Matt Menke433de6d2020-03-04 00:24:112025 NetLogSource source = socket->NetLog().source();
xunjieli26619e72016-11-23 19:39:552026 socket->Disconnect();
2027 ClientSocketHandle handle2;
Anton Bikineev068d2912021-05-15 20:43:522028 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282029 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502030 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2031 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:552032 EXPECT_THAT(rv, IsOk());
2033 EXPECT_FALSE(handle2.is_reused());
Matt Menke433de6d2020-03-04 00:24:112034
2035 // This is admittedly not an accurate error in this case, but normally code
2036 // doesn't secretly keep a raw pointers to sockets returned to the socket pool
2037 // and close them out of band, so discovering an idle socket was closed when
2038 // trying to reuse it normally means it was closed by the remote side.
2039 ExpectSocketClosedWithReason(
2040 source, TransportClientSocketPool::kRemoteSideClosedConnection);
xunjieli26619e72016-11-23 19:39:552041}
2042
[email protected]2b7523d2009-07-29 20:29:232043// Regression test for http://crbug.com/17985.
2044TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
2045 const int kMaxSockets = 3;
2046 const int kMaxSocketsPerGroup = 2;
2047 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
2048
[email protected]ac790b42009-12-02 04:31:312049 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:232050
Matt Menkec6b3edf72019-03-19 17:00:392051 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2052 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232053
2054 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:392055 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2056 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232057
2058 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:392059 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232060
2061 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:392062 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2063 IsError(ERR_IO_PENDING));
2064 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2065 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232066
Matt Menkec6b3edf72019-03-19 17:00:392067 // Release the first two sockets from TestGroupId("a"). Because this is a
2068 // keepalive, the first release will unblock the pending request for
2069 // TestGroupId("a"). The second release will unblock a request for "c",
2070 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:132071 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
2072 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:232073
2074 // Closing idle sockets should not get us into trouble, but in the bug
2075 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:392076 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke433de6d2020-03-04 00:24:112077 pool_->CloseIdleSockets("Very good reason");
[email protected]eb5a99382010-07-11 03:18:262078
[email protected]2da659e2013-05-23 20:51:342079 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282080 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232081}
2082
[email protected]4d3b05d2010-01-27 21:27:292083TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532084 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572085
2086 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132087 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522088 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142089 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502090 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522091 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502092 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2093 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012094 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392095 EXPECT_EQ(LOAD_STATE_CONNECTING,
2096 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482097 TestLoadTimingInfoNotConnected(handle);
2098
robpercival214763f2016-07-01 23:27:012099 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132100 EXPECT_TRUE(handle.is_initialized());
2101 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482102 TestLoadTimingInfoConnectedNotReused(handle);
2103
[email protected]2431756e2010-09-29 20:26:132104 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482105 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302106
Eric Roman79cc7552019-07-19 02:17:542107 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402108
Matt Menke9fa17d52019-03-25 19:12:262109 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172110 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262111 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002112 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262113 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2114 EXPECT_TRUE(LogContainsEvent(
2115 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2116 NetLogEventPhase::NONE));
2117 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002118 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2119 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262120 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572121}
2122
[email protected]4d3b05d2010-01-27 21:27:292123TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572124 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532125 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572126
2127 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132128 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522129 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142130 RecordingBoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:182131 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132132 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512133 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502134 EXPECT_EQ(
2135 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522136 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282137 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2138 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2139 pool_.get(), log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:392140 EXPECT_EQ(LOAD_STATE_CONNECTING,
2141 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012142 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132143 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512144 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302145
Eric Roman79cc7552019-07-19 02:17:542146 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402147
Matt Menke9fa17d52019-03-25 19:12:262148 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172149 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262150 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002151 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262152 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2153 EXPECT_TRUE(LogContainsEvent(
2154 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2155 NetLogEventPhase::NONE));
2156 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572157}
2158
mmenke6be122f2015-03-09 22:22:472159// Check that an async ConnectJob failure does not result in creation of a new
2160// ConnectJob when there's another pending request also waiting on its own
2161// ConnectJob. See http://crbug.com/463960.
2162TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2163 CreatePool(2, 2);
2164 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2165
Matt Menkec6b3edf72019-03-19 17:00:392166 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2167 IsError(ERR_IO_PENDING));
2168 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2169 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472170
robpercival214763f2016-07-01 23:27:012171 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2172 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472173
2174 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2175}
2176
[email protected]4d3b05d2010-01-27 21:27:292177TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102178 // TODO(eroman): Add back the log expectations! Removed them because the
2179 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532180 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572181
2182 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132183 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522184 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132185 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522186 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572187
Matt Menke28ac03e2019-02-25 22:25:502188 EXPECT_EQ(
2189 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522190 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282191 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2192 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2193 pool_.get(), NetLogWithSource()));
Matt Muellerd9342e3a2019-11-26 01:41:142194 RecordingBoundTestNetLog log2;
tfarina428341112016-09-22 13:38:202195 EXPECT_EQ(
2196 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522197 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282198 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502199 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2200 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572201
[email protected]2431756e2010-09-29 20:26:132202 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572203
[email protected]fd7b7c92009-08-20 19:38:302204
2205 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302206
robpercival214763f2016-07-01 23:27:012207 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132208 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302209
2210 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532211 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572212}
2213
[email protected]4d3b05d2010-01-27 21:27:292214TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342215 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2216
[email protected]17a0c6c2009-08-04 00:07:042217 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2218
Matt Menkec6b3edf72019-03-19 17:00:392219 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2220 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2221 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2222 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342223
Raul Tambre8335a6d2019-02-21 16:57:432224 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262225 static_cast<int>(
2226 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132227 (*requests())[2]->handle()->Reset();
2228 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432229 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262230 static_cast<int>(
2231 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342232
[email protected]2431756e2010-09-29 20:26:132233 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432234 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262235 static_cast<int>(
2236 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342237
[email protected]2431756e2010-09-29 20:26:132238 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432239 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262240 static_cast<int>(
2241 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342242}
2243
[email protected]5fc08e32009-07-15 17:09:572244// When requests and ConnectJobs are not coupled, the request will get serviced
2245// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292246TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532247 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572248
2249 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322250 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572251
[email protected]2431756e2010-09-29 20:26:132252 std::vector<TestSocketRequest*> request_order;
2253 size_t completion_count; // unused
2254 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502255 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522256 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502257 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2258 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012259 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2260 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572261
2262 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2263 // without a job.
2264 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2265
[email protected]2431756e2010-09-29 20:26:132266 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502267 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522268 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502269 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2270 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012271 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132272 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502273 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522274 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502275 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2276 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012277 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572278
2279 // Both Requests 2 and 3 are pending. We release socket 1 which should
2280 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332281 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342282 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282283 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332284 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012285 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332286 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572287
2288 // Signal job 2, which should service request 3.
2289
2290 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012291 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572292
Raul Tambre8335a6d2019-02-21 16:57:432293 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132294 EXPECT_EQ(&req1, request_order[0]);
2295 EXPECT_EQ(&req2, request_order[1]);
2296 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392297 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572298}
2299
2300// The requests are not coupled to the jobs. So, the requests should finish in
2301// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292302TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532303 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572304 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322305 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572306
[email protected]2431756e2010-09-29 20:26:132307 std::vector<TestSocketRequest*> request_order;
2308 size_t completion_count; // unused
2309 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502310 int rv = req1.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522311 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502312 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2313 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012314 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572315
[email protected]2431756e2010-09-29 20:26:132316 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502317 rv = req2.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522318 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502319 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2320 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012321 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572322
2323 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322324 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572325
[email protected]2431756e2010-09-29 20:26:132326 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502327 rv = req3.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522328 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502329 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2330 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012331 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572332
robpercival214763f2016-07-01 23:27:012333 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2334 EXPECT_THAT(req2.WaitForResult(), IsOk());
2335 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572336
Raul Tambre8335a6d2019-02-21 16:57:432337 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132338 EXPECT_EQ(&req1, request_order[0]);
2339 EXPECT_EQ(&req2, request_order[1]);
2340 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572341}
2342
[email protected]03b7c8c2013-07-20 04:38:552343// Test GetLoadState in the case there's only one socket request.
2344TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532345 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552346 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572347
[email protected]2431756e2010-09-29 20:26:132348 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522349 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502350 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522351 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502352 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2353 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012354 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552355 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572356
[email protected]03b7c8c2013-07-20 04:38:552357 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2358 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2359
2360 // No point in completing the connection, since ClientSocketHandles only
2361 // expect the LoadState to be checked while connecting.
2362}
2363
2364// Test GetLoadState in the case there are two socket requests.
2365TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2366 CreatePool(2, 2);
2367 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2368
2369 ClientSocketHandle handle;
2370 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502371 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522372 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502373 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2374 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012375 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002376 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2377
2378 ClientSocketHandle handle2;
2379 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522380 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282381 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502382 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2383 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012384 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002385 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2386
Matt Menke4b69f932019-03-04 16:20:012387 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002388 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2389 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2390
Matt Menke4b69f932019-03-04 16:20:012391 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002392 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2393
Matt Menke4b69f932019-03-04 16:20:012394 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002395 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002396 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012397
2398 // Update the state of the second job.
2399 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2400
2401 // Only the state of the second request should have changed.
2402 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2403 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2404
2405 // Second job connects and the first request gets the socket. The
2406 // second handle switches to the state of the remaining ConnectJob.
2407 client_socket_factory_.SignalJob(1);
2408 EXPECT_THAT(callback.WaitForResult(), IsOk());
2409 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552410}
2411
2412// Test GetLoadState in the case the per-group limit is reached.
2413TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2414 CreatePool(2, 1);
2415 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2416
2417 ClientSocketHandle handle;
2418 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502419 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522420 TestGroupId("a"), params_, absl::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502421 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2422 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012423 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552424 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2425
2426 // Request another socket from the same pool, buth with a higher priority.
2427 // The first request should now be stalled at the socket group limit.
2428 ClientSocketHandle handle2;
2429 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522430 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:282431 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502432 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2433 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012434 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552435 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2436 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2437
2438 // The first handle should remain stalled as the other socket goes through
2439 // the connect process.
2440
2441 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2442 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2443 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2444
2445 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012446 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552447 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2448
2449 // Closing the second socket should cause the stalled handle to finally get a
2450 // ConnectJob.
2451 handle2.socket()->Disconnect();
2452 handle2.Reset();
2453 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2454}
2455
2456// Test GetLoadState in the case the per-pool limit is reached.
2457TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2458 CreatePool(2, 2);
2459 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2460
2461 ClientSocketHandle handle;
2462 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502463 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522464 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502465 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2466 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012467 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552468
2469 // Request for socket from another pool.
2470 ClientSocketHandle handle2;
2471 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522472 rv = handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282473 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502474 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2475 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012476 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552477
2478 // Request another socket from the first pool. Request should stall at the
2479 // socket pool limit.
2480 ClientSocketHandle handle3;
2481 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522482 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282483 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502484 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2485 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012486 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552487
2488 // The third handle should remain stalled as the other sockets in its group
2489 // goes through the connect process.
2490
2491 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2492 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2493
2494 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2495 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2496 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2497
2498 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012499 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552500 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2501
2502 // Closing a socket should allow the stalled handle to finally get a new
2503 // ConnectJob.
2504 handle.socket()->Disconnect();
2505 handle.Reset();
2506 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572507}
2508
Matt Menkeb57663b32019-03-01 17:17:102509TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132510 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102511 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132512
[email protected]2431756e2010-09-29 20:26:132513 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522514 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502515 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102516 ERR_CERT_COMMON_NAME_INVALID,
Anton Bikineev068d2912021-05-15 20:43:522517 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282518 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2519 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2520 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132521 EXPECT_TRUE(handle.is_initialized());
2522 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132523}
2524
Matt Menkeb57663b32019-03-01 17:17:102525TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132526 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2527
Matt Menkeb57663b32019-03-01 17:17:102528 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132529 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522530 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502531 EXPECT_EQ(
2532 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522533 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282534 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2535 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2536 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392537 EXPECT_EQ(LOAD_STATE_CONNECTING,
2538 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102539 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132540 EXPECT_TRUE(handle.is_initialized());
2541 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132542}
2543
[email protected]e60e47a2010-07-14 03:37:182544TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2545 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2546 connect_job_factory_->set_job_type(
2547 TestConnectJob::kMockAdditionalErrorStateJob);
2548
[email protected]2431756e2010-09-29 20:26:132549 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522550 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502551 EXPECT_EQ(
2552 ERR_CONNECTION_FAILED,
Anton Bikineev068d2912021-05-15 20:43:522553 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282554 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2555 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2556 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132557 EXPECT_FALSE(handle.is_initialized());
2558 EXPECT_FALSE(handle.socket());
2559 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512560 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182561}
2562
2563TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2564 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2565
2566 connect_job_factory_->set_job_type(
2567 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132568 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522569 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502570 EXPECT_EQ(
2571 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522572 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282573 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2574 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2575 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392576 EXPECT_EQ(LOAD_STATE_CONNECTING,
2577 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012578 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132579 EXPECT_FALSE(handle.is_initialized());
2580 EXPECT_FALSE(handle.socket());
2581 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512582 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182583}
2584
martijn003cd612016-05-19 22:24:382585// Make sure we can reuse sockets.
2586TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412587 CreatePoolWithIdleTimeouts(
2588 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032589 base::TimeDelta(), // Time out unused sockets immediately.
2590 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2591
2592 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2593
2594 ClientSocketHandle handle;
2595 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502596 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522597 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502598 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2599 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012600 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392601 EXPECT_EQ(LOAD_STATE_CONNECTING,
2602 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012603 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032604
2605 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352606 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382607 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482608 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032609 handle.Reset();
2610
2611 // Should now have one idle socket.
2612 ASSERT_EQ(1, pool_->IdleSocketCount());
2613
2614 // Request a new socket. This should reuse the old socket and complete
2615 // synchronously.
Matt Muellerd9342e3a2019-11-26 01:41:142616 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502617 rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522618 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502619 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2620 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012621 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032622 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482623 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032624
Matt Menke9fa17d52019-03-25 19:12:262625 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392626 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262627 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032628
Eric Roman79cc7552019-07-19 02:17:542629 auto entries = log.GetEntries();
Matt Menke9fa17d52019-03-25 19:12:262630 EXPECT_TRUE(LogContainsEvent(
2631 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2632 NetLogEventPhase::NONE));
2633 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032634 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262635 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032636}
2637
martijn003cd612016-05-19 22:24:382638// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172639TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032640 CreatePoolWithIdleTimeouts(
2641 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2642 base::TimeDelta(), // Time out unused sockets immediately
2643 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412644
2645 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2646
2647 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2648
2649 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522650 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502651 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522652 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502653 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2654 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012655 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392656 EXPECT_EQ(LOAD_STATE_CONNECTING,
2657 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412658
2659 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522660 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522661 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282662 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502663 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2664 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012665 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392666 EXPECT_EQ(LOAD_STATE_CONNECTING,
2667 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412668
2669 // Cancel one of the requests. Wait for the other, which will get the first
2670 // job. Release the socket. Run the loop again to make sure the second
2671 // socket is sitting idle and the first one is released (since ReleaseSocket()
2672 // just posts a DoReleaseSocket() task).
2673
2674 handle.Reset();
robpercival214763f2016-07-01 23:27:012675 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menke433de6d2020-03-04 00:24:112676 // Get the NetLogSource for the socket, so the time out reason can be checked
2677 // at the end of the test.
2678 NetLogSource net_log_source2 = handle2.socket()->NetLog().source();
[email protected]64770b7d2011-11-16 04:30:412679 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352680 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382681 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412682 handle2.Reset();
2683
[email protected]e7b1c6d2c2012-05-05 00:54:032684 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2685 // actually become pending until 2ms after they have been created. In order
2686 // to flush all tasks, we need to wait so that we know there are no
2687 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452688 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412689
[email protected]e7b1c6d2c2012-05-05 00:54:032690 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412691 ASSERT_EQ(2, pool_->IdleSocketCount());
2692
2693 // Request a new socket. This should cleanup the unused and timed out ones.
2694 // A new socket will be created rather than reusing the idle one.
Matt Muellerd9342e3a2019-11-26 01:41:142695 RecordingBoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522696 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522697 rv = handle.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282698 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502699 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2700 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012701 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2702 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412703 EXPECT_FALSE(handle.is_reused());
2704
[email protected]e7b1c6d2c2012-05-05 00:54:032705 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262706 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392707 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262708 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412709
Eric Roman79cc7552019-07-19 02:17:542710 auto entries = log.GetEntries();
[email protected]64770b7d2011-11-16 04:30:412711 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002712 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
Matt Menke433de6d2020-03-04 00:24:112713 ExpectSocketClosedWithReason(
2714 net_log_source2, TransportClientSocketPool::kIdleTimeLimitExpired);
[email protected]64770b7d2011-11-16 04:30:412715}
2716
[email protected]2041cf342010-02-19 03:15:592717// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162718// because of multiple releasing disconnected sockets.
2719TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2720 CreatePoolWithIdleTimeouts(
2721 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2722 base::TimeDelta(), // Time out unused sockets immediately.
2723 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2724
2725 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2726
2727 // Startup 4 connect jobs. Two of them will be pending.
2728
[email protected]2431756e2010-09-29 20:26:132729 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522730 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502731 int rv = handle.Init(
Anton Bikineev068d2912021-05-15 20:43:522732 TestGroupId("a"), params_, absl::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502733 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2734 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012735 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162736
[email protected]2431756e2010-09-29 20:26:132737 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522738 TestCompletionCallback callback2;
Anton Bikineev068d2912021-05-15 20:43:522739 rv = handle2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282740 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502741 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2742 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012743 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162744
[email protected]2431756e2010-09-29 20:26:132745 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522746 TestCompletionCallback callback3;
Anton Bikineev068d2912021-05-15 20:43:522747 rv = handle3.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282748 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502749 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2750 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012751 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162752
[email protected]2431756e2010-09-29 20:26:132753 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522754 TestCompletionCallback callback4;
Anton Bikineev068d2912021-05-15 20:43:522755 rv = handle4.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282756 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502757 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2758 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012759 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162760
2761 // Release two disconnected sockets.
2762
[email protected]2431756e2010-09-29 20:26:132763 handle.socket()->Disconnect();
2764 handle.Reset();
2765 handle2.socket()->Disconnect();
2766 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162767
robpercival214763f2016-07-01 23:27:012768 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132769 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012770 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132771 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162772}
2773
[email protected]d7027bb2010-05-10 18:58:542774// Regression test for http://crbug.com/42267.
2775// When DoReleaseSocket() is processed for one socket, it is blocked because the
2776// other stalled groups all have releasing sockets, so no progress can be made.
2777TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2778 CreatePoolWithIdleTimeouts(
2779 4 /* socket limit */, 4 /* socket limit per group */,
2780 base::TimeDelta(), // Time out unused sockets immediately.
2781 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2782
2783 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2784
2785 // Max out the socket limit with 2 per group.
2786
[email protected]2431756e2010-09-29 20:26:132787 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522788 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132789 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522790 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542791
2792 for (int i = 0; i < 2; ++i) {
Anton Bikineev068d2912021-05-15 20:43:522793 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282794 LOWEST, SocketTag(),
2795 ClientSocketPool::RespectLimits::ENABLED,
2796 callback_a[i].callback(),
2797 ClientSocketPool::ProxyAuthCallback(),
2798 pool_.get(), NetLogWithSource()));
Anton Bikineev068d2912021-05-15 20:43:522799 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:282800 LOWEST, SocketTag(),
2801 ClientSocketPool::RespectLimits::ENABLED,
2802 callback_b[i].callback(),
2803 ClientSocketPool::ProxyAuthCallback(),
2804 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542805 }
[email protected]b89f7e42010-05-20 20:37:002806
[email protected]d7027bb2010-05-10 18:58:542807 // Make 4 pending requests, 2 per group.
2808
2809 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282810 EXPECT_EQ(
2811 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522812 handle_a[i].Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282813 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2814 callback_a[i].callback(),
2815 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2816 NetLogWithSource()));
2817 EXPECT_EQ(
2818 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522819 handle_b[i].Init(TestGroupId("b"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:282820 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2821 callback_b[i].callback(),
2822 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2823 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542824 }
2825
2826 // Release b's socket first. The order is important, because in
2827 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2828 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2829 // first, which has a releasing socket, so it refuses to start up another
2830 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132831 handle_b[0].socket()->Disconnect();
2832 handle_b[0].Reset();
2833 handle_a[0].socket()->Disconnect();
2834 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542835
2836 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282837 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542838
[email protected]2431756e2010-09-29 20:26:132839 handle_b[1].socket()->Disconnect();
2840 handle_b[1].Reset();
2841 handle_a[1].socket()->Disconnect();
2842 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542843
2844 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012845 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2846 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542847 }
2848}
2849
[email protected]fd4fe0b2010-02-08 23:02:152850TEST_F(ClientSocketPoolBaseTest,
2851 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2852 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2853
2854 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2855
Matt Menkec6b3edf72019-03-19 17:00:392856 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2857 IsError(ERR_IO_PENDING));
2858 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2859 IsError(ERR_IO_PENDING));
2860 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2861 IsError(ERR_IO_PENDING));
2862 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2863 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152864
robpercival214763f2016-07-01 23:27:012865 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2866 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132867 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152868
2869 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132870 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012871 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152872
[email protected]2431756e2010-09-29 20:26:132873 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012874 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132875 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152876
2877 EXPECT_EQ(1, GetOrderOfRequest(1));
2878 EXPECT_EQ(2, GetOrderOfRequest(2));
2879 EXPECT_EQ(3, GetOrderOfRequest(3));
2880 EXPECT_EQ(4, GetOrderOfRequest(4));
2881
2882 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132883 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152884}
2885
[email protected]6ecf2b92011-12-15 01:14:522886class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042887 public:
Matt Menke9fa17d52019-03-25 19:12:262888 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132889 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182890 bool reset_releasing_handle)
2891 : pool_(pool),
2892 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042893 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522894
Chris Watkins7a41d3552017-12-01 02:13:272895 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042896
2897 ClientSocketHandle* handle() { return &handle_; }
2898
Bence Béky8ddc2492018-06-13 01:02:042899 CompletionOnceCallback callback() {
2900 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2901 base::Unretained(this));
2902 }
[email protected]4f1e4982010-03-02 18:31:042903
2904 private:
[email protected]6ecf2b92011-12-15 01:14:522905 void OnComplete(int result) {
2906 SetResult(result);
2907 if (reset_releasing_handle_)
2908 handle_.Reset();
2909
Matt Menkec6b3edf72019-03-19 17:00:392910 EXPECT_EQ(
2911 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032912 handle2_.Init(
2913 TestGroupId("a"),
2914 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:522915 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032916 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2917 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522918 }
2919
Matt Menke9fa17d52019-03-25 19:12:262920 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182921 int expected_result_;
2922 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042923 ClientSocketHandle handle_;
2924 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042925};
2926
[email protected]e60e47a2010-07-14 03:37:182927
2928TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2929 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2930
Matt Menkec6b3edf72019-03-19 17:00:392931 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2932 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2933 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182934
[email protected]2431756e2010-09-29 20:26:132935 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182936 client_socket_factory_.allocation_count());
2937
2938 connect_job_factory_->set_job_type(
2939 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2940 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282941 EXPECT_EQ(ERR_IO_PENDING,
2942 req.handle()->Init(
Anton Bikineev068d2912021-05-15 20:43:522943 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282944 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2945 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2946 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182947 // The next job should complete synchronously
2948 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2949
robpercival214763f2016-07-01 23:27:012950 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182951 EXPECT_FALSE(req.handle()->is_initialized());
2952 EXPECT_FALSE(req.handle()->socket());
2953 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512954 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182955}
2956
[email protected]b6501d3d2010-06-03 23:53:342957// http://crbug.com/44724 regression test.
2958// We start releasing the pool when we flush on network change. When that
2959// happens, the only active references are in the ClientSocketHandles. When a
2960// ConnectJob completes and calls back into the last ClientSocketHandle, that
2961// callback can release the last reference and delete the pool. After the
2962// callback finishes, we go back to the stack frame within the now-deleted pool.
2963// Executing any code that refers to members of the now-deleted pool can cause
2964// crashes.
2965TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2966 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2967 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2968
2969 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522970 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502971 EXPECT_EQ(
2972 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522973 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282974 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2975 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2976 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342977
Matt Menke433de6d2020-03-04 00:24:112978 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]b6501d3d2010-06-03 23:53:342979
2980 // We'll call back into this now.
2981 callback.WaitForResult();
2982}
2983
[email protected]a7e38572010-06-07 18:22:242984TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2985 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2986 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2987
2988 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522989 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502990 EXPECT_EQ(
2991 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:522992 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:282993 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2994 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2995 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012996 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242997 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:112998 NetLogSource source = handle.socket()->NetLog().source();
[email protected]a7e38572010-06-07 18:22:242999
Matt Menke433de6d2020-03-04 00:24:113000 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]a7e38572010-06-07 18:22:243001
3002 handle.Reset();
fdoray5eeb7642016-06-22 16:11:283003 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:243004
Matt Menke28ac03e2019-02-25 22:25:503005 EXPECT_EQ(
3006 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523007 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283008 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3009 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3010 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013011 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243012 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113013
3014 ExpectSocketClosedWithReason(
3015 source, TransportClientSocketPool::kSocketGenerationOutOfDate);
[email protected]a7e38572010-06-07 18:22:243016}
3017
[email protected]6ecf2b92011-12-15 01:14:523018class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:143019 public:
Matt Menke9fa17d52019-03-25 19:12:263020 ConnectWithinCallback(
3021 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:193022 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:263023 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:393024 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:143025
Peter Boström293b1342021-09-22 17:31:433026 ConnectWithinCallback(const ConnectWithinCallback&) = delete;
3027 ConnectWithinCallback& operator=(const ConnectWithinCallback&) = delete;
3028
Chris Watkins7a41d3552017-12-01 02:13:273029 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:143030
3031 int WaitForNestedResult() {
3032 return nested_callback_.WaitForResult();
3033 }
3034
Bence Béky8ddc2492018-06-13 01:02:043035 CompletionOnceCallback callback() {
3036 return base::BindOnce(&ConnectWithinCallback::OnComplete,
3037 base::Unretained(this));
3038 }
[email protected]6ecf2b92011-12-15 01:14:523039
[email protected]06f92462010-08-31 19:24:143040 private:
[email protected]6ecf2b92011-12-15 01:14:523041 void OnComplete(int result) {
3042 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:283043 EXPECT_EQ(
3044 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523045 handle_.Init(group_id_, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283046 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3047 nested_callback_.callback(),
3048 ClientSocketPool::ProxyAuthCallback(), pool_,
3049 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:523050 }
3051
Matt Menkec6b3edf72019-03-19 17:00:393052 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:193053 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:263054 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:143055 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:523056 TestCompletionCallback nested_callback_;
[email protected]06f92462010-08-31 19:24:143057};
3058
3059TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
3060 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3061
3062 // First job will be waiting until it gets aborted.
3063 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3064
3065 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:393066 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:503067 EXPECT_EQ(
3068 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523069 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283070 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3071 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3072 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:143073
3074 // Second job will be started during the first callback, and will
3075 // asynchronously complete with OK.
3076 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menke433de6d2020-03-04 00:24:113077 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
robpercival214763f2016-07-01 23:27:013078 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
3079 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:143080}
3081
Matt Menke141b87f22019-01-30 02:43:033082TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:263083 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3084 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033085
3086 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3087 ClientSocketHandle handle;
3088 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503089 EXPECT_EQ(
3090 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523091 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283092 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3093 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3094 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033095 // The backup timer fires but doesn't start a new ConnectJob while resolving
3096 // the hostname.
3097 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3098 FastForwardBy(base::TimeDelta::FromMilliseconds(
3099 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3100 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3101
3102 // Once the ConnectJob has finished resolving the hostname, the backup timer
3103 // will create a ConnectJob when it fires.
3104 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
3105 FastForwardBy(base::TimeDelta::FromMilliseconds(
3106 ClientSocketPool::kMaxConnectRetryIntervalMs));
3107 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3108}
3109
3110// Test that no backup socket is created when a ConnectJob connects before it
3111// completes.
3112TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263113 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3114 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033115
3116 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3117 ClientSocketHandle handle;
3118 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503119 EXPECT_EQ(
3120 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523121 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283122 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3123 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3124 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033125 // The backup timer fires but doesn't start a new ConnectJob while resolving
3126 // the hostname.
3127 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3128 FastForwardBy(base::TimeDelta::FromMilliseconds(
3129 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3130 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3131
3132 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3133 client_socket_factory_.SetJobHasEstablishedConnection(0);
3134 FastForwardBy(base::TimeDelta::FromMilliseconds(
3135 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3136 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3137}
3138
[email protected]25eea382010-07-10 23:55:263139// Cancel a pending socket request while we're at max sockets,
3140// and verify that the backup socket firing doesn't cause a crash.
3141TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3142 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263143 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3144 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263145
[email protected]4baaf9d2010-08-31 15:15:443146 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3147 // timer.
[email protected]25eea382010-07-10 23:55:263148 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3149 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523150 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503151 EXPECT_EQ(
3152 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523153 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283154 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3155 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3156 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263157
3158 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3159 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3160 ClientSocketHandle handles[kDefaultMaxSockets];
3161 for (int i = 1; i < kDefaultMaxSockets; ++i) {
Anton Bikineev068d2912021-05-15 20:43:523162 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283163 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203164 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503165 callback.callback(),
3166 ClientSocketPool::ProxyAuthCallback(),
3167 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263168 }
3169
fdoray5eeb7642016-06-22 16:11:283170 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263171
3172 // Cancel the pending request.
3173 handle.Reset();
3174
3175 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453176 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003177 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263178
[email protected]25eea382010-07-10 23:55:263179 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3180}
3181
[email protected]3f00be82010-09-27 19:50:023182TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263183 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3184 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443185
3186 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3187 // timer.
3188 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3189 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523190 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503191 EXPECT_EQ(
3192 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523193 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283194 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3195 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3196 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263197 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3198 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3199 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3200 TestGroupId("bar")));
3201 EXPECT_EQ(
3202 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443203
3204 // Cancel the socket request. This should cancel the backup timer. Wait for
3205 // the backup time to see if it indeed got canceled.
3206 handle.Reset();
3207 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453208 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003209 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263210 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3211 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443212}
3213
[email protected]3f00be82010-09-27 19:50:023214TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263215 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3216 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023217
3218 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3219 // timer.
3220 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3221 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523222 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503223 EXPECT_EQ(
3224 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523225 handle.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283226 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3227 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3228 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023229 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3230 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523231 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203232 EXPECT_EQ(
3233 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523234 handle2.Init(TestGroupId("bar"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283235 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503236 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3237 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263238 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3239 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023240
3241 // Cancel request 1 and then complete request 2. With the requests finished,
3242 // the backup timer should be cancelled.
3243 handle.Reset();
robpercival214763f2016-07-01 23:27:013244 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023245 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453246 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003247 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023248}
3249
[email protected]eb5a99382010-07-11 03:18:263250// Test delayed socket binding for the case where we have two connects,
3251// and while one is waiting on a connect, the other frees up.
3252// The socket waiting on a connect should switch immediately to the freed
3253// up socket.
3254TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3255 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3256 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3257
3258 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523259 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503260 EXPECT_EQ(
3261 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523262 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283263 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503264 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3265 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013266 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263267
3268 // No idle sockets, no pending jobs.
3269 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263270 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263271
3272 // Create a second socket to the same host, but this one will wait.
3273 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3274 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503275 EXPECT_EQ(
3276 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523277 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283278 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503279 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3280 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263281 // No idle sockets, and one connecting job.
3282 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263283 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263284
3285 // Return the first handle to the pool. This will initiate the delayed
3286 // binding.
3287 handle1.Reset();
3288
fdoray5eeb7642016-06-22 16:11:283289 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263290
3291 // Still no idle sockets, still one pending connect job.
3292 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263293 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263294
3295 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013296 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263297
3298 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263299 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263300
3301 // Finally, signal the waiting Connect.
3302 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263303 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263304
fdoray5eeb7642016-06-22 16:11:283305 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263306}
3307
3308// Test delayed socket binding when a group is at capacity and one
3309// of the group's sockets frees up.
3310TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3311 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3312 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3313
3314 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523315 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503316 EXPECT_EQ(
3317 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523318 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283319 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503320 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3321 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013322 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263323
3324 // No idle sockets, no pending jobs.
3325 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263326 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263327
3328 // Create a second socket to the same host, but this one will wait.
3329 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3330 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503331 EXPECT_EQ(
3332 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523333 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283334 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503335 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3336 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263337 // No idle sockets, and one connecting job.
3338 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263339 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263340
3341 // Return the first handle to the pool. This will initiate the delayed
3342 // binding.
3343 handle1.Reset();
3344
fdoray5eeb7642016-06-22 16:11:283345 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263346
3347 // Still no idle sockets, still one pending connect job.
3348 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263349 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263350
3351 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013352 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263353
3354 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263355 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263356
3357 // Finally, signal the waiting Connect.
3358 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263359 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263360
fdoray5eeb7642016-06-22 16:11:283361 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263362}
3363
3364// Test out the case where we have one socket connected, one
3365// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513366// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263367// should complete, by taking the first socket's idle socket.
3368TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3369 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3370 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3371
3372 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523373 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503374 EXPECT_EQ(
3375 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523376 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283377 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503378 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3379 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013380 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263381
3382 // No idle sockets, no pending jobs.
3383 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263384 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263385
3386 // Create a second socket to the same host, but this one will wait.
3387 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3388 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503389 EXPECT_EQ(
3390 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523391 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283392 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503393 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3394 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263395 // No idle sockets, and one connecting job.
3396 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263397 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263398
3399 // Return the first handle to the pool. This will initiate the delayed
3400 // binding.
3401 handle1.Reset();
3402
fdoray5eeb7642016-06-22 16:11:283403 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263404
3405 // Still no idle sockets, still one pending connect job.
3406 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263407 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263408
3409 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013410 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263411
3412 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263413 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263414
3415 // Finally, signal the waiting Connect.
3416 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263417 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263418
fdoray5eeb7642016-06-22 16:11:283419 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263420}
3421
[email protected]2abfe90a2010-08-25 17:49:513422// Cover the case where on an available socket slot, we have one pending
3423// request that completes synchronously, thereby making the Group empty.
3424TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3425 const int kUnlimitedSockets = 100;
3426 const int kOneSocketPerGroup = 1;
3427 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3428
3429 // Make the first request asynchronous fail.
3430 // This will free up a socket slot later.
3431 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3432
3433 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523434 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203435 EXPECT_EQ(
3436 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523437 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283438 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503439 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3440 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263441 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513442
3443 // Make the second request synchronously fail. This should make the Group
3444 // empty.
3445 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3446 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523447 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513448 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3449 // when created.
tfarina428341112016-09-22 13:38:203450 EXPECT_EQ(
3451 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523452 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283453 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503454 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3455 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513456
Matt Menke9fa17d52019-03-25 19:12:263457 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513458
robpercival214763f2016-07-01 23:27:013459 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3460 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263461 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513462}
3463
[email protected]e1b54dc2010-10-06 21:27:223464TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3465 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3466
3467 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3468
3469 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523470 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203471 EXPECT_EQ(
3472 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523473 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283474 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503475 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3476 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223477
3478 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523479 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203480 EXPECT_EQ(
3481 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523482 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283483 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503484 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3485 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223486 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523487 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203488 EXPECT_EQ(
3489 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523490 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283491 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503492 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3493 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223494
robpercival214763f2016-07-01 23:27:013495 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3496 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3497 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223498
3499 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353500 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383501 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353502 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383503 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223504
3505 handle1.Reset();
3506 handle2.Reset();
3507 handle3.Reset();
3508
Matt Menkec6b3edf72019-03-19 17:00:393509 EXPECT_EQ(OK, handle1.Init(
Anton Bikineev068d2912021-05-15 20:43:523510 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283511 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393512 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3513 pool_.get(), NetLogWithSource()));
3514 EXPECT_EQ(OK, handle2.Init(
Anton Bikineev068d2912021-05-15 20:43:523515 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283516 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393517 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3518 pool_.get(), NetLogWithSource()));
3519 EXPECT_EQ(OK, handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:523520 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283521 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393522 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3523 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223524
3525 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3526 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3527 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3528}
3529
[email protected]2c2bef152010-10-13 00:55:033530TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3531 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3532 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3533
Anton Bikineev068d2912021-05-15 20:43:523534 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283535 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033536
Matt Menke9fa17d52019-03-25 19:12:263537 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3538 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3539 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3540 TestGroupId("a")));
3541 EXPECT_EQ(2u,
3542 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393543 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033544
3545 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523546 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203547 EXPECT_EQ(
3548 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523549 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283550 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503551 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3552 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033553
3554 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523555 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203556 EXPECT_EQ(
3557 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523558 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283559 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503560 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3561 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033562
Matt Menke9fa17d52019-03-25 19:12:263563 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3564 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3565 TestGroupId("a")));
3566 EXPECT_EQ(0u,
3567 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393568 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033569
robpercival214763f2016-07-01 23:27:013570 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3571 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033572 handle1.Reset();
3573 handle2.Reset();
3574
Matt Menke9fa17d52019-03-25 19:12:263575 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3576 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3577 TestGroupId("a")));
3578 EXPECT_EQ(0u,
3579 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393580 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033581}
3582
3583TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3584 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3585 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3586
3587 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523588 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203589 EXPECT_EQ(
3590 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523591 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283592 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503593 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3594 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033595
Matt Menke9fa17d52019-03-25 19:12:263596 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3597 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3598 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3599 TestGroupId("a")));
3600 EXPECT_EQ(0u,
3601 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393602 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033603
Anton Bikineev068d2912021-05-15 20:43:523604 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283605 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033606
Matt Menke9fa17d52019-03-25 19:12:263607 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3608 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3609 TestGroupId("a")));
3610 EXPECT_EQ(1u,
3611 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393612 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033613
3614 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523615 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203616 EXPECT_EQ(
3617 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523618 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283619 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503620 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3621 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033622
Matt Menke9fa17d52019-03-25 19:12:263623 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3624 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3625 TestGroupId("a")));
3626 EXPECT_EQ(0u,
3627 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393628 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033629
robpercival214763f2016-07-01 23:27:013630 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3631 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033632 handle1.Reset();
3633 handle2.Reset();
3634
Matt Menke9fa17d52019-03-25 19:12:263635 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3636 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3637 TestGroupId("a")));
3638 EXPECT_EQ(0u,
3639 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393640 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033641}
3642
3643TEST_F(ClientSocketPoolBaseTest,
3644 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3645 CreatePool(4, 4);
3646 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3647
3648 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523649 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203650 EXPECT_EQ(
3651 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523652 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283653 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503654 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3655 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033656
3657 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523658 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203659 EXPECT_EQ(
3660 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523661 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283662 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503663 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3664 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033665
3666 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523667 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203668 EXPECT_EQ(
3669 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523670 handle3.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283671 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503672 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3673 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033674
Matt Menke9fa17d52019-03-25 19:12:263675 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3676 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3677 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3678 TestGroupId("a")));
3679 EXPECT_EQ(0u,
3680 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393681 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033682
Anton Bikineev068d2912021-05-15 20:43:523683 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283684 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033685
Matt Menke9fa17d52019-03-25 19:12:263686 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3687 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3688 TestGroupId("a")));
3689 EXPECT_EQ(0u,
3690 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393691 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033692
robpercival214763f2016-07-01 23:27:013693 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3694 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3695 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033696 handle1.Reset();
3697 handle2.Reset();
3698 handle3.Reset();
3699
Matt Menke9fa17d52019-03-25 19:12:263700 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3701 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3702 TestGroupId("a")));
3703 EXPECT_EQ(0u,
3704 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393705 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033706}
3707
3708TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3709 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3710 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3711
Matt Menke9fa17d52019-03-25 19:12:263712 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033713
Anton Bikineev068d2912021-05-15 20:43:523714 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283715 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033716
Matt Menke9fa17d52019-03-25 19:12:263717 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433718 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393719 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263720 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3721 EXPECT_EQ(
3722 kDefaultMaxSockets,
3723 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3724 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433725 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263726 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3727 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033728
Matt Menke9fa17d52019-03-25 19:12:263729 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033730
Anton Bikineev068d2912021-05-15 20:43:523731 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283732 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033733
Matt Menke9fa17d52019-03-25 19:12:263734 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033735}
3736
3737TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3738 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3739 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3740
Matt Menke9fa17d52019-03-25 19:12:263741 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033742
Anton Bikineev068d2912021-05-15 20:43:523743 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283744 kDefaultMaxSockets - 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033745
Matt Menke9fa17d52019-03-25 19:12:263746 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433747 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393748 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263749 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3750 EXPECT_EQ(
3751 kDefaultMaxSockets - 1,
3752 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3753 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433754 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263755 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3756 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483757 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033758
Matt Menke9fa17d52019-03-25 19:12:263759 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033760
Anton Bikineev068d2912021-05-15 20:43:523761 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283762 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033763
Matt Menke9fa17d52019-03-25 19:12:263764 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3765 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483766 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033767}
3768
3769TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3770 CreatePool(4, 4);
3771 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3772
3773 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523774 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203775 EXPECT_EQ(
3776 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523777 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283778 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503779 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3780 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013781 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033782 handle1.Reset();
3783
Matt Menke9fa17d52019-03-25 19:12:263784 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3785 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3786 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3787 TestGroupId("a")));
3788 EXPECT_EQ(0u,
3789 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393790 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033791
Anton Bikineev068d2912021-05-15 20:43:523792 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283793 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033794
Matt Menke9fa17d52019-03-25 19:12:263795 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3796 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3797 TestGroupId("a")));
3798 EXPECT_EQ(1u,
3799 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393800 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033801}
3802
3803TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3804 CreatePool(4, 4);
3805 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3806
3807 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523808 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203809 EXPECT_EQ(
3810 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523811 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283812 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503813 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3814 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013815 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033816
Matt Menke9fa17d52019-03-25 19:12:263817 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3818 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3819 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3820 TestGroupId("a")));
3821 EXPECT_EQ(0u,
3822 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393823 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263824 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033825
Anton Bikineev068d2912021-05-15 20:43:523826 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283827 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033828
Matt Menke9fa17d52019-03-25 19:12:263829 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3830 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3831 TestGroupId("a")));
3832 EXPECT_EQ(1u,
3833 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393834 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263835 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033836}
3837
3838TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3839 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3840 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3841
Anton Bikineev068d2912021-05-15 20:43:523842 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283843 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033844
Matt Menke9fa17d52019-03-25 19:12:263845 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3846 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3847 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3848 TestGroupId("a")));
3849 EXPECT_EQ(0u,
3850 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433851 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393852 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033853
Anton Bikineev068d2912021-05-15 20:43:523854 pool_->RequestSockets(TestGroupId("b"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283855 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033856
Matt Menke9fa17d52019-03-25 19:12:263857 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3858 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3859 TestGroupId("b")));
3860 EXPECT_EQ(0u,
3861 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433862 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393863 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033864}
3865
[email protected]3c819f522010-12-02 02:03:123866TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3867 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3868 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3869
Anton Bikineev068d2912021-05-15 20:43:523870 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283871 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123872
Matt Menke9fa17d52019-03-25 19:12:263873 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523874
3875 connect_job_factory_->set_job_type(
3876 TestConnectJob::kMockAdditionalErrorStateJob);
Anton Bikineev068d2912021-05-15 20:43:523877 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:283878 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523879
Matt Menke9fa17d52019-03-25 19:12:263880 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123881}
3882
[email protected]8159a1c2012-06-07 00:00:103883TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033884 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433885 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033886
Anton Bikineev068d2912021-05-15 20:43:523887 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283888 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033889
Matt Menke9fa17d52019-03-25 19:12:263890 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3891 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3892 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3893 TestGroupId("a")));
3894 EXPECT_EQ(2u,
3895 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3896 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393897 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033898
Anton Bikineev068d2912021-05-15 20:43:523899 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283900 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263901 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3902 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3903 TestGroupId("a")));
3904 EXPECT_EQ(2u,
3905 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3906 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393907 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033908
3909 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523910 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203911 EXPECT_EQ(
3912 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523913 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283914 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503915 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3916 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433917
3918 client_socket_factory_.SignalJob(0);
3919 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3920
Matt Menke9fa17d52019-03-25 19:12:263921 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3922 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3923 TestGroupId("a")));
3924 EXPECT_EQ(1u,
3925 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3926 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393927 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033928
3929 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523930 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433931 EXPECT_EQ(
3932 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:523933 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:283934 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503935 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3936 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433937 client_socket_factory_.SignalJob(0);
3938 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033939
Matt Menke9fa17d52019-03-25 19:12:263940 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3941 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3942 TestGroupId("a")));
3943 EXPECT_EQ(0u,
3944 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3945 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393946 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103947
[email protected]2c2bef152010-10-13 00:55:033948 handle1.Reset();
3949 handle2.Reset();
3950
Matt Menke9fa17d52019-03-25 19:12:263951 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3952 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3953 TestGroupId("a")));
3954 EXPECT_EQ(0u,
3955 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3956 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393957 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033958
Anton Bikineev068d2912021-05-15 20:43:523959 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283960 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263961 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3962 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3963 TestGroupId("a")));
3964 EXPECT_EQ(0u,
3965 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3966 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393967 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033968}
3969
3970TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3971 CreatePool(4, 4);
3972 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3973
Anton Bikineev068d2912021-05-15 20:43:523974 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:283975 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033976
Matt Menke9fa17d52019-03-25 19:12:263977 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3978 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3979 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3980 TestGroupId("a")));
3981 EXPECT_EQ(1u,
3982 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393983 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033984
Anton Bikineev068d2912021-05-15 20:43:523985 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:283986 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263987 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3988 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3989 TestGroupId("a")));
3990 EXPECT_EQ(2u,
3991 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393992 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033993
Anton Bikineev068d2912021-05-15 20:43:523994 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 3,
Matt Menkef09e64c2019-04-23 22:16:283995 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263996 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3997 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3998 TestGroupId("a")));
3999 EXPECT_EQ(3u,
4000 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394001 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034002
Anton Bikineev068d2912021-05-15 20:43:524003 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284004 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264005 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4006 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4007 TestGroupId("a")));
4008 EXPECT_EQ(3u,
4009 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394010 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034011}
4012
4013TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
4014 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434015 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:034016
Anton Bikineev068d2912021-05-15 20:43:524017 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284018 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:034019
Matt Menke9fa17d52019-03-25 19:12:264020 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4021 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4022 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4023 TestGroupId("a")));
4024 EXPECT_EQ(1u,
4025 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394026 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034027
4028 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524029 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204030 EXPECT_EQ(
4031 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524032 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284033 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504034 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4035 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034036
Matt Menke9fa17d52019-03-25 19:12:264037 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4038 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4039 TestGroupId("a")));
4040 EXPECT_EQ(0u,
4041 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394042 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034043
Lily Chenecebf932018-11-02 17:15:434044 client_socket_factory_.SignalJobs();
4045 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4046
Matt Menke9fa17d52019-03-25 19:12:264047 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4048 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4049 TestGroupId("a")));
4050 EXPECT_EQ(0u,
4051 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394052 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264053 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034054
[email protected]0dc88b32014-03-26 20:12:284055 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:484056 // starts, it has a connect start time.
4057 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:034058 handle1.Reset();
4059
Matt Menkec6b3edf72019-03-19 17:00:394060 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034061}
4062
[email protected]034df0f32013-01-07 23:17:484063// Checks that fully connected preconnect jobs have no connect times, and are
4064// marked as reused.
4065TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
4066 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4067 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Anton Bikineev068d2912021-05-15 20:43:524068 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284069 NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:484070
Matt Menke9fa17d52019-03-25 19:12:264071 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4072 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4073 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4074 TestGroupId("a")));
4075 EXPECT_EQ(0u,
4076 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394077 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484078
4079 ClientSocketHandle handle;
4080 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394081 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524082 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284083 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394084 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4085 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484086
4087 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394088 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484089
4090 TestLoadTimingInfoConnectedReused(handle);
4091 handle.Reset();
4092 TestLoadTimingInfoNotConnected(handle);
4093}
4094
[email protected]dcbe168a2010-12-02 03:14:464095// http://crbug.com/64940 regression test.
4096TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4097 const int kMaxTotalSockets = 3;
4098 const int kMaxSocketsPerGroup = 2;
4099 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434100 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464101
Matt Menkef6edce752019-03-19 17:21:564102 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464103 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4104
4105 // Set up one idle socket in "a".
4106 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524107 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204108 EXPECT_EQ(
4109 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524110 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284111 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504112 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4113 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264114 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4115 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4116 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4117 TestGroupId("a")));
4118 EXPECT_EQ(0u,
4119 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394120 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464121
Lily Chenecebf932018-11-02 17:15:434122 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014123 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264124 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4125 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4126 TestGroupId("a")));
4127 EXPECT_EQ(0u,
4128 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4129 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434130
[email protected]dcbe168a2010-12-02 03:14:464131 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394132 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464133
4134 // Set up two active sockets in "b".
4135 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524136 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204137 EXPECT_EQ(
4138 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524139 handle1.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284140 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504141 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4142 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204143 EXPECT_EQ(
4144 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524145 handle2.Init(TestGroupId("b"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284146 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504147 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4148 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464149
Matt Menke9fa17d52019-03-25 19:12:264150 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4151 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4152 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4153 TestGroupId("b")));
4154 EXPECT_EQ(0u,
4155 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394156 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434157
4158 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014159 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4160 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394161 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264162 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4163 TestGroupId("b")));
4164 EXPECT_EQ(0u,
4165 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4166 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464167
4168 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4169 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4170 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4171 // sockets for "a", and "b" should still have 2 active sockets.
4172
Anton Bikineev068d2912021-05-15 20:43:524173 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:284174 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264175 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4176 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4177 TestGroupId("a")));
4178 EXPECT_EQ(0u,
4179 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394180 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264181 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4182 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4183 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4184 TestGroupId("b")));
4185 EXPECT_EQ(0u,
4186 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394187 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264188 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464189
4190 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4191 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4192 // "a" should result in closing 1 for "b".
4193 handle1.Reset();
4194 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394195 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264196 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464197
Anton Bikineev068d2912021-05-15 20:43:524198 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:284199 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264200 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4201 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4202 TestGroupId("a")));
4203 EXPECT_EQ(1u,
4204 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394205 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264206 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4207 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4208 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4209 TestGroupId("b")));
4210 EXPECT_EQ(0u,
4211 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394212 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264213 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464214}
4215
[email protected]b7b8be42011-07-12 12:46:414216TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264217 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4218 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074219
4220 // Make the ConnectJob hang until it times out, shorten the timeout.
4221 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4222 connect_job_factory_->set_timeout_duration(
4223 base::TimeDelta::FromMilliseconds(500));
Anton Bikineev068d2912021-05-15 20:43:524224 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284225 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264226 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4227 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4228 TestGroupId("a")));
4229 EXPECT_EQ(1u,
4230 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394231 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074232
[email protected]b7b8be42011-07-12 12:46:414233 // Verify the backup timer doesn't create a backup job, by making
4234 // the backup job a pending job instead of a waiting job, so it
4235 // *would* complete if it were created.
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594236 base::RunLoop loop;
[email protected]a9fc8fc2011-05-10 02:41:074237 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454238 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Lukasz Krakowiak855292082020-06-19 12:43:584239 FROM_HERE, loop.QuitClosure(), base::TimeDelta::FromSeconds(1));
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594240 loop.Run();
Matt Menke9fa17d52019-03-25 19:12:264241 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074242}
4243
[email protected]b7b8be42011-07-12 12:46:414244TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264245 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4246 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074247
4248 // Make the ConnectJob hang forever.
4249 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Anton Bikineev068d2912021-05-15 20:43:524250 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284251 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264252 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4253 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4254 TestGroupId("a")));
4255 EXPECT_EQ(1u,
4256 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394257 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284258 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074259
4260 // Make the backup job be a pending job, so it completes normally.
4261 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4262 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524263 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504264 EXPECT_EQ(
4265 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524266 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284267 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4268 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4269 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414270 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264271 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4272 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4273 TestGroupId("a")));
4274 EXPECT_EQ(0u,
4275 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394276 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264277 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014278 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074279
4280 // The hung connect job should still be there, but everything else should be
4281 // complete.
Matt Menke9fa17d52019-03-25 19:12:264282 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4283 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4284 TestGroupId("a")));
4285 EXPECT_EQ(1u,
4286 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394287 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264288 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074289}
4290
[email protected]0dc88b32014-03-26 20:12:284291// Tests that a preconnect that starts out with unread data can still be used.
4292// http://crbug.com/334467
4293TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4294 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4295 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4296
Anton Bikineev068d2912021-05-15 20:43:524297 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284298 NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284299
Matt Menke9fa17d52019-03-25 19:12:264300 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4301 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4302 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4303 TestGroupId("a")));
4304 EXPECT_EQ(0u,
4305 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394306 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284307
4308 // Fail future jobs to be sure that handle receives the preconnected socket
4309 // rather than closing it and making a new one.
4310 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4311 ClientSocketHandle handle;
4312 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394313 EXPECT_EQ(OK, handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524314 TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284315 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394316 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4317 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284318
Matt Menke9fa17d52019-03-25 19:12:264319 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4320 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4321 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4322 TestGroupId("a")));
4323 EXPECT_EQ(0u,
4324 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394325 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264326 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284327
4328 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354329 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284330
4331 TestLoadTimingInfoConnectedReused(handle);
4332 handle.Reset();
4333
4334 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394335 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284336}
4337
Lily Chenecebf932018-11-02 17:15:434338TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4339 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4340 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4341
4342 ClientSocketHandle handle1;
4343 TestCompletionCallback callback1;
4344 EXPECT_EQ(
4345 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524346 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284347 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504348 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4349 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434350
Matt Menke9fa17d52019-03-25 19:12:264351 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4352 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4353 TestGroupId("a")));
4354 EXPECT_EQ(0u,
4355 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394356 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434357
Matt Menkec6b3edf72019-03-19 17:00:394358 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4359 &handle1));
Lily Chenecebf932018-11-02 17:15:434360}
4361
4362TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4363 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4364 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4365
4366 ClientSocketHandle handle1;
4367 TestCompletionCallback callback1;
4368 EXPECT_EQ(
4369 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524370 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284371 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504372 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4373 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434374
Matt Menke9fa17d52019-03-25 19:12:264375 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4376 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4377 TestGroupId("a")));
4378 EXPECT_EQ(0u,
4379 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394380 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434381
4382 ClientSocketHandle handle2;
4383 TestCompletionCallback callback2;
4384 EXPECT_EQ(
4385 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524386 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284387 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504388 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4389 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434390
Matt Menke9fa17d52019-03-25 19:12:264391 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4392 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4393 TestGroupId("a")));
4394 EXPECT_EQ(0u,
4395 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394396 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434397
Matt Menkec6b3edf72019-03-19 17:00:394398 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4399 &handle1));
4400 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4401 &handle2));
Lily Chenecebf932018-11-02 17:15:434402
4403 // One job completes. The other request should still have its job.
4404 client_socket_factory_.SignalJob(0);
4405 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4406
Matt Menke9fa17d52019-03-25 19:12:264407 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4408 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4409 TestGroupId("a")));
4410 EXPECT_EQ(0u,
4411 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4412 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394413 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434414
Matt Menkec6b3edf72019-03-19 17:00:394415 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4416 &handle2));
Lily Chenecebf932018-11-02 17:15:434417}
4418
4419TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4420 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4421 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4422
Anton Bikineev068d2912021-05-15 20:43:524423 pool_->RequestSockets(TestGroupId("a"), params_, absl::nullopt, 1,
Matt Menkef09e64c2019-04-23 22:16:284424 NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434425
Matt Menke9fa17d52019-03-25 19:12:264426 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4427 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4428 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4429 TestGroupId("a")));
4430 EXPECT_EQ(1u,
4431 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394432 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434433
4434 ClientSocketHandle handle1;
4435 TestCompletionCallback callback1;
4436 EXPECT_EQ(
4437 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524438 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284439 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504440 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4441 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434442
Matt Menke9fa17d52019-03-25 19:12:264443 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4444 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4445 TestGroupId("a")));
4446 EXPECT_EQ(0u,
4447 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394448 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434449
Matt Menkec6b3edf72019-03-19 17:00:394450 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4451 &handle1));
Lily Chenecebf932018-11-02 17:15:434452}
4453
4454TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4455 CreatePool(kDefaultMaxSockets, 1);
4456 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4457
4458 ClientSocketHandle handle1;
4459 TestCompletionCallback callback1;
4460 EXPECT_EQ(
4461 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524462 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284463 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504464 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4465 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434466
Matt Menke9fa17d52019-03-25 19:12:264467 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4468 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4469 TestGroupId("a")));
4470 EXPECT_EQ(0u,
4471 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394472 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434473
Matt Menkec6b3edf72019-03-19 17:00:394474 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4475 &handle1));
Lily Chenecebf932018-11-02 17:15:434476
4477 // Insert a higher priority request
4478 ClientSocketHandle handle2;
4479 TestCompletionCallback callback2;
4480 EXPECT_EQ(
4481 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524482 handle2.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284483 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504484 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4485 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434486
Matt Menke9fa17d52019-03-25 19:12:264487 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4488 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4489 TestGroupId("a")));
4490 EXPECT_EQ(0u,
4491 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394492 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434493
4494 // The highest priority request should steal the job from the default priority
4495 // request.
Matt Menkec6b3edf72019-03-19 17:00:394496 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4497 &handle2));
4498 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4499 &handle1));
Lily Chenecebf932018-11-02 17:15:434500}
4501
4502TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4503 CreatePool(3, 3);
4504 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4505
4506 ClientSocketHandle handle_lowest;
4507 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284508 EXPECT_EQ(
4509 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524510 handle_lowest.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284511 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4512 callback_lowest.callback(),
4513 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4514 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434515
Matt Menke9fa17d52019-03-25 19:12:264516 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4517 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4518 TestGroupId("a")));
4519 EXPECT_EQ(0u,
4520 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394521 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434522
4523 ClientSocketHandle handle_highest;
4524 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284525 EXPECT_EQ(
4526 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524527 handle_highest.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284528 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4529 callback_highest.callback(),
4530 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4531 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434532
Matt Menke9fa17d52019-03-25 19:12:264533 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4534 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4535 TestGroupId("a")));
4536 EXPECT_EQ(0u,
4537 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394538 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434539
4540 ClientSocketHandle handle_low;
4541 TestCompletionCallback callback_low;
4542 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284543 handle_low.Init(
Anton Bikineev068d2912021-05-15 20:43:524544 TestGroupId("a"), params_, absl::nullopt, LOW, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284545 ClientSocketPool::RespectLimits::ENABLED,
4546 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4547 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434548
Matt Menke9fa17d52019-03-25 19:12:264549 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4550 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4551 TestGroupId("a")));
4552 EXPECT_EQ(0u,
4553 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394554 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434555
4556 ClientSocketHandle handle_lowest2;
4557 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284558 EXPECT_EQ(
4559 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524560 handle_lowest2.Init(TestGroupId("a"), params_, absl::nullopt, LOWEST,
Matt Menkef09e64c2019-04-23 22:16:284561 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4562 callback_lowest2.callback(),
4563 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4564 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434565
Matt Menke9fa17d52019-03-25 19:12:264566 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4567 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4568 TestGroupId("a")));
4569 EXPECT_EQ(0u,
4570 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394571 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434572
4573 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394574 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4575 &handle_highest));
4576 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4577 &handle_low));
4578 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4579 &handle_lowest));
4580 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4581 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434582
4583 // Add another request with medium priority. It should steal the job from the
4584 // lowest priority request with a job.
4585 ClientSocketHandle handle_medium;
4586 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284587 EXPECT_EQ(
4588 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524589 handle_medium.Init(TestGroupId("a"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:284590 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4591 callback_medium.callback(),
4592 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4593 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434594
Matt Menke9fa17d52019-03-25 19:12:264595 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4596 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4597 TestGroupId("a")));
4598 EXPECT_EQ(0u,
4599 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394600 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4601 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4602 &handle_highest));
4603 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4604 &handle_medium));
4605 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4606 &handle_low));
4607 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4608 &handle_lowest));
4609 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4610 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434611}
4612
4613TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4614 CreatePool(kDefaultMaxSockets, 1);
4615 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4616
4617 ClientSocketHandle handle1;
4618 TestCompletionCallback callback1;
4619 EXPECT_EQ(
4620 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524621 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284622 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504623 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4624 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434625
Matt Menke9fa17d52019-03-25 19:12:264626 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4627 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4628 TestGroupId("a")));
4629 EXPECT_EQ(0u,
4630 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394631 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434632
4633 ClientSocketHandle handle2;
4634 TestCompletionCallback callback2;
4635 EXPECT_EQ(
4636 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524637 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284638 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504639 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4640 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434641
Matt Menke9fa17d52019-03-25 19:12:264642 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4643 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4644 TestGroupId("a")));
4645 EXPECT_EQ(0u,
4646 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394647 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434648
4649 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394650 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4651 &handle1));
4652 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4653 &handle2));
Lily Chenecebf932018-11-02 17:15:434654
4655 // Reprioritizing the second request places it above the first, and it steals
4656 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394657 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4658 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4659 &handle2));
4660 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4661 &handle1));
Lily Chenecebf932018-11-02 17:15:434662}
4663
4664TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4665 CreatePool(kDefaultMaxSockets, 1);
4666 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4667
4668 ClientSocketHandle handle1;
4669 TestCompletionCallback callback1;
4670 EXPECT_EQ(
4671 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524672 handle1.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284673 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504674 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4675 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434676
Matt Menke9fa17d52019-03-25 19:12:264677 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4678 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4679 TestGroupId("a")));
4680 EXPECT_EQ(0u,
4681 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394682 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434683
Matt Menkec6b3edf72019-03-19 17:00:394684 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4685 &handle1));
Lily Chenecebf932018-11-02 17:15:434686
4687 ClientSocketHandle handle2;
4688 TestCompletionCallback callback2;
4689 EXPECT_EQ(
4690 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524691 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284692 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504693 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4694 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434695
Matt Menke9fa17d52019-03-25 19:12:264696 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4697 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4698 TestGroupId("a")));
4699 EXPECT_EQ(0u,
4700 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394701 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434702
4703 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394704 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4705 &handle1));
4706 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4707 &handle2));
Lily Chenecebf932018-11-02 17:15:434708
4709 // The second request should get a job upon cancelling the first request.
4710 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264711 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4712 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4713 TestGroupId("a")));
4714 EXPECT_EQ(0u,
4715 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394716 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434717
Matt Menkec6b3edf72019-03-19 17:00:394718 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4719 &handle2));
Lily Chenecebf932018-11-02 17:15:434720}
4721
4722TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4723 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4724 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4725
4726 ClientSocketHandle handle1;
4727 TestCompletionCallback callback1;
4728 EXPECT_EQ(
4729 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524730 handle1.Init(TestGroupId("a"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:284731 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504732 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4733 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434734
Matt Menke9fa17d52019-03-25 19:12:264735 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4736 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4737 TestGroupId("a")));
4738 EXPECT_EQ(0u,
4739 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394740 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434741
4742 ClientSocketHandle handle2;
4743 TestCompletionCallback callback2;
4744 EXPECT_EQ(
4745 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524746 handle2.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284747 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504748 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4749 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434750
Matt Menke9fa17d52019-03-25 19:12:264751 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4752 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4753 TestGroupId("a")));
4754 EXPECT_EQ(0u,
4755 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394756 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434757
Matt Menkec6b3edf72019-03-19 17:00:394758 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4759 &handle1));
4760 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4761 &handle2));
Lily Chenecebf932018-11-02 17:15:434762
4763 // The lower-priority job completes first. The higher-priority request should
4764 // get the socket, and the lower-priority request should get the remaining
4765 // job.
4766 client_socket_factory_.SignalJob(1);
4767 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264768 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4769 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4770 TestGroupId("a")));
4771 EXPECT_EQ(0u,
4772 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4773 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394774 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434775 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394776 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4777 &handle2));
Lily Chenecebf932018-11-02 17:15:434778}
4779
[email protected]043b68c82013-08-22 23:41:524780class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204781 public:
Matt Menke9fa17d52019-03-25 19:12:264782 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394783 const ClientSocketPool::GroupId& group_id)
4784 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524785 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204786 }
4787
Daniel Cheng4496d0822018-04-26 21:52:154788 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204789
Matt Menke9fa17d52019-03-25 19:12:264790 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504791 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034792 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524793 absl::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkef09e64c2019-04-23 22:16:284794 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4795 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204796 }
4797
Matt Menke9fa17d52019-03-25 19:12:264798 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504799 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034800 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Anton Bikineev068d2912021-05-15 20:43:524801 absl::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504802 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4803 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204804 }
4805
4806 bool ReleaseOneConnection() {
4807 if (!handle_.is_initialized() || !can_release_connection_) {
4808 return false;
4809 }
4810 handle_.socket()->Disconnect();
4811 handle_.Reset();
4812 return true;
4813 }
4814
4815 void set_can_release_connection(bool can_release_connection) {
4816 can_release_connection_ = can_release_connection;
4817 }
4818
4819 MOCK_METHOD0(CloseOneIdleConnection, bool());
4820
4821 private:
Matt Menke9fa17d52019-03-25 19:12:264822 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204823 ClientSocketHandle handle_;
4824 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394825 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204826 bool can_release_connection_;
4827};
4828
[email protected]58e562f2013-04-22 17:32:204829// Tests the basic case of closing an idle socket in a higher layered pool when
4830// a new request is issued and the lower layer pool is stalled.
4831TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4832 CreatePool(1, 1);
4833 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4834
Matt Menkec6b3edf72019-03-19 17:00:394835 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014836 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204837 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4838 .WillOnce(Invoke(&mock_layered_pool,
4839 &MockLayeredPool::ReleaseOneConnection));
4840 ClientSocketHandle handle;
4841 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504842 EXPECT_EQ(
4843 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524844 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284845 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4846 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4847 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014848 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204849}
4850
Matt Menke833678642019-03-05 22:05:514851// Tests the case that trying to close an idle socket in a higher layered pool
4852// fails.
4853TEST_F(ClientSocketPoolBaseTest,
4854 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4855 CreatePool(1, 1);
4856 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4857
Matt Menkec6b3edf72019-03-19 17:00:394858 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514859 mock_layered_pool.set_can_release_connection(false);
4860 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4861 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4862 .WillOnce(Invoke(&mock_layered_pool,
4863 &MockLayeredPool::ReleaseOneConnection));
4864 ClientSocketHandle handle;
4865 TestCompletionCallback callback;
4866 EXPECT_EQ(
4867 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:524868 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284869 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4870 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4871 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514872 base::RunLoop().RunUntilIdle();
4873 EXPECT_FALSE(callback.have_result());
4874}
4875
[email protected]58e562f2013-04-22 17:32:204876// Same as above, but the idle socket is in the same group as the stalled
4877// socket, and closes the only other request in its group when closing requests
4878// in higher layered pools. This generally shouldn't happen, but it may be
4879// possible if a higher level pool issues a request and the request is
4880// subsequently cancelled. Even if it's not possible, best not to crash.
4881TEST_F(ClientSocketPoolBaseTest,
4882 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4883 CreatePool(2, 2);
4884 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4885
4886 // Need a socket in another group for the pool to be stalled (If a group
4887 // has the maximum number of connections already, it's not stalled).
4888 ClientSocketHandle handle1;
4889 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524890 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284891 DEFAULT_PRIORITY, SocketTag(),
4892 ClientSocketPool::RespectLimits::ENABLED,
4893 callback1.callback(),
4894 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4895 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204896
Matt Menkec6b3edf72019-03-19 17:00:394897 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014898 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204899 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4900 .WillOnce(Invoke(&mock_layered_pool,
4901 &MockLayeredPool::ReleaseOneConnection));
4902 ClientSocketHandle handle;
4903 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284904 EXPECT_EQ(ERR_IO_PENDING,
4905 handle.Init(
Anton Bikineev068d2912021-05-15 20:43:524906 TestGroupId("group2"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284907 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4908 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4909 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014910 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204911}
4912
4913// Tests the case when an idle socket can be closed when a new request is
4914// issued, and the new request belongs to a group that was previously stalled.
4915TEST_F(ClientSocketPoolBaseTest,
4916 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4917 CreatePool(2, 2);
4918 std::list<TestConnectJob::JobType> job_types;
4919 job_types.push_back(TestConnectJob::kMockJob);
4920 job_types.push_back(TestConnectJob::kMockJob);
4921 job_types.push_back(TestConnectJob::kMockJob);
4922 job_types.push_back(TestConnectJob::kMockJob);
4923 connect_job_factory_->set_job_types(&job_types);
4924
4925 ClientSocketHandle handle1;
4926 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524927 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284928 DEFAULT_PRIORITY, SocketTag(),
4929 ClientSocketPool::RespectLimits::ENABLED,
4930 callback1.callback(),
4931 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4932 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204933
Matt Menkec6b3edf72019-03-19 17:00:394934 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014935 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204936 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4937 .WillRepeatedly(Invoke(&mock_layered_pool,
4938 &MockLayeredPool::ReleaseOneConnection));
4939 mock_layered_pool.set_can_release_connection(false);
4940
4941 // The third request is made when the socket pool is in a stalled state.
4942 ClientSocketHandle handle3;
4943 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:284944 EXPECT_EQ(ERR_IO_PENDING,
4945 handle3.Init(
Anton Bikineev068d2912021-05-15 20:43:524946 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284947 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4948 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4949 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204950
4951 base::RunLoop().RunUntilIdle();
4952 EXPECT_FALSE(callback3.have_result());
4953
4954 // The fourth request is made when the pool is no longer stalled. The third
4955 // request should be serviced first, since it was issued first and has the
4956 // same priority.
4957 mock_layered_pool.set_can_release_connection(true);
4958 ClientSocketHandle handle4;
4959 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:284960 EXPECT_EQ(ERR_IO_PENDING,
4961 handle4.Init(
Anton Bikineev068d2912021-05-15 20:43:524962 TestGroupId("group3"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:284963 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4964 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4965 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014966 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204967 EXPECT_FALSE(callback4.have_result());
4968
4969 // Closing a handle should free up another socket slot.
4970 handle1.Reset();
robpercival214763f2016-07-01 23:27:014971 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204972}
4973
4974// Tests the case when an idle socket can be closed when a new request is
4975// issued, and the new request belongs to a group that was previously stalled.
4976//
4977// The two differences from the above test are that the stalled requests are not
4978// in the same group as the layered pool's request, and the the fourth request
4979// has a higher priority than the third one, so gets a socket first.
4980TEST_F(ClientSocketPoolBaseTest,
4981 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4982 CreatePool(2, 2);
4983 std::list<TestConnectJob::JobType> job_types;
4984 job_types.push_back(TestConnectJob::kMockJob);
4985 job_types.push_back(TestConnectJob::kMockJob);
4986 job_types.push_back(TestConnectJob::kMockJob);
4987 job_types.push_back(TestConnectJob::kMockJob);
4988 connect_job_factory_->set_job_types(&job_types);
4989
4990 ClientSocketHandle handle1;
4991 TestCompletionCallback callback1;
Anton Bikineev068d2912021-05-15 20:43:524992 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, absl::nullopt,
Matt Menkef09e64c2019-04-23 22:16:284993 DEFAULT_PRIORITY, SocketTag(),
4994 ClientSocketPool::RespectLimits::ENABLED,
4995 callback1.callback(),
4996 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4997 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204998
Matt Menkec6b3edf72019-03-19 17:00:394999 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:015000 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205001 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
5002 .WillRepeatedly(Invoke(&mock_layered_pool,
5003 &MockLayeredPool::ReleaseOneConnection));
5004 mock_layered_pool.set_can_release_connection(false);
5005
5006 // The third request is made when the socket pool is in a stalled state.
5007 ClientSocketHandle handle3;
5008 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:205009 EXPECT_EQ(
5010 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525011 handle3.Init(TestGroupId("group3"), params_, absl::nullopt, MEDIUM,
Matt Menkef09e64c2019-04-23 22:16:285012 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505013 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5014 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205015
5016 base::RunLoop().RunUntilIdle();
5017 EXPECT_FALSE(callback3.have_result());
5018
5019 // The fourth request is made when the pool is no longer stalled. This
5020 // request has a higher priority than the third request, so is serviced first.
5021 mock_layered_pool.set_can_release_connection(true);
5022 ClientSocketHandle handle4;
5023 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:205024 EXPECT_EQ(
5025 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525026 handle4.Init(TestGroupId("group3"), params_, absl::nullopt, HIGHEST,
Matt Menkef09e64c2019-04-23 22:16:285027 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505028 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5029 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015030 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205031 EXPECT_FALSE(callback3.have_result());
5032
5033 // Closing a handle should free up another socket slot.
5034 handle1.Reset();
robpercival214763f2016-07-01 23:27:015035 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205036}
5037
5038TEST_F(ClientSocketPoolBaseTest,
5039 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
5040 CreatePool(1, 1);
5041 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5042
Matt Menkec6b3edf72019-03-19 17:00:395043 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:015044 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205045 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
5046 .WillRepeatedly(Invoke(&mock_layered_pool1,
5047 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:395048 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:015049 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
5050 IsOk());
[email protected]58e562f2013-04-22 17:32:205051 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
5052 .WillRepeatedly(Invoke(&mock_layered_pool2,
5053 &MockLayeredPool::ReleaseOneConnection));
5054 ClientSocketHandle handle;
5055 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:505056 EXPECT_EQ(
5057 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525058 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285059 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5060 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5061 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015062 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205063}
5064
[email protected]b021ece62013-06-11 11:06:335065// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:155066// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
5067// socket instead of a request with the same priority that was issued earlier,
5068// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:335069TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:335070 CreatePool(1, 1);
5071
5072 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395073 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5074 TestGroupId("a"), MAXIMUM_PRIORITY,
5075 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265076 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335077
5078 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5079
mmenked3641e12016-01-28 16:06:155080 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395081 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155082 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265083 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335084
mmenked3641e12016-01-28 16:06:155085 // Issue a request that ignores the limits, so a new ConnectJob is
5086 // created.
5087 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395088 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155089 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265090 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335091
robpercival214763f2016-07-01 23:27:015092 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335093 EXPECT_FALSE(request(1)->have_result());
5094}
5095
[email protected]c55fabd2013-11-04 23:26:565096// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155097// issued for a request with RespectLimits::DISABLED is not cancelled when a
5098// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565099TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565100 CreatePool(1, 1);
5101
5102 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395103 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5104 TestGroupId("a"), MAXIMUM_PRIORITY,
5105 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265106 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565107
5108 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5109
mmenked3641e12016-01-28 16:06:155110 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395111 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155112 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265113 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565114
mmenked3641e12016-01-28 16:06:155115 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5116 // created.
5117 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395118 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155119 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265120 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335121
mmenked3641e12016-01-28 16:06:155122 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335123 // should not be cancelled.
5124 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265125 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335126
robpercival214763f2016-07-01 23:27:015127 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335128 EXPECT_FALSE(request(1)->have_result());
5129}
5130
Matt Menkeb57663b32019-03-01 17:17:105131TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5132 CreatePool(1, 1);
5133
5134 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5135
5136 ClientSocketHandle handle;
5137 TestCompletionCallback callback;
5138 EXPECT_EQ(
5139 ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525140 handle.Init(TestGroupId("a"), params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285141 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5142 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5143 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105144
Matt Menke9fa17d52019-03-25 19:12:265145 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105146
5147 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5148 EXPECT_FALSE(handle.is_initialized());
5149 EXPECT_FALSE(handle.socket());
5150
5151 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265152 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105153}
5154
5155class TestAuthHelper {
5156 public:
5157 TestAuthHelper() = default;
Peter Boström293b1342021-09-22 17:31:435158
5159 TestAuthHelper(const TestAuthHelper&) = delete;
5160 TestAuthHelper& operator=(const TestAuthHelper&) = delete;
5161
Matt Menkeb57663b32019-03-01 17:17:105162 ~TestAuthHelper() = default;
5163
Matt Menkec6b3edf72019-03-19 17:00:395164 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195165 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265166 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395167 RequestPriority priority = DEFAULT_PRIORITY,
5168 ClientSocketPool::RespectLimits respect_limits =
5169 ClientSocketPool::RespectLimits::ENABLED,
5170 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105171 EXPECT_EQ(ERR_IO_PENDING,
Anton Bikineev068d2912021-05-15 20:43:525172 handle_.Init(group_id_in, params, absl::nullopt, priority,
Matt Menkef09e64c2019-04-23 22:16:285173 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105174 base::BindRepeating(&TestAuthHelper::AuthCallback,
5175 base::Unretained(this)),
5176 pool, NetLogWithSource()));
5177 }
5178
5179 void WaitForAuth() {
5180 run_loop_ = std::make_unique<base::RunLoop>();
5181 run_loop_->Run();
5182 run_loop_.reset();
5183 }
5184
5185 void WaitForAuthAndRestartSync() {
5186 restart_sync_ = true;
5187 WaitForAuth();
5188 restart_sync_ = false;
5189 }
5190
5191 void WaitForAuthAndResetHandleSync() {
5192 reset_handle_sync_ = true;
5193 WaitForAuth();
5194 reset_handle_sync_ = false;
5195 }
5196
5197 void RestartWithAuth() {
5198 DCHECK(restart_with_auth_callback_);
5199 std::move(restart_with_auth_callback_).Run();
5200 }
5201
5202 int WaitForResult() {
5203 int result = callback_.WaitForResult();
5204 // There shouldn't be any callback waiting to be invoked once the request is
5205 // complete.
5206 EXPECT_FALSE(restart_with_auth_callback_);
5207 // The socket should only be initialized on success.
5208 EXPECT_EQ(result == OK, handle_.is_initialized());
5209 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5210 return result;
5211 }
5212
5213 ClientSocketHandle* handle() { return &handle_; }
5214 int auth_count() const { return auth_count_; }
5215 int have_result() const { return callback_.have_result(); }
5216
5217 private:
5218 void AuthCallback(const HttpResponseInfo& response,
5219 HttpAuthController* auth_controller,
5220 base::OnceClosure restart_with_auth_callback) {
5221 EXPECT_FALSE(restart_with_auth_callback_);
5222 EXPECT_TRUE(restart_with_auth_callback);
5223
5224 // Once there's a result, this method shouldn't be invoked again.
5225 EXPECT_FALSE(callback_.have_result());
5226
5227 ++auth_count_;
5228 run_loop_->Quit();
5229 if (restart_sync_) {
5230 std::move(restart_with_auth_callback).Run();
5231 return;
5232 }
5233
5234 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5235
5236 if (reset_handle_sync_) {
5237 handle_.Reset();
5238 return;
5239 }
5240 }
5241
5242 std::unique_ptr<base::RunLoop> run_loop_;
5243 base::OnceClosure restart_with_auth_callback_;
5244
5245 bool restart_sync_ = false;
5246 bool reset_handle_sync_ = false;
5247
5248 ClientSocketHandle handle_;
5249 int auth_count_ = 0;
5250 TestCompletionCallback callback_;
Matt Menkeb57663b32019-03-01 17:17:105251};
5252
5253TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5254 CreatePool(1, 1);
5255 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5256
5257 TestAuthHelper auth_helper;
5258 auth_helper.InitHandle(params_, pool_.get());
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_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395261 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105262
5263 auth_helper.WaitForAuth();
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 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265269 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015270 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395271 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105272
5273 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5274 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265275 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5276 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395277 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105278 EXPECT_EQ(0, pool_->IdleSocketCount());
5279}
5280
5281TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5282 CreatePool(1, 1);
5283 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5284
5285 TestAuthHelper auth_helper;
5286 auth_helper.InitHandle(params_, pool_.get());
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_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395289 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105290
5291 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265292 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015293 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395294 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105295
5296 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5297 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265298 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5299 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395300 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105301 EXPECT_EQ(0, pool_->IdleSocketCount());
5302}
5303
5304TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5305 CreatePool(1, 1);
5306 connect_job_factory_->set_job_type(
5307 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5308
5309 TestAuthHelper auth_helper;
5310 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265311 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105312
5313 auth_helper.WaitForAuth();
5314 auth_helper.RestartWithAuth();
5315 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5316
5317 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265318 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105319 EXPECT_EQ(0, pool_->IdleSocketCount());
5320}
5321
5322TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5323 CreatePool(1, 1);
5324 connect_job_factory_->set_job_type(
5325 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5326
5327 TestAuthHelper auth_helper;
5328 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265329 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105330
5331 auth_helper.WaitForAuthAndRestartSync();
5332 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5333
5334 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265335 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105336 EXPECT_EQ(0, pool_->IdleSocketCount());
5337}
5338
5339TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5340 CreatePool(1, 1);
5341 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5342
5343 TestAuthHelper auth_helper;
5344 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265345 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105346
5347 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265348 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105349
5350 auth_helper.handle()->Reset();
5351
5352 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265353 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105354 EXPECT_EQ(0, pool_->IdleSocketCount());
5355 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5356 EXPECT_FALSE(auth_helper.handle()->socket());
5357}
5358
5359TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5360 CreatePool(1, 1);
5361 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5362
5363 TestAuthHelper auth_helper;
5364 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265365 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105366
5367 auth_helper.WaitForAuthAndResetHandleSync();
5368 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265369 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105370 EXPECT_EQ(0, pool_->IdleSocketCount());
5371 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5372 EXPECT_FALSE(auth_helper.handle()->socket());
5373}
5374
5375TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5376 CreatePool(1, 1);
5377 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5378
5379 TestAuthHelper auth_helper;
5380 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265381 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105382
5383 auth_helper.WaitForAuth();
5384
Matt Menke433de6d2020-03-04 00:24:115385 pool_->FlushWithError(ERR_FAILED, "Network changed");
Matt Menkeb57663b32019-03-01 17:17:105386 base::RunLoop().RunUntilIdle();
5387
5388 // When flushing the socket pool, bound sockets should delay returning the
5389 // error until completion.
5390 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265391 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105392 EXPECT_EQ(0, pool_->IdleSocketCount());
5393
5394 auth_helper.RestartWithAuth();
5395 // The callback should be called asynchronously.
5396 EXPECT_FALSE(auth_helper.have_result());
5397
5398 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265399 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105400 EXPECT_EQ(0, pool_->IdleSocketCount());
5401}
5402
5403TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5404 CreatePool(1, 1);
5405 connect_job_factory_->set_job_type(
5406 TestConnectJob::kMockAuthChallengeTwiceJob);
5407
5408 TestAuthHelper auth_helper;
5409 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265410 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015411 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395412 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105413
5414 auth_helper.WaitForAuth();
5415 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265416 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105417 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015418 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395419 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105420
5421 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265422 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015423 EXPECT_EQ(2, auth_helper.auth_count());
5424 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395425 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015426
Matt Menkeb57663b32019-03-01 17:17:105427 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265428 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105429 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015430 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395431 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105432
5433 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5434 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265435 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5436 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395437 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105438 EXPECT_EQ(0, pool_->IdleSocketCount());
5439}
5440
5441TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5442 CreatePool(1, 1);
5443 connect_job_factory_->set_job_type(
5444 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5445
5446 TestAuthHelper auth_helper;
5447 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265448 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105449
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(1, auth_helper.auth_count());
5454
5455 auth_helper.WaitForAuth();
5456 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265457 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105458 EXPECT_EQ(2, auth_helper.auth_count());
5459
5460 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5461 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265462 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105463 EXPECT_EQ(0, pool_->IdleSocketCount());
5464}
5465
5466// Makes sure that when a bound request is destroyed, a new ConnectJob is
5467// created, if needed.
5468TEST_F(ClientSocketPoolBaseTest,
5469 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5470 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5471 connect_job_factory_->set_job_type(
5472 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5473
5474 // First request creates a ConnectJob.
5475 TestAuthHelper auth_helper1;
5476 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265477 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105478
5479 // A second request come in, but no new ConnectJob is needed, since the limit
5480 // has been reached.
5481 TestAuthHelper auth_helper2;
5482 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265483 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105484
5485 // Run until the auth callback for the first request is invoked.
5486 auth_helper1.WaitForAuth();
5487 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265488 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5489 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395490 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105491
5492 // Make connect jobs succeed, then cancel the first request, which should
5493 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5494 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5495 auth_helper1.handle()->Reset();
5496 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265497 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105498
5499 // The second ConnectJob should succeed.
5500 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5501 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265502 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105503}
5504
5505// Makes sure that when a bound request is destroyed, a new ConnectJob is
5506// created for another group, if needed.
5507TEST_F(ClientSocketPoolBaseTest,
5508 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5509 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5510 connect_job_factory_->set_job_type(
5511 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5512
5513 // First request creates a ConnectJob.
5514 TestAuthHelper auth_helper1;
5515 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265516 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105517
5518 // A second request come in, but no new ConnectJob is needed, since the limit
5519 // has been reached.
5520 TestAuthHelper auth_helper2;
5521 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395522 ClientSocketPool::RespectLimits::ENABLED,
5523 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265524 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5525 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105526
5527 // Run until the auth callback for the first request is invoked.
5528 auth_helper1.WaitForAuth();
5529 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265530 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5531 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395532 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265533 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5534 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395535 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105536
5537 // Make connect jobs succeed, then cancel the first request, which should
5538 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5539 // other group.
5540 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5541 auth_helper1.handle()->Reset();
5542 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265543 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5544 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105545
5546 // The second ConnectJob should succeed.
5547 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5548 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265549 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5550 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105551}
5552
5553// Test that once an auth challenge is bound, that's the request that gets all
5554// subsequent calls and the socket itself.
5555TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5556 CreatePool(1, 1);
5557 connect_job_factory_->set_job_type(
5558 TestConnectJob::kMockAuthChallengeTwiceJob);
5559
5560 // First request creates a ConnectJob.
5561 TestAuthHelper auth_helper1;
5562 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265563 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105564
5565 // A second, higher priority request is made.
5566 TestAuthHelper auth_helper2;
5567 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265568 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105569
5570 // Run until the auth callback for the second request is invoked.
5571 auth_helper2.WaitForAuth();
5572 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265573 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5574 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395575 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105576
5577 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5578 // ConnectJob.
5579 TestAuthHelper auth_helper3;
5580 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265581 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105582
5583 // Start a higher job that ignores limits, creating a hanging socket. It
5584 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5585 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5586 TestAuthHelper auth_helper4;
5587 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5588 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265589 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105590
5591 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5592 // again.
5593 auth_helper2.RestartWithAuth();
5594 auth_helper2.WaitForAuth();
5595 EXPECT_EQ(0, auth_helper1.auth_count());
5596 EXPECT_FALSE(auth_helper1.have_result());
5597 EXPECT_EQ(2, auth_helper2.auth_count());
5598 EXPECT_FALSE(auth_helper2.have_result());
5599 EXPECT_EQ(0, auth_helper3.auth_count());
5600 EXPECT_FALSE(auth_helper3.have_result());
5601 EXPECT_EQ(0, auth_helper4.auth_count());
5602 EXPECT_FALSE(auth_helper4.have_result());
5603
5604 // Advance auth again, and |auth_helper2| should get the socket.
5605 auth_helper2.RestartWithAuth();
5606 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5607 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5608 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265609 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5610 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105611 EXPECT_EQ(0, auth_helper1.auth_count());
5612 EXPECT_FALSE(auth_helper1.have_result());
5613 EXPECT_EQ(0, auth_helper3.auth_count());
5614 EXPECT_FALSE(auth_helper3.have_result());
5615 EXPECT_EQ(0, auth_helper4.auth_count());
5616 EXPECT_FALSE(auth_helper4.have_result());
5617
5618 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5619 // socket request should be able to claim it.
5620 auth_helper2.handle()->Reset();
5621 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5622 EXPECT_EQ(0, auth_helper1.auth_count());
5623 EXPECT_FALSE(auth_helper1.have_result());
5624 EXPECT_EQ(0, auth_helper3.auth_count());
5625 EXPECT_FALSE(auth_helper3.have_result());
5626 EXPECT_EQ(0, auth_helper4.auth_count());
5627}
5628
David Benjaminbac8dff2019-08-07 01:30:415629enum class RefreshType {
5630 kServer,
5631 kProxy,
5632};
5633
5634// Common base class to test RefreshGroup() when called from either
5635// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5636//
5637// Tests which test behavior specific to one or the other case should use
5638// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5639// when the pool's proxy matches.
5640class ClientSocketPoolBaseRefreshTest
5641 : public ClientSocketPoolBaseTest,
5642 public testing::WithParamInterface<RefreshType> {
5643 public:
5644 void CreatePoolForRefresh(int max_sockets,
5645 int max_sockets_per_group,
5646 bool enable_backup_connect_jobs = false) {
5647 switch (GetParam()) {
5648 case RefreshType::kServer:
5649 CreatePool(max_sockets, max_sockets_per_group,
5650 enable_backup_connect_jobs);
5651 break;
5652 case RefreshType::kProxy:
5653 CreatePoolWithIdleTimeouts(
5654 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5655 ClientSocketPool::used_idle_socket_timeout(),
5656 enable_backup_connect_jobs,
5657 ProxyServer::FromPacString("HTTPS myproxy:70"));
5658 break;
5659 }
5660 }
5661
5662 static ClientSocketPool::GroupId GetGroupId() {
Eric Ortha2e7773212021-06-22 21:49:555663 return TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415664 }
5665
David Benjamin6dd7e882019-10-10 02:35:235666 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5667 // Note this GroupId will match GetGroupId() unless
5668 // kPartitionConnectionsByNetworkIsolationKey is enabled.
Matt Menke4807a9a2020-11-21 00:14:415669 const SchemefulSite kSite(GURL("https://b/"));
5670 const NetworkIsolationKey kNetworkIsolationKey(kSite, kSite);
Eric Ortha2e7773212021-06-22 21:49:555671 return TestGroupId("a", 443, url::kHttpsScheme,
David Benjamin6dd7e882019-10-10 02:35:235672 PrivacyMode::PRIVACY_MODE_DISABLED,
5673 kNetworkIsolationKey);
5674 }
5675
David Benjaminbac8dff2019-08-07 01:30:415676 void OnSSLConfigForServerChanged() {
5677 switch (GetParam()) {
5678 case RefreshType::kServer:
5679 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5680 break;
5681 case RefreshType::kProxy:
5682 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5683 break;
5684 }
5685 }
5686};
5687
5688INSTANTIATE_TEST_SUITE_P(RefreshType,
5689 ClientSocketPoolBaseRefreshTest,
5690 ::testing::Values(RefreshType::kServer,
5691 RefreshType::kProxy));
5692
5693TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5694 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5695 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245696
5697 // First job will be waiting until it gets aborted.
5698 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5699
5700 ClientSocketHandle handle;
5701 TestCompletionCallback callback;
5702 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525703 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285704 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5705 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5706 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245707 IsError(ERR_IO_PENDING));
5708
5709 // Switch connect job types, so creating a new ConnectJob will result in
5710 // success.
5711 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5712
David Benjaminbac8dff2019-08-07 01:30:415713 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245714 EXPECT_EQ(OK, callback.WaitForResult());
5715 ASSERT_TRUE(handle.socket());
5716 EXPECT_EQ(0, pool_->IdleSocketCount());
5717 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5718 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5719 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5720 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5721}
5722
David Benjaminbac8dff2019-08-07 01:30:415723TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235724 base::test::ScopedFeatureList feature_list;
5725 feature_list.InitAndEnableFeature(
5726 features::kPartitionConnectionsByNetworkIsolationKey);
5727
David Benjaminbac8dff2019-08-07 01:30:415728 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5729 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235730 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245731
Anton Bikineev068d2912021-05-15 20:43:525732 pool_->RequestSockets(kGroupId, params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:285733 NetLogWithSource());
Anton Bikineev068d2912021-05-15 20:43:525734 pool_->RequestSockets(kGroupIdInPartition, params_, absl::nullopt, 2,
David Benjamin6dd7e882019-10-10 02:35:235735 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245736 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235737 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5738 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245739 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235740 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245741
David Benjaminbac8dff2019-08-07 01:30:415742 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245743 EXPECT_EQ(0, pool_->IdleSocketCount());
5744 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235745 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245746}
5747
5748TEST_F(ClientSocketPoolBaseTest,
5749 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5750 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415751 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555752 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415753 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555754 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245755
Anton Bikineev068d2912021-05-15 20:43:525756 pool_->RequestSockets(kOtherGroupId, params_, absl::nullopt, 2,
Matt Menkef09e64c2019-04-23 22:16:285757 NetLogWithSource());
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
David Benjaminbac8dff2019-08-07 01:30:415762 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245763 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5764 EXPECT_EQ(2, pool_->IdleSocketCount());
5765 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5766}
5767
David Benjaminbac8dff2019-08-07 01:30:415768TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5769 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5770 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245771
5772 ClientSocketHandle handle;
5773 TestCompletionCallback callback;
5774 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525775 handle.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285776 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5777 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5778 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245779 IsOk());
5780 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5781 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5782
David Benjaminbac8dff2019-08-07 01:30:415783 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245784
5785 handle.Reset();
5786 EXPECT_EQ(0, pool_->IdleSocketCount());
5787 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5788}
5789
5790TEST_F(ClientSocketPoolBaseTest,
5791 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5792 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415793 const ClientSocketPool::GroupId kGroupId =
Eric Ortha2e7773212021-06-22 21:49:555794 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415795 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555796 TestGroupId("b", 443, url::kHttpsScheme);
Matt Menkebf3c767d2019-04-15 23:28:245797
5798 ClientSocketHandle handle;
5799 TestCompletionCallback callback;
5800 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525801 handle.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
Matt Menkef09e64c2019-04-23 22:16:285802 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5803 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5804 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245805 IsOk());
5806 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5807 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5808
David Benjaminbac8dff2019-08-07 01:30:415809 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245810
5811 handle.Reset();
5812 EXPECT_EQ(1, pool_->IdleSocketCount());
5813 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5814 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5815}
5816
David Benjaminbac8dff2019-08-07 01:30:415817TEST_P(ClientSocketPoolBaseRefreshTest,
5818 RefreshGroupReplacesBoundConnectJobOnConnect) {
5819 CreatePoolForRefresh(1, 1);
5820 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245821 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5822
5823 TestAuthHelper auth_helper;
5824 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5825 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5826 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5827
5828 auth_helper.WaitForAuth();
5829
5830 // This should update the generation, but not cancel the old ConnectJob - it's
5831 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415832 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245833
5834 // Providing auth credentials and restarting the request with them will cause
5835 // the ConnectJob to complete successfully, but the result will be discarded
5836 // because of the generation mismatch.
5837 auth_helper.RestartWithAuth();
5838
5839 // Despite using ConnectJobs that simulate a single challenge, a second
5840 // challenge will be seen, due to using a new ConnectJob.
5841 auth_helper.WaitForAuth();
5842 auth_helper.RestartWithAuth();
5843
5844 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5845 EXPECT_TRUE(auth_helper.handle()->socket());
5846 EXPECT_EQ(2, auth_helper.auth_count());
5847
5848 // When released, the socket will be returned to the socket pool, and
5849 // available for reuse.
5850 auth_helper.handle()->Reset();
5851 EXPECT_EQ(1, pool_->IdleSocketCount());
5852 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5853 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5854}
5855
David Benjaminbac8dff2019-08-07 01:30:415856TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5857 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5858 kUnusedIdleSocketTimeout,
5859 ClientSocketPool::used_idle_socket_timeout(),
5860 false /* no backup connect jobs */,
5861 ProxyServer::FromPacString("HTTPS myproxy:70"));
5862
5863 const ClientSocketPool::GroupId kGroupId1 =
Eric Ortha2e7773212021-06-22 21:49:555864 TestGroupId("a", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415865 const ClientSocketPool::GroupId kGroupId2 =
Eric Ortha2e7773212021-06-22 21:49:555866 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415867 const ClientSocketPool::GroupId kGroupId3 =
Eric Ortha2e7773212021-06-22 21:49:555868 TestGroupId("c", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415869
5870 // Make three sockets in three different groups. The third socket is released
5871 // to the pool as idle.
5872 ClientSocketHandle handle1, handle2, handle3;
5873 TestCompletionCallback callback;
5874 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525875 handle1.Init(kGroupId1, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415876 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5877 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5878 pool_.get(), NetLogWithSource()),
5879 IsOk());
5880 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525881 handle2.Init(kGroupId2, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415882 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5883 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5884 pool_.get(), NetLogWithSource()),
5885 IsOk());
5886 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525887 handle3.Init(kGroupId3, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415888 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5889 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5890 pool_.get(), NetLogWithSource()),
5891 IsOk());
5892 handle3.Reset();
5893 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5894 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5895 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5896 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5897 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5898 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5899
5900 // Changes to some other proxy do not affect the pool. The idle socket remains
5901 // alive and closing |handle2| makes the socket available for the pool.
5902 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5903
5904 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5905 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5906 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5907 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5908 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5909 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5910
5911 handle2.Reset();
5912 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5913 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5914
5915 // Changes to the matching proxy refreshes all groups.
5916 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5917
5918 // Idle sockets are closed.
5919 EXPECT_EQ(0, pool_->IdleSocketCount());
5920 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
5921 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
5922
5923 // The active socket, however, continues to be active.
5924 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5925 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5926
5927 // Closing it does not make it available for the pool.
5928 handle1.Reset();
5929 EXPECT_EQ(0, pool_->IdleSocketCount());
5930 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
5931}
5932
5933TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
5934 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5935
Eric Ortha2e7773212021-06-22 21:49:555936 const ClientSocketPool::GroupId kGroupId = TestGroupId(
5937 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_DISABLED);
5938 const ClientSocketPool::GroupId kGroupIdPrivacy = TestGroupId(
5939 "a", 443, url::kHttpsScheme, PrivacyMode::PRIVACY_MODE_ENABLED);
David Benjaminbac8dff2019-08-07 01:30:415940 const ClientSocketPool::GroupId kOtherGroupId =
Eric Ortha2e7773212021-06-22 21:49:555941 TestGroupId("b", 443, url::kHttpsScheme);
David Benjaminbac8dff2019-08-07 01:30:415942
5943 // Make a socket in each groups.
5944 ClientSocketHandle handle1, handle2, handle3;
5945 TestCompletionCallback callback;
5946 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525947 handle1.Init(kGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415948 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5949 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5950 pool_.get(), NetLogWithSource()),
5951 IsOk());
5952 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525953 handle2.Init(kGroupIdPrivacy, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415954 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5955 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5956 pool_.get(), NetLogWithSource()),
5957 IsOk());
5958 EXPECT_THAT(
Anton Bikineev068d2912021-05-15 20:43:525959 handle3.Init(kOtherGroupId, params_, absl::nullopt, DEFAULT_PRIORITY,
David Benjaminbac8dff2019-08-07 01:30:415960 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5961 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5962 pool_.get(), NetLogWithSource()),
5963 IsOk());
5964 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5965 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5966 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5967 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5968 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5969 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5970
5971 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5972
5973 // Active sockets continue to be active.
5974 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5975 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5976 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5977 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5978 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5979 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5980
5981 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
5982 // are unusable.
5983 handle1.Reset();
5984 handle2.Reset();
5985 handle3.Reset();
5986 EXPECT_EQ(1, pool_->IdleSocketCount());
5987 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5988 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5989 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5990 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5991}
5992
[email protected]f6d1d6eb2009-06-24 20:16:095993} // namespace
5994
5995} // namespace net