blob: c0c35618d952c8fec49a765f7227c52bed1c43f2 [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"
skyostil4891b25b2015-06-11 11:43:4515#include "base/location.h"
[email protected]3b63f8f42011-03-28 01:54:1516#include "base/memory/ref_counted.h"
[email protected]6ea7b152011-12-21 21:21:1317#include "base/memory/weak_ptr.h"
Hans Wennborg0924470b2020-04-27 21:08:0518#include "base/notreached.h"
Matt Menkef09e64c2019-04-23 22:16:2819#include "base/optional.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"
Avi Drissman4365a4782018-12-28 19:26:2422#include "base/stl_util.h"
[email protected]fc9be5802013-06-11 10:56:5123#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1524#include "base/strings/stringprintf.h"
Matt Menke166443c2019-05-24 18:45:5925#include "base/test/scoped_feature_list.h"
[email protected]f214f8792011-01-01 02:17:0826#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3527#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0328#include "base/values.h"
Matt Menke166443c2019-05-24 18:45:5929#include "net/base/features.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"
[email protected]f6d1d6eb2009-06-24 20:16:0937#include "net/base/test_completion_callback.h"
dalykedd30d982019-12-16 15:31:1038#include "net/dns/public/resolve_error_info.h"
[email protected]277d5942010-08-11 21:02:3539#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5140#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0741#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0042#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1943#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0044#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5645#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4646#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0947#include "net/socket/client_socket_factory.h"
48#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2649#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2850#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5451#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1752#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4453#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1054#include "net/socket/stream_socket.h"
Matt Menke9fa17d52019-03-25 19:12:2655#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5156#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0157#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4058#include "net/test/test_with_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2859#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3860#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4861#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0962#include "testing/gtest/include/gtest/gtest.h"
63
robpercival214763f2016-07-01 23:27:0164using net::test::IsError;
65using net::test::IsOk;
66
[email protected]51fdc7c2012-04-10 19:19:4867using ::testing::Invoke;
68using ::testing::Return;
69
[email protected]f6d1d6eb2009-06-24 20:16:0970namespace net {
71
72namespace {
73
[email protected]211d21722009-07-22 15:48:5374const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2075const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5976constexpr base::TimeDelta kUnusedIdleSocketTimeout =
77 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0178
Matt Menkebdf777802019-04-22 19:38:5979ClientSocketPool::GroupId TestGroupId(
80 const std::string& host,
81 int port = 80,
82 ClientSocketPool::SocketType socket_type =
83 ClientSocketPool::SocketType::kHttp,
Matt Menke166443c2019-05-24 18:45:5984 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
85 NetworkIsolationKey network_isolation_key = NetworkIsolationKey()) {
dalyk5f48a132019-10-14 15:20:1986 bool disable_secure_dns = false;
Matt Menkec6b3edf72019-03-19 17:00:3987 return ClientSocketPool::GroupId(HostPortPair(host, port), socket_type,
dalyk5f48a132019-10-14 15:20:1988 privacy_mode, network_isolation_key,
89 disable_secure_dns);
Matt Menkec6b3edf72019-03-19 17:00:3990}
91
[email protected]034df0f32013-01-07 23:17:4892// Make sure |handle| sets load times correctly when it has been assigned a
93// reused socket.
94void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
95 LoadTimingInfo load_timing_info;
96 // Only pass true in as |is_reused|, as in general, HttpStream types should
97 // have stricter concepts of reuse than socket pools.
98 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
99
100 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19101 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48102
[email protected]b258e0792013-01-12 07:11:59103 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
104 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48105}
106
107// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33108// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48109// of a connection where |is_reused| is false may consider the connection
110// reused.
111void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
112 EXPECT_FALSE(handle.is_reused());
113
114 LoadTimingInfo load_timing_info;
115 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
116
117 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19118 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48119
[email protected]b258e0792013-01-12 07:11:59120 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
121 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
122 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48123
124 TestLoadTimingInfoConnectedReused(handle);
125}
126
127// Make sure |handle| sets load times correctly, in the case that it does not
128// currently have a socket.
129void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
130 // Should only be set to true once a socket is assigned, if at all.
131 EXPECT_FALSE(handle.is_reused());
132
133 LoadTimingInfo load_timing_info;
134 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
135
136 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19137 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48138
[email protected]b258e0792013-01-12 07:11:59139 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
140 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48141}
142
[email protected]3268023f2011-05-05 00:08:10143class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09144 public:
[email protected]034df0f32013-01-07 23:17:48145 explicit MockClientSocket(net::NetLog* net_log)
146 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28147 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20148 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30149 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09150
[email protected]0dc88b32014-03-26 20:12:28151 // Sets whether the socket has unread data. If true, the next call to Read()
152 // will return 1 byte and IsConnectedAndIdle() will return false.
153 void set_has_unread_data(bool has_unread_data) {
154 has_unread_data_ = has_unread_data;
155 }
156
[email protected]3f55aa12011-12-07 02:03:33157 // Socket implementation.
dchengb03027d2014-10-21 12:00:20158 int Read(IOBuffer* /* buf */,
159 int len,
Brad Lassey3a814172018-04-26 03:30:21160 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28161 if (has_unread_data_ && len > 0) {
162 has_unread_data_ = false;
163 was_used_to_convey_data_ = true;
164 return 1;
165 }
[email protected]e86df8dc2013-03-30 13:18:28166 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33167 }
[email protected]ab838892009-06-30 18:49:05168
[email protected]a2b2cfc2017-12-06 09:06:08169 int Write(
170 IOBuffer* /* buf */,
171 int len,
Brad Lassey3a814172018-04-26 03:30:21172 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08173 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01174 was_used_to_convey_data_ = true;
175 return len;
[email protected]ab838892009-06-30 18:49:05176 }
Avi Drissman13fc8932015-12-20 04:40:46177 int SetReceiveBufferSize(int32_t size) override { return OK; }
178 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05179
[email protected]dbf036f2011-12-06 23:33:24180 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21181 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24182 connected_ = true;
183 return OK;
184 }
[email protected]f6d1d6eb2009-06-24 20:16:09185
dchengb03027d2014-10-21 12:00:20186 void Disconnect() override { connected_ = false; }
187 bool IsConnected() const override { return connected_; }
188 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28189 return connected_ && !has_unread_data_;
190 }
[email protected]0b7648c2009-07-06 20:14:01191
dchengb03027d2014-10-21 12:00:20192 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16193 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09194 }
[email protected]f6d1d6eb2009-06-24 20:16:09195
dchengb03027d2014-10-21 12:00:20196 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35197 return ERR_UNEXPECTED;
198 }
199
tfarina428341112016-09-22 13:38:20200 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02201
dchengb03027d2014-10-21 12:00:20202 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37203 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20204 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
205 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03206 void GetConnectionAttempts(ConnectionAttempts* out) const override {
207 out->clear();
208 }
209 void ClearConnectionAttempts() override {}
210 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49211 int64_t GetTotalReceivedBytes() const override {
212 NOTIMPLEMENTED();
213 return 0;
214 }
Paul Jensen0f49dec2017-12-12 23:39:58215 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45216
[email protected]f6d1d6eb2009-06-24 20:16:09217 private:
218 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28219 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20220 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01221 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09222
[email protected]ab838892009-06-30 18:49:05223 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09224};
225
[email protected]5fc08e32009-07-15 17:09:57226class TestConnectJob;
227
[email protected]f6d1d6eb2009-06-24 20:16:09228class MockClientSocketFactory : public ClientSocketFactory {
229 public:
[email protected]ab838892009-06-30 18:49:05230 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09231
danakj655b66c2016-04-16 00:51:38232 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04233 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41234 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19235 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41236 NOTREACHED();
David Benjamin24725be2019-07-24 20:57:18237 return nullptr;
[email protected]98b0e582011-06-22 14:31:41238 }
239
Helen Lid5bb9222018-04-12 15:33:09240 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07241 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38242 std::unique_ptr<
243 SocketPerformanceWatcher> /* socket_performance_watcher */,
Eric Roman2bc77162020-09-16 18:30:45244 NetworkQualityEstimator* /* network_quality_estimator */,
[email protected]0a0b7682010-08-25 17:08:07245 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19246 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09247 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09248 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09249 }
250
danakj655b66c2016-04-16 00:51:38251 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
David Benjamin24725be2019-07-24 20:57:18252 SSLClientContext* context,
Matt Menke841fc412019-03-05 23:20:12253 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27254 const HostPortPair& host_and_port,
David Benjamin24725be2019-07-24 20:57:18255 const SSLConfig& ssl_config) override {
[email protected]f6d1d6eb2009-06-24 20:16:09256 NOTIMPLEMENTED();
David Benjamin24725be2019-07-24 20:57:18257 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09258 }
Matt Menkefd956922019-02-04 23:44:03259
Matt Menke52cd95a2019-02-08 06:16:27260 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
261 std::unique_ptr<StreamSocket> stream_socket,
262 const std::string& user_agent,
263 const HostPortPair& endpoint,
264 const ProxyServer& proxy_server,
265 HttpAuthController* http_auth_controller,
266 bool tunnel,
267 bool using_spdy,
268 NextProto negotiated_protocol,
269 ProxyDelegate* proxy_delegate,
Matt Menke52cd95a2019-02-08 06:16:27270 const NetworkTrafficAnnotationTag& traffic_annotation) override {
271 NOTIMPLEMENTED();
272 return nullptr;
273 }
274
[email protected]5fc08e32009-07-15 17:09:57275 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55276
[email protected]5fc08e32009-07-15 17:09:57277 void SignalJobs();
278
[email protected]03b7c8c2013-07-20 04:38:55279 void SignalJob(size_t job);
280
281 void SetJobLoadState(size_t job, LoadState load_state);
282
Matt Menke141b87f22019-01-30 02:43:03283 // Sets the HasConnectionEstablished value of the specified job to true,
284 // without invoking the callback.
285 void SetJobHasEstablishedConnection(size_t job);
286
[email protected]f6d1d6eb2009-06-24 20:16:09287 int allocation_count() const { return allocation_count_; }
288
[email protected]f6d1d6eb2009-06-24 20:16:09289 private:
290 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57291 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09292};
293
[email protected]ab838892009-06-30 18:49:05294class TestConnectJob : public ConnectJob {
295 public:
296 enum JobType {
297 kMockJob,
298 kMockFailingJob,
299 kMockPendingJob,
300 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57301 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10302
303 // Certificate errors return a socket in addition to an error code.
304 kMockCertErrorJob,
305 kMockPendingCertErrorJob,
306
[email protected]e60e47a2010-07-14 03:37:18307 kMockAdditionalErrorStateJob,
308 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28309 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10310
311 kMockAuthChallengeOnceJob,
312 kMockAuthChallengeTwiceJob,
313 kMockAuthChallengeOnceFailingJob,
314 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05315 };
316
[email protected]994d4932010-07-12 17:55:13317 // The kMockPendingJob uses a slight delay before allowing the connect
318 // to complete.
319 static const int kPendingConnectDelay = 2;
320
[email protected]ab838892009-06-30 18:49:05321 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40322 RequestPriority request_priority,
323 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34324 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43325 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05326 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43327 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40328 : ConnectJob(request_priority,
329 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38330 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43331 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38332 delegate,
333 nullptr /* net_log */,
334 NetLogSourceType::TRANSPORT_CONNECT_JOB,
335 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58336 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05337 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18338 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03339 has_established_connection_(false),
Jeremy Romand54000b22019-07-08 18:40:16340 store_additional_error_state_(false) {}
[email protected]ab838892009-06-30 18:49:05341
[email protected]974ebd62009-08-03 23:14:34342 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13343 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34344 }
345
[email protected]03b7c8c2013-07-20 04:38:55346 void set_load_state(LoadState load_state) { load_state_ = load_state; }
347
Matt Menke141b87f22019-01-30 02:43:03348 void set_has_established_connection() {
349 DCHECK(!has_established_connection_);
350 has_established_connection_ = true;
351 }
352
[email protected]03b7c8c2013-07-20 04:38:55353 // From ConnectJob:
354
dchengb03027d2014-10-21 12:00:20355 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21356
Matt Menke141b87f22019-01-30 02:43:03357 bool HasEstablishedConnection() const override {
358 return has_established_connection_;
359 }
360
dalykedd30d982019-12-16 15:31:10361 ResolveErrorInfo GetResolveErrorInfo() const override {
362 return ResolveErrorInfo(OK);
363 }
364
Matt Menke6f84d1f12019-04-11 19:26:47365 bool IsSSLError() const override { return store_additional_error_state_; }
366
367 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
368 if (store_additional_error_state_)
369 return base::MakeRefCounted<SSLCertRequestInfo>();
370 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18371 }
372
[email protected]974ebd62009-08-03 23:14:34373 private:
[email protected]03b7c8c2013-07-20 04:38:55374 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05375
dchengb03027d2014-10-21 12:00:20376 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05377 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35378 client_socket_factory_->CreateTransportClientSocket(
Eric Roman2bc77162020-09-16 18:30:45379 ignored, nullptr, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05380 switch (job_type_) {
381 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13382 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10383 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05384 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13385 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10386 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05387 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57388 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47389
390 // Depending on execution timings, posting a delayed task can result
391 // in the task getting executed the at the earliest possible
392 // opportunity or only after returning once from the message loop and
393 // then a second call into the message loop. In order to make behavior
394 // more deterministic, we change the default delay to 2ms. This should
395 // always require us to wait for the second call into the message loop.
396 //
397 // N.B. The correct fix for this and similar timing problems is to
398 // abstract time for the purpose of unittests. Unfortunately, we have
399 // a lot of third-party components that directly call the various
400 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45401 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05402 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49403 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
404 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10405 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53406 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05407 return ERR_IO_PENDING;
408 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57409 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45410 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05411 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49412 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
413 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10414 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53415 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05416 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57417 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55418 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57419 client_socket_factory_->WaitForSignal(this);
420 waiting_success_ = true;
421 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10422 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13423 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10424 true /* cert_error */);
425 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13426 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45427 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13428 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49429 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
430 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10431 true /* async */, true /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53432 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13433 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18434 case kMockAdditionalErrorStateJob:
435 store_additional_error_state_ = true;
436 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10437 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18438 case kMockPendingAdditionalErrorStateJob:
439 set_load_state(LOAD_STATE_CONNECTING);
440 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45441 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18442 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49443 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
444 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10445 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53446 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18447 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28448 case kMockUnreadDataJob: {
449 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10450 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28451 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
452 return ret;
453 }
Matt Menkeb57663b32019-03-01 17:17:10454 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01455 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10456 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
457 return ERR_IO_PENDING;
458 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01459 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10460 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
461 return ERR_IO_PENDING;
462 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01463 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10464 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
465 return ERR_IO_PENDING;
466 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01467 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10468 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
469 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05470 default:
471 NOTREACHED();
danakj655b66c2016-04-16 00:51:38472 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05473 return ERR_FAILED;
474 }
475 }
476
Lily Chen02ef29a2018-11-30 16:31:43477 void ChangePriorityInternal(RequestPriority priority) override {}
478
Matt Menkeb57663b32019-03-01 17:17:10479 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13480 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03481 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05482 if (succeed) {
Matt Menkeb57663b32019-03-01 17:17:10483 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
Bence Békybdbb0e72018-08-07 21:42:59484 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10485 } else if (cert_error) {
486 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
487 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40488 } else {
[email protected]e772db3f2010-07-12 18:11:13489 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38490 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05491 }
[email protected]2ab05b52009-07-01 23:57:58492
493 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30494 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05495 return result;
496 }
497
Matt Menkeb57663b32019-03-01 17:17:10498 void DoAdvanceAuthChallenge(int remaining_challenges,
499 bool succeed_after_last_challenge) {
500 base::ThreadTaskRunnerHandle::Get()->PostTask(
501 FROM_HERE,
502 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
503 weak_factory_.GetWeakPtr(), remaining_challenges,
504 succeed_after_last_challenge));
505 }
506
507 void InvokeNextProxyAuthCallback(int remaining_challenges,
508 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01509 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10510 if (remaining_challenges == 0) {
511 DoConnect(succeed_after_last_challenge, true /* was_async */,
512 false /* cert_error */);
513 return;
514 }
515
516 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
517 // The auth tests here are just focused on ConnectJob bookkeeping.
518 HttpResponseInfo info;
519 NotifyDelegateOfProxyAuth(
520 info, nullptr /* http_auth_controller */,
521 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
522 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
523 succeed_after_last_challenge));
524 }
525
[email protected]5fc08e32009-07-15 17:09:57526 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05527 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57528 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21529 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03530 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18531 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05532
Jeremy Romand54000b22019-07-08 18:40:16533 base::WeakPtrFactory<TestConnectJob> weak_factory_{this};
[email protected]d5492c52013-11-10 20:44:39534
[email protected]ab838892009-06-30 18:49:05535 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
536};
537
[email protected]d80a4322009-08-14 07:07:49538class TestConnectJobFactory
Matt Menke16f5c2e52019-03-25 21:50:40539 : public TransportClientSocketPool::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05540 public:
[email protected]034df0f32013-01-07 23:17:48541 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
542 NetLog* net_log)
Matt Menkea6f99ad2019-03-08 02:26:43543 : common_connect_job_params_(
544 nullptr /* client_socket_factory */,
545 nullptr /* host_resolver */,
Matt Menkeb88837e2019-03-20 11:50:40546 nullptr /* http_auth_cache */,
547 nullptr /* http_auth_handler_factory */,
548 nullptr /* spdy_session_pool */,
Matt Menkeb5fb42b2019-03-22 17:26:13549 nullptr /* quic_supported_versions */,
Matt Menkeb88837e2019-03-20 11:50:40550 nullptr /* quic_stream_factory */,
Matt Menkea6f99ad2019-03-08 02:26:43551 nullptr /* proxy_delegate */,
Matt Menked732ea42019-03-08 12:05:00552 nullptr /* http_user_agent_settings */,
David Benjamin24725be2019-07-24 20:57:18553 nullptr /* ssl_client_context */,
Matt Menkea6f99ad2019-03-08 02:26:43554 nullptr /* socket_performance_watcher_factory */,
555 nullptr /* network_quality_estimator */,
556 net_log,
557 nullptr /* websocket_endpoint_lock_manager */),
558 job_type_(TestConnectJob::kMockJob),
Raul Tambre94493c652019-03-11 17:18:35559 job_types_(nullptr),
Matt Menkea6f99ad2019-03-08 02:26:43560 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05561
Chris Watkins7a41d3552017-12-01 02:13:27562 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05563
564 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
565
[email protected]51fdc7c2012-04-10 19:19:48566 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
567 job_types_ = job_types;
568 CHECK(!job_types_->empty());
569 }
570
[email protected]974ebd62009-08-03 23:14:34571 void set_timeout_duration(base::TimeDelta timeout_duration) {
572 timeout_duration_ = timeout_duration;
573 }
574
[email protected]3f55aa12011-12-07 02:03:33575 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55576
danakj655b66c2016-04-16 00:51:38577 std::unique_ptr<ConnectJob> NewConnectJob(
Matt Menkeaafff542019-04-22 22:09:36578 ClientSocketPool::GroupId group_id,
579 scoped_refptr<ClientSocketPool::SocketParams> socket_params,
Matt Menkef09e64c2019-04-23 22:16:28580 const base::Optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Matt Menke16f5c2e52019-03-25 21:50:40581 RequestPriority request_priority,
582 SocketTag socket_tag,
mostynbba063d6032014-10-09 11:01:13583 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48584 EXPECT_TRUE(!job_types_ || !job_types_->empty());
585 TestConnectJob::JobType job_type = job_type_;
586 if (job_types_ && !job_types_->empty()) {
587 job_type = job_types_->front();
588 job_types_->pop_front();
589 }
Matt Menkea6f99ad2019-03-08 02:26:43590 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40591 job_type, request_priority, socket_tag, timeout_duration_,
592 &common_connect_job_params_, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05593 }
594
595 private:
Matt Menkea6f99ad2019-03-08 02:26:43596 const CommonConnectJobParams common_connect_job_params_;
[email protected]ab838892009-06-30 18:49:05597 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48598 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34599 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57600 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05601
602 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
603};
604
[email protected]a937a06d2009-08-19 21:19:24605} // namespace
606
[email protected]a937a06d2009-08-19 21:19:24607namespace {
608
[email protected]5fc08e32009-07-15 17:09:57609void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26610 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57611 (*it)->Signal();
612 }
613 waiting_jobs_.clear();
614}
615
[email protected]03b7c8c2013-07-20 04:38:55616void MockClientSocketFactory::SignalJob(size_t job) {
617 ASSERT_LT(job, waiting_jobs_.size());
618 waiting_jobs_[job]->Signal();
619 waiting_jobs_.erase(waiting_jobs_.begin() + job);
620}
621
622void MockClientSocketFactory::SetJobLoadState(size_t job,
623 LoadState load_state) {
624 ASSERT_LT(job, waiting_jobs_.size());
625 waiting_jobs_[job]->set_load_state(load_state);
626}
627
Matt Menke141b87f22019-01-30 02:43:03628void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
629 ASSERT_LT(job, waiting_jobs_.size());
630 waiting_jobs_[job]->set_has_established_connection();
631}
632
Gabriel Charette694c3c332019-08-19 14:53:05633class ClientSocketPoolBaseTest : public TestWithTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09634 protected:
Alex Clarke0def2092018-12-10 12:01:45635 ClientSocketPoolBaseTest()
Gabriel Charette694c3c332019-08-19 14:53:05636 : TestWithTaskEnvironment(
637 base::test::TaskEnvironment::TimeSource::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03638 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54639 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40640 TransportClientSocketPool::connect_backup_jobs_enabled();
641 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54642 }
[email protected]2431756e2010-09-29 20:26:13643
dcheng67be2b1f2014-10-27 21:47:29644 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40645 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54646 connect_backup_jobs_enabled_);
647 }
[email protected]c9d6a1d2009-07-14 16:15:20648
Matt Menke9fa17d52019-03-25 19:12:26649 void CreatePool(int max_sockets,
650 int max_sockets_per_group,
651 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59652 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
653 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26654 ClientSocketPool::used_idle_socket_timeout(),
655 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16656 }
657
David Benjaminbac8dff2019-08-07 01:30:41658 void CreatePoolWithIdleTimeouts(
659 int max_sockets,
660 int max_sockets_per_group,
661 base::TimeDelta unused_idle_socket_timeout,
662 base::TimeDelta used_idle_socket_timeout,
663 bool enable_backup_connect_jobs = false,
664 ProxyServer proxy_server = ProxyServer::Direct()) {
[email protected]c9d6a1d2009-07-14 16:15:20665 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26666 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
667 std::make_unique<TestConnectJobFactory>(&client_socket_factory_,
668 &net_log_);
669 connect_job_factory_ = connect_job_factory.get();
670 pool_ = TransportClientSocketPool::CreateForTesting(
671 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
David Benjaminbac8dff2019-08-07 01:30:41672 used_idle_socket_timeout, proxy_server, std::move(connect_job_factory),
Matt Menke9fa17d52019-03-25 19:12:26673 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20674 }
[email protected]f6d1d6eb2009-06-24 20:16:09675
mmenked3641e12016-01-28 16:06:15676 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39677 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33678 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15679 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39680 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15681 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33682 }
683
Matt Menkec6b3edf72019-03-19 17:00:39684 int StartRequest(const ClientSocketPool::GroupId& group_id,
685 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15686 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39687 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09688 }
689
[email protected]2431756e2010-09-29 20:26:13690 int GetOrderOfRequest(size_t index) const {
691 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09692 }
693
[email protected]2431756e2010-09-29 20:26:13694 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
695 return test_base_.ReleaseOneConnection(keep_alive);
696 }
697
698 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
699 test_base_.ReleaseAllConnections(keep_alive);
700 }
701
Matt Menke433de6d2020-03-04 00:24:11702 // Expects a single NetLogEventType::SOCKET_POOL_CLOSING_SOCKET in |net_log_|.
703 // It should be logged for the provided source and have the indicated reason.
704 void ExpectSocketClosedWithReason(NetLogSource expected_source,
705 const char* expected_reason) {
706 auto entries = net_log_.GetEntriesForSourceWithType(
707 expected_source, NetLogEventType::SOCKET_POOL_CLOSING_SOCKET,
708 NetLogEventPhase::NONE);
709 ASSERT_EQ(1u, entries.size());
710 ASSERT_TRUE(entries[0].HasParams());
711 ASSERT_TRUE(entries[0].params.is_dict());
712 const std::string* reason = entries[0].params.FindStringKey("reason");
713 ASSERT_TRUE(reason);
714 EXPECT_EQ(expected_reason, *reason);
715 }
716
[email protected]2431756e2010-09-29 20:26:13717 TestSocketRequest* request(int i) { return test_base_.request(i); }
718 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38719 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42720 return test_base_.requests();
721 }
rdsmith29dbad12017-02-17 02:22:18722 // Only counts the requests that get sockets asynchronously;
723 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13724 size_t completion_count() const { return test_base_.completion_count(); }
725
Matt Muellerd9342e3a2019-11-26 01:41:14726 RecordingTestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54727 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09728 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04729 TestConnectJobFactory* connect_job_factory_;
Matt Menke9fa17d52019-03-25 19:12:26730 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19731 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26732 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13733 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09734};
735
[email protected]5fc08e32009-07-15 17:09:57736TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53737 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20738
[email protected]6ecf2b92011-12-15 01:14:52739 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06740 ClientSocketHandle handle;
Matt Muellerd9342e3a2019-11-26 01:41:14741 RecordingBoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48742 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53743
Matt Menkef09e64c2019-04-23 22:16:28744 EXPECT_EQ(OK, handle.Init(
745 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
746 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
747 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
748 pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09749 EXPECT_TRUE(handle.is_initialized());
750 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48751 TestLoadTimingInfoConnectedNotReused(handle);
752
[email protected]f6d1d6eb2009-06-24 20:16:09753 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48754 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30755
Eric Roman79cc7552019-07-19 02:17:54756 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40757
Matt Menke9fa17d52019-03-25 19:12:26758 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53759 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26760 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00761 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26762 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
763 EXPECT_TRUE(LogContainsEvent(
764 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
765 NetLogEventPhase::NONE));
766 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00767 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
768 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26769 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09770}
771
[email protected]ab838892009-06-30 18:49:05772TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53773 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20774
[email protected]ab838892009-06-30 18:49:05775 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Muellerd9342e3a2019-11-26 01:41:14776 RecordingBoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53777
[email protected]2431756e2010-09-29 20:26:13778 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52779 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18780 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13781 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51782 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50783 EXPECT_EQ(
784 ERR_CONNECTION_FAILED,
Matt Menkef09e64c2019-04-23 22:16:28785 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
786 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
787 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
788 pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13789 EXPECT_FALSE(handle.socket());
790 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51791 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48792 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30793
Eric Roman79cc7552019-07-19 02:17:54794 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40795
Matt Menke9fa17d52019-03-25 19:12:26796 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17797 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26798 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00799 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26800 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
801 EXPECT_TRUE(LogContainsEvent(
802 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
803 NetLogEventPhase::NONE));
804 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09805}
806
Matt Menke433de6d2020-03-04 00:24:11807// Test releasing an open socket into the socket pool, telling the socket pool
808// to close the socket.
809TEST_F(ClientSocketPoolBaseTest, ReleaseAndCloseConnection) {
810 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
811
812 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
813 ASSERT_TRUE(request(0)->handle()->socket());
814 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
815 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
816
817 EXPECT_EQ(0, pool_->IdleSocketCount());
818 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
819
820 ExpectSocketClosedWithReason(
821 source, TransportClientSocketPool::kClosedConnectionReturnedToPool);
822}
823
824TEST_F(ClientSocketPoolBaseTest, SocketWithUnreadDataReturnedToPool) {
825 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
826 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
827
828 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
829 ASSERT_TRUE(request(0)->handle()->socket());
830 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
831 EXPECT_TRUE(request(0)->handle()->socket()->IsConnected());
832 EXPECT_FALSE(request(0)->handle()->socket()->IsConnectedAndIdle());
833 ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE);
834
835 EXPECT_EQ(0, pool_->IdleSocketCount());
836 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
837
838 ExpectSocketClosedWithReason(
839 source, TransportClientSocketPool::kDataReceivedUnexpectedly);
840}
841
Matt Menkef6edce752019-03-19 17:21:56842// Make sure different groups do not share sockets.
843TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59844 base::test::ScopedFeatureList feature_list;
845 feature_list.InitAndEnableFeature(
846 features::kPartitionConnectionsByNetworkIsolationKey);
847
Matt Menkef6edce752019-03-19 17:21:56848 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
849
850 const HostPortPair kHostPortPairs[] = {
851 {"a", 80},
852 {"a", 443},
853 {"b", 80},
854 };
855
856 const ClientSocketPool::SocketType kSocketTypes[] = {
857 ClientSocketPool::SocketType::kHttp,
858 ClientSocketPool::SocketType::kSsl,
Matt Menkef6edce752019-03-19 17:21:56859 };
860
Matt Menkebdf777802019-04-22 19:38:59861 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
862 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56863
Shivani Sharma8ae506c2019-07-21 21:08:27864 const auto kOriginA = url::Origin::Create(GURL("http://a.test/"));
865 const auto kOriginB = url::Origin::Create(GURL("http://b.test/"));
Matt Menke166443c2019-05-24 18:45:59866 const NetworkIsolationKey kNetworkIsolationKeys[] = {
Shivani Sharma8ae506c2019-07-21 21:08:27867 NetworkIsolationKey(kOriginA, kOriginA),
868 NetworkIsolationKey(kOriginB, kOriginB),
Matt Menke166443c2019-05-24 18:45:59869 };
870
dalyk5f48a132019-10-14 15:20:19871 const bool kDisableSecureDnsValues[] = {false, true};
872
Matt Menkef6edce752019-03-19 17:21:56873 int total_idle_sockets = 0;
874
875 // Walk through each GroupId, making sure that requesting a socket for one
876 // group does not return a previously connected socket for another group.
877 for (const auto& host_port_pair : kHostPortPairs) {
878 SCOPED_TRACE(host_port_pair.ToString());
879 for (const auto& socket_type : kSocketTypes) {
880 SCOPED_TRACE(static_cast<int>(socket_type));
881 for (const auto& privacy_mode : kPrivacyModes) {
882 SCOPED_TRACE(privacy_mode);
Matt Menke166443c2019-05-24 18:45:59883 for (const auto& network_isolation_key : kNetworkIsolationKeys) {
884 SCOPED_TRACE(network_isolation_key.ToString());
dalyk5f48a132019-10-14 15:20:19885 for (const auto& disable_secure_dns : kDisableSecureDnsValues) {
886 SCOPED_TRACE(disable_secure_dns);
Matt Menkef6edce752019-03-19 17:21:56887
dalyk5f48a132019-10-14 15:20:19888 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56889
dalyk5f48a132019-10-14 15:20:19890 ClientSocketPool::GroupId group_id(
891 host_port_pair, socket_type, privacy_mode,
892 network_isolation_key, disable_secure_dns);
Matt Menkef6edce752019-03-19 17:21:56893
dalyk5f48a132019-10-14 15:20:19894 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56895
dalyk5f48a132019-10-14 15:20:19896 TestCompletionCallback callback;
897 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56898
dalyk5f48a132019-10-14 15:20:19899 // Since the group is empty, requesting a socket should not complete
900 // synchronously.
901 EXPECT_THAT(handle.Init(group_id, params_, base::nullopt,
902 DEFAULT_PRIORITY, SocketTag(),
903 ClientSocketPool::RespectLimits::ENABLED,
904 callback.callback(),
905 ClientSocketPool::ProxyAuthCallback(),
906 pool_.get(), NetLogWithSource()),
907 IsError(ERR_IO_PENDING));
908 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
909 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56910
dalyk5f48a132019-10-14 15:20:19911 EXPECT_THAT(callback.WaitForResult(), IsOk());
912 EXPECT_TRUE(handle.socket());
913 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
914 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56915
dalyk5f48a132019-10-14 15:20:19916 // Return socket to pool.
917 handle.Reset();
918 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56919
dalyk5f48a132019-10-14 15:20:19920 // Requesting a socket again should return the same socket as
921 // before, so should complete synchronously.
922 EXPECT_THAT(handle.Init(group_id, params_, base::nullopt,
923 DEFAULT_PRIORITY, SocketTag(),
924 ClientSocketPool::RespectLimits::ENABLED,
925 callback.callback(),
926 ClientSocketPool::ProxyAuthCallback(),
927 pool_.get(), NetLogWithSource()),
928 IsOk());
929 EXPECT_TRUE(handle.socket());
930 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56931
dalyk5f48a132019-10-14 15:20:19932 // Return socket to pool again.
933 handle.Reset();
934 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56935
dalyk5f48a132019-10-14 15:20:19936 ++total_idle_sockets;
937 }
Matt Menke166443c2019-05-24 18:45:59938 }
Matt Menkef6edce752019-03-19 17:21:56939 }
940 }
941 }
942}
943
[email protected]211d21722009-07-22 15:48:53944TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
945 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
946
[email protected]9e743cd2010-03-16 07:03:53947 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30948
Matt Menkec6b3edf72019-03-19 17:00:39949 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
950 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
951 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
952 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53953
[email protected]2431756e2010-09-29 20:26:13954 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53955 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13956 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53957
Matt Menkec6b3edf72019-03-19 17:00:39958 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
959 IsError(ERR_IO_PENDING));
960 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
961 IsError(ERR_IO_PENDING));
962 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
963 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53964
[email protected]2431756e2010-09-29 20:26:13965 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53966
[email protected]2431756e2010-09-29 20:26:13967 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53968 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13969 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53970
971 EXPECT_EQ(1, GetOrderOfRequest(1));
972 EXPECT_EQ(2, GetOrderOfRequest(2));
973 EXPECT_EQ(3, GetOrderOfRequest(3));
974 EXPECT_EQ(4, GetOrderOfRequest(4));
975 EXPECT_EQ(5, GetOrderOfRequest(5));
976 EXPECT_EQ(6, GetOrderOfRequest(6));
977 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17978
979 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13980 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53981}
982
983TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
984 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
985
[email protected]9e743cd2010-03-16 07:03:53986 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30987
[email protected]211d21722009-07-22 15:48:53988 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39989 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
990 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
991 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
992 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53993
[email protected]2431756e2010-09-29 20:26:13994 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53995 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13996 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53997
998 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:39999 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1000 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531001
[email protected]2431756e2010-09-29 20:26:131002 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531003
[email protected]2431756e2010-09-29 20:26:131004 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531005 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131006 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531007
1008 EXPECT_EQ(1, GetOrderOfRequest(1));
1009 EXPECT_EQ(2, GetOrderOfRequest(2));
1010 EXPECT_EQ(3, GetOrderOfRequest(3));
1011 EXPECT_EQ(4, GetOrderOfRequest(4));
1012 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:171013
1014 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131015 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531016}
1017
1018TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
1019 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1020
Matt Menkec6b3edf72019-03-19 17:00:391021 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
1022 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
1023 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1024 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:531025
[email protected]2431756e2010-09-29 20:26:131026 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531027 client_socket_factory_.allocation_count());
1028
Matt Menkec6b3edf72019-03-19 17:00:391029 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
1030 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1031 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531032
[email protected]2431756e2010-09-29 20:26:131033 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531034
[email protected]2431756e2010-09-29 20:26:131035 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531036
1037 // First 4 requests don't have to wait, and finish in order.
1038 EXPECT_EQ(1, GetOrderOfRequest(1));
1039 EXPECT_EQ(2, GetOrderOfRequest(2));
1040 EXPECT_EQ(3, GetOrderOfRequest(3));
1041 EXPECT_EQ(4, GetOrderOfRequest(4));
1042
Matt Menkec6b3edf72019-03-19 17:00:391043 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1044 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531045 EXPECT_EQ(7, GetOrderOfRequest(5));
1046 EXPECT_EQ(6, GetOrderOfRequest(6));
1047 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171048
1049 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131050 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531051}
1052
rdsmith29dbad12017-02-17 02:22:181053// Test reprioritizing a request before completion doesn't interfere with
1054// its completion.
1055TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1056 CreatePool(kDefaultMaxSockets, 1);
1057
Matt Menkec6b3edf72019-03-19 17:00:391058 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1059 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181060 EXPECT_TRUE(request(0)->handle()->socket());
1061 EXPECT_FALSE(request(1)->handle()->socket());
1062
Lily Chenecebf932018-11-02 17:15:431063 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181064
1065 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1066
1067 EXPECT_TRUE(request(1)->handle()->socket());
1068}
1069
1070// Reprioritize a request up past another one and make sure that changes the
1071// completion order.
1072TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1073 CreatePool(kDefaultMaxSockets, 1);
1074
Matt Menkec6b3edf72019-03-19 17:00:391075 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1076 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1077 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181078 EXPECT_TRUE(request(0)->handle()->socket());
1079 EXPECT_FALSE(request(1)->handle()->socket());
1080 EXPECT_FALSE(request(2)->handle()->socket());
1081
1082 request(2)->handle()->SetPriority(HIGHEST);
1083
1084 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1085
1086 EXPECT_EQ(1, GetOrderOfRequest(1));
1087 EXPECT_EQ(3, GetOrderOfRequest(2));
1088 EXPECT_EQ(2, GetOrderOfRequest(3));
1089}
1090
1091// Reprioritize a request without changing relative priorities and check
1092// that the order doesn't change.
1093TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1094 CreatePool(kDefaultMaxSockets, 1);
1095
Matt Menkec6b3edf72019-03-19 17:00:391096 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1097 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1098 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181099 EXPECT_TRUE(request(0)->handle()->socket());
1100 EXPECT_FALSE(request(1)->handle()->socket());
1101 EXPECT_FALSE(request(2)->handle()->socket());
1102
1103 request(2)->handle()->SetPriority(MEDIUM);
1104
1105 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1106
1107 EXPECT_EQ(1, GetOrderOfRequest(1));
1108 EXPECT_EQ(2, GetOrderOfRequest(2));
1109 EXPECT_EQ(3, GetOrderOfRequest(3));
1110}
1111
1112// Reprioritize a request past down another one and make sure that changes the
1113// completion order.
1114TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1115 CreatePool(kDefaultMaxSockets, 1);
1116
Matt Menkec6b3edf72019-03-19 17:00:391117 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1118 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1119 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181120 EXPECT_TRUE(request(0)->handle()->socket());
1121 EXPECT_FALSE(request(1)->handle()->socket());
1122 EXPECT_FALSE(request(2)->handle()->socket());
1123
1124 request(1)->handle()->SetPriority(LOW);
1125
1126 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1127
1128 EXPECT_EQ(1, GetOrderOfRequest(1));
1129 EXPECT_EQ(3, GetOrderOfRequest(2));
1130 EXPECT_EQ(2, GetOrderOfRequest(3));
1131}
1132
1133// Reprioritize a request to the same level as another and confirm it is
1134// put after the old request.
1135TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1136 CreatePool(kDefaultMaxSockets, 1);
1137
Matt Menkec6b3edf72019-03-19 17:00:391138 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1139 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1140 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181141 EXPECT_TRUE(request(0)->handle()->socket());
1142 EXPECT_FALSE(request(1)->handle()->socket());
1143 EXPECT_FALSE(request(2)->handle()->socket());
1144
1145 request(1)->handle()->SetPriority(MEDIUM);
1146
1147 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1148
1149 EXPECT_EQ(1, GetOrderOfRequest(1));
1150 EXPECT_EQ(3, GetOrderOfRequest(2));
1151 EXPECT_EQ(2, GetOrderOfRequest(3));
1152}
1153
[email protected]211d21722009-07-22 15:48:531154TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1155 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1156
Matt Menkec6b3edf72019-03-19 17:00:391157 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1158 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1159 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1160 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531161
[email protected]2431756e2010-09-29 20:26:131162 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531163 client_socket_factory_.allocation_count());
1164
Matt Menkec6b3edf72019-03-19 17:00:391165 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1166 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1167 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531168
[email protected]2431756e2010-09-29 20:26:131169 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531170
[email protected]2431756e2010-09-29 20:26:131171 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531172 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131173 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531174
1175 // First 4 requests don't have to wait, and finish in order.
1176 EXPECT_EQ(1, GetOrderOfRequest(1));
1177 EXPECT_EQ(2, GetOrderOfRequest(2));
1178 EXPECT_EQ(3, GetOrderOfRequest(3));
1179 EXPECT_EQ(4, GetOrderOfRequest(4));
1180
1181 // Request ("b", 7) has the highest priority, but we can't make new socket for
1182 // group "b", because it has reached the per-group limit. Then we make
1183 // socket for ("c", 6), because it has higher priority than ("a", 4),
1184 // and we still can't make a socket for group "b".
1185 EXPECT_EQ(5, GetOrderOfRequest(5));
1186 EXPECT_EQ(6, GetOrderOfRequest(6));
1187 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171188
1189 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131190 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531191}
1192
1193// Make sure that we count connecting sockets against the total limit.
1194TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1195 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1196
Matt Menkec6b3edf72019-03-19 17:00:391197 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1198 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1199 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531200
1201 // Create one asynchronous request.
1202 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391203 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1204 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531205
[email protected]6b175382009-10-13 06:47:471206 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1207 // actually become pending until 2ms after they have been created. In order
1208 // to flush all tasks, we need to wait so that we know there are no
1209 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451210 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471211
[email protected]211d21722009-07-22 15:48:531212 // The next synchronous request should wait for its turn.
1213 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391214 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1215 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531216
[email protected]2431756e2010-09-29 20:26:131217 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531218
[email protected]2431756e2010-09-29 20:26:131219 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531220 client_socket_factory_.allocation_count());
1221
1222 EXPECT_EQ(1, GetOrderOfRequest(1));
1223 EXPECT_EQ(2, GetOrderOfRequest(2));
1224 EXPECT_EQ(3, GetOrderOfRequest(3));
1225 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171226 EXPECT_EQ(5, GetOrderOfRequest(5));
1227
1228 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131229 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531230}
1231
[email protected]6427fe22010-04-16 22:27:411232TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1233 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1234 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1235
Matt Menkec6b3edf72019-03-19 17:00:391236 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1237 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1238 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1239 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411240
1241 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1242
1243 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1244
Matt Menkec6b3edf72019-03-19 17:00:391245 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1246 IsError(ERR_IO_PENDING));
1247 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1248 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411249
1250 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1251
[email protected]2431756e2010-09-29 20:26:131252 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411253 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131254 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411255 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131256 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1257 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411258 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1259}
1260
[email protected]d7027bb2010-05-10 18:58:541261TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1262 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1263 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1264
1265 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521266 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501267 EXPECT_EQ(
1268 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281269 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1270 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1271 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1272 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541273
1274 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241275 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521276 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501277 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391278 handles[i].Init(
Matt Menkef09e64c2019-04-23 22:16:281279 TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
1280 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1281 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1282 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541283 }
1284
1285 // One will be stalled, cancel all the handles now.
1286 // This should hit the OnAvailableSocketSlot() code where we previously had
1287 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241288 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541289 handles[i].Reset();
1290}
1291
[email protected]eb5a99382010-07-11 03:18:261292TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541293 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1294 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1295
[email protected]eb5a99382010-07-11 03:18:261296 {
1297 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521298 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261299 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkef09e64c2019-04-23 22:16:281300 EXPECT_EQ(OK,
1301 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
1302 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
1303 ClientSocketPool::RespectLimits::ENABLED,
1304 callbacks[i].callback(),
1305 ClientSocketPool::ProxyAuthCallback(),
1306 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261307 }
1308
1309 // Force a stalled group.
1310 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521311 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201312 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391313 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281314 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1315 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1316 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1317 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261318
1319 // Cancel the stalled request.
1320 stalled_handle.Reset();
1321
1322 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1323 EXPECT_EQ(0, pool_->IdleSocketCount());
1324
1325 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541326 }
1327
[email protected]43a21b82010-06-10 21:30:541328 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1329 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261330}
[email protected]43a21b82010-06-10 21:30:541331
[email protected]eb5a99382010-07-11 03:18:261332TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1333 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1334 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1335
1336 {
1337 ClientSocketHandle handles[kDefaultMaxSockets];
1338 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521339 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201340 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391341 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
Matt Menkef09e64c2019-04-23 22:16:281342 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkec6b3edf72019-03-19 17:00:391343 ClientSocketPool::RespectLimits::ENABLED,
1344 callback.callback(),
1345 ClientSocketPool::ProxyAuthCallback(),
1346 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261347 }
1348
1349 // Force a stalled group.
1350 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1351 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521352 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201353 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391354 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281355 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1356 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1357 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1358 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261359
1360 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261361 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1362 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1363 TestGroupId("foo")));
1364 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1365 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261366
1367 // Cancel the stalled request.
1368 handles[0].Reset();
1369
[email protected]eb5a99382010-07-11 03:18:261370 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261371 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1372 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1373 TestGroupId("foo")));
1374 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1375 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261376
1377 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011378 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261379
1380 EXPECT_EQ(kDefaultMaxSockets + 1,
1381 client_socket_factory_.allocation_count());
1382 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261383 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1384 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1385 TestGroupId("foo")));
1386 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1387 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261388
1389 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541390 }
1391
[email protected]eb5a99382010-07-11 03:18:261392 EXPECT_EQ(1, pool_->IdleSocketCount());
1393}
[email protected]43a21b82010-06-10 21:30:541394
[email protected]eb5a99382010-07-11 03:18:261395TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1396 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1397 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541398
[email protected]eb5a99382010-07-11 03:18:261399 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521400 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261401 {
[email protected]51fdc7c2012-04-10 19:19:481402 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261403 ClientSocketHandle handles[kDefaultMaxSockets];
1404 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521405 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391406 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281407 OK, handles[i].Init(
1408 TestGroupId(base::StringPrintf("Take 2: %d", i)), params_,
1409 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
1410 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1411 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1412 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261413 }
1414
1415 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1416 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481417 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261418
1419 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201420 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391421 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281422 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1423 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1424 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1425 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481426 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261427
1428 // Dropping out of scope will close all handles and return them to idle.
1429 }
[email protected]43a21b82010-06-10 21:30:541430
1431 // But if we wait for it, the released idle sockets will be closed in
1432 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011433 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261434
1435 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1436 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541437}
1438
1439// Regression test for http://crbug.com/40952.
1440TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261441 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1442 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541443 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1444
1445 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1446 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521447 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391448 EXPECT_EQ(OK, handle.Init(TestGroupId(base::NumberToString(i)), params_,
Matt Menkef09e64c2019-04-23 22:16:281449 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkec6b3edf72019-03-19 17:00:391450 ClientSocketPool::RespectLimits::ENABLED,
1451 callback.callback(),
1452 ClientSocketPool::ProxyAuthCallback(),
1453 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541454 }
1455
1456 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281457 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541458
1459 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1460 // reuse a socket.
1461 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1462 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521463 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541464
1465 // "0" is special here, since it should be the first entry in the sorted map,
1466 // which is the one which we would close an idle socket for. We shouldn't
1467 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391468 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281469 TestGroupId("0"), params_, base::nullopt, DEFAULT_PRIORITY,
1470 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391471 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1472 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541473
1474 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1475 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1476}
1477
[email protected]ab838892009-06-30 18:49:051478TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531479 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091480
Matt Menkec6b3edf72019-03-19 17:00:391481 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1482 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1483 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1484 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1485 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1486 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1487 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1488 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091489
[email protected]2431756e2010-09-29 20:26:131490 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201491 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1492 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131493 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1494 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091495
[email protected]c9d6a1d2009-07-14 16:15:201496 EXPECT_EQ(1, GetOrderOfRequest(1));
1497 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031498 EXPECT_EQ(8, GetOrderOfRequest(3));
1499 EXPECT_EQ(6, GetOrderOfRequest(4));
1500 EXPECT_EQ(4, GetOrderOfRequest(5));
1501 EXPECT_EQ(3, GetOrderOfRequest(6));
1502 EXPECT_EQ(5, GetOrderOfRequest(7));
1503 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171504
1505 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131506 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091507}
1508
[email protected]ab838892009-06-30 18:49:051509TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531510 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091511
Matt Menkec6b3edf72019-03-19 17:00:391512 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1513 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1514 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1515 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1516 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1517 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1518 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091519
[email protected]2431756e2010-09-29 20:26:131520 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091521
[email protected]2431756e2010-09-29 20:26:131522 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011523 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201524
[email protected]2431756e2010-09-29 20:26:131525 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201526 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131527 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1528 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091529}
1530
Matt Menke7eb405e2019-04-25 20:48:211531TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1532 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1533
1534 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1535 ClientSocketHandle handle;
1536 TestCompletionCallback callback;
1537 EXPECT_EQ(
1538 ERR_IO_PENDING,
1539 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1540 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1541 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1542 pool_.get(), NetLogWithSource()));
1543
1544 EXPECT_THAT(callback.WaitForResult(), IsOk());
1545 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1546 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1547 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1548 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1549
1550 handle.ResetAndCloseSocket();
1551 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1552}
1553
Matt Menke99251ea42019-04-25 22:59:021554// This test will start up a socket request and then call Reset() on the handle.
1555// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211556TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531557 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201558
[email protected]ab838892009-06-30 18:49:051559 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131560 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521561 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501562 EXPECT_EQ(
1563 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281564 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1565 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1566 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1567 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131568 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211569 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1570 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1571}
1572
Matt Menke99251ea42019-04-25 22:59:021573// This test will start up a socket request and then call ResetAndCloseSocket()
1574// on the handle. The pending ConnectJob or connected socket should be
1575// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211576TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1577 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1578
Matt Menke99251ea42019-04-25 22:59:021579 // When true, the socket connects before it's canceled.
1580 for (bool cancel_when_callback_pending : {false, true}) {
1581 if (cancel_when_callback_pending) {
1582 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1583 } else {
1584 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1585 }
1586 ClientSocketHandle handle;
1587 TestCompletionCallback callback;
1588 EXPECT_EQ(
1589 ERR_IO_PENDING,
1590 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1591 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1592 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1593 pool_.get(), NetLogWithSource()));
1594 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1595 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1596
1597 if (cancel_when_callback_pending) {
1598 client_socket_factory_.SignalJobs();
1599 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1600 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1601 }
1602
1603 handle.ResetAndCloseSocket();
1604 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1605 }
Matt Menke7eb405e2019-04-25 20:48:211606}
1607
1608TEST_F(ClientSocketPoolBaseTest,
1609 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1610 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1611
Matt Menke99251ea42019-04-25 22:59:021612 // When true, the sockets connect before they're canceled.
1613 for (bool cancel_when_callback_pending : {false, true}) {
1614 if (cancel_when_callback_pending) {
1615 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1616 } else {
1617 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1618 }
Matt Menke7eb405e2019-04-25 20:48:211619
Matt Menke99251ea42019-04-25 22:59:021620 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1621 TestCompletionCallback callback;
1622 // Make |kDefaultMaxSockets + 1| socket requests.
1623 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1624 std::unique_ptr<ClientSocketHandle> handle =
1625 std::make_unique<ClientSocketHandle>();
1626 EXPECT_EQ(ERR_IO_PENDING,
1627 handle->Init(
1628 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1629 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1630 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1631 pool_.get(), NetLogWithSource()));
1632 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211633 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021634 EXPECT_EQ(
1635 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1636 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1637 }
1638
1639 if (cancel_when_callback_pending) {
1640 client_socket_factory_.SignalJobs();
1641 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1642 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1643 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1644 }
1645
1646 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1647 // or close a socket, since there are more requests than ConnectJobs or
1648 // sockets.
1649 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1650 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1651 if (cancel_when_callback_pending) {
1652 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1653 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1654 } else {
1655 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211656 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1657 }
Matt Menke99251ea42019-04-25 22:59:021658
1659 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1660 // or close a socket.
1661 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1662 handles[i]->ResetAndCloseSocket();
1663 if (i > 0) {
1664 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1665 if (cancel_when_callback_pending) {
1666 EXPECT_EQ(i,
1667 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1668 } else {
1669 EXPECT_EQ(static_cast<size_t>(i),
1670 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1671 }
1672 } else {
1673 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1674 }
1675 }
Matt Menke7eb405e2019-04-25 20:48:211676 }
[email protected]f6d1d6eb2009-06-24 20:16:091677}
1678
[email protected]ab838892009-06-30 18:49:051679TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531680 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201681
[email protected]ab838892009-06-30 18:49:051682 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061683 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521684 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091685
Matt Menke28ac03e2019-02-25 22:25:501686 EXPECT_EQ(
1687 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281688 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1689 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1690 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1691 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091692
1693 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211694 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1695 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091696
Matt Menke7eb405e2019-04-25 20:48:211697 // This will create a second ConnectJob, since the other ConnectJob was
1698 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521699 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501700 EXPECT_EQ(
1701 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281702 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1703 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501704 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1705 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091706
Matt Menke7eb405e2019-04-25 20:48:211707 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1708 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1709
robpercival214763f2016-07-01 23:27:011710 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091711 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211712 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1713 // One ConnectJob completed, and its socket is now assigned to |handle|.
1714 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1715 // The other ConnectJob should have either completed, or still be connecting.
1716 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1717 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091718
1719 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211720 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1721 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1722 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1723 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091724}
1725
[email protected]ab838892009-06-30 18:49:051726TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531727 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091728
Matt Menkec6b3edf72019-03-19 17:00:391729 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1730 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1731 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1732 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1733 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1734 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1735 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091736
1737 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201738 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131739 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1740 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091741
[email protected]2431756e2010-09-29 20:26:131742 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091743
[email protected]c9d6a1d2009-07-14 16:15:201744 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1745 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131746 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1747 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091748
[email protected]c9d6a1d2009-07-14 16:15:201749 EXPECT_EQ(1, GetOrderOfRequest(1));
1750 EXPECT_EQ(2, GetOrderOfRequest(2));
1751 EXPECT_EQ(5, GetOrderOfRequest(3));
1752 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131753 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1754 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201755 EXPECT_EQ(4, GetOrderOfRequest(6));
1756 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171757
1758 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131759 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091760}
1761
mmenke33d24423d2015-05-19 19:41:091762// Function to be used as a callback on socket request completion. It first
1763// disconnects the successfully connected socket from the first request, and
1764// then reuses the ClientSocketHandle to request another socket.
1765//
1766// |nested_callback| is called with the result of the second socket request.
1767void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261768 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091769 TestConnectJobFactory* test_connect_job_factory,
1770 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411771 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091772 int first_request_result) {
robpercival214763f2016-07-01 23:27:011773 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091774
1775 test_connect_job_factory->set_job_type(next_job_type);
1776
1777 // Don't allow reuse of the socket. Disconnect it and then release it.
1778 if (handle->socket())
1779 handle->socket()->Disconnect();
1780 handle->Reset();
1781
mmenke33d24423d2015-05-19 19:41:091782 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501783 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031784 TestGroupId("a"),
Matt Menkef09e64c2019-04-23 22:16:281785 ClientSocketPool::SocketParams::CreateForHttpForTesting(), base::nullopt,
1786 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031787 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1788 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091789 if (rv != ERR_IO_PENDING) {
1790 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411791 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091792 } else {
1793 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521794 }
mmenke33d24423d2015-05-19 19:41:091795}
[email protected]f6d1d6eb2009-06-24 20:16:091796
mmenke33d24423d2015-05-19 19:41:091797// Tests the case where a second socket is requested in a completion callback,
1798// and the second socket connects asynchronously. Reuses the same
1799// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581800TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531801 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201802
[email protected]0b7648c2009-07-06 20:14:011803 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061804 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091805 TestCompletionCallback second_result_callback;
1806 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281807 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541808 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501809 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1810 connect_job_factory_, TestConnectJob::kMockPendingJob,
1811 &second_result_callback),
1812 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011813 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091814
robpercival214763f2016-07-01 23:27:011815 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581816}
[email protected]f6d1d6eb2009-06-24 20:16:091817
mmenke33d24423d2015-05-19 19:41:091818// Tests the case where a second socket is requested in a completion callback,
1819// and the second socket connects synchronously. Reuses the same
1820// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581821TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531822 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201823
[email protected]0b7648c2009-07-06 20:14:011824 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061825 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091826 TestCompletionCallback second_result_callback;
1827 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281828 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541829 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501830 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1831 connect_job_factory_, TestConnectJob::kMockPendingJob,
1832 &second_result_callback),
1833 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011834 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581835
robpercival214763f2016-07-01 23:27:011836 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091837}
1838
1839// Make sure that pending requests get serviced after active requests get
1840// cancelled.
[email protected]ab838892009-06-30 18:49:051841TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531842 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201843
[email protected]0b7648c2009-07-06 20:14:011844 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091845
Matt Menkec6b3edf72019-03-19 17:00:391846 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1847 IsError(ERR_IO_PENDING));
1848 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1849 IsError(ERR_IO_PENDING));
1850 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1851 IsError(ERR_IO_PENDING));
1852 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1853 IsError(ERR_IO_PENDING));
1854 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1855 IsError(ERR_IO_PENDING));
1856 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1857 IsError(ERR_IO_PENDING));
1858 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1859 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091860
[email protected]c9d6a1d2009-07-14 16:15:201861 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1862 // Let's cancel them.
1863 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131864 ASSERT_FALSE(request(i)->handle()->is_initialized());
1865 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091866 }
1867
[email protected]f6d1d6eb2009-06-24 20:16:091868 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131869 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011870 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131871 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091872 }
1873
[email protected]2431756e2010-09-29 20:26:131874 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1875 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091876}
1877
1878// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051879TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531880 const size_t kMaxSockets = 5;
1881 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201882
[email protected]0b7648c2009-07-06 20:14:011883 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091884
[email protected]211d21722009-07-22 15:48:531885 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1886 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091887
1888 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531889 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391890 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1891 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091892
[email protected]211d21722009-07-22 15:48:531893 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011894 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091895}
1896
mmenke9d72fe42017-05-18 22:36:071897// Make sure that pending requests that complete synchronously get serviced
1898// after active requests fail. See https://crbug.com/723748
1899TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1900 const size_t kNumberOfRequests = 10;
1901 const size_t kMaxSockets = 1;
1902 CreatePool(kMaxSockets, kMaxSockets);
1903
1904 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1905
Matt Menkec6b3edf72019-03-19 17:00:391906 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1907 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071908
1909 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1910
1911 // Queue up all the other requests
1912 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391913 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1914 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071915
1916 // Make sure all requests fail, instead of hanging.
1917 for (size_t i = 0; i < kNumberOfRequests; ++i)
1918 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1919}
1920
[email protected]5fc08e32009-07-15 17:09:571921TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531922 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571923
1924 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1925
[email protected]2431756e2010-09-29 20:26:131926 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521927 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501928 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281929 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501930 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1931 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011932 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571933
1934 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131935 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571936
Matt Menkef09e64c2019-04-23 22:16:281937 rv = handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1938 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501939 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1940 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011941 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1942 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571943
[email protected]2431756e2010-09-29 20:26:131944 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481945 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571946 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1947}
1948
xunjieli26619e72016-11-23 19:39:551949TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
Matt Menke433de6d2020-03-04 00:24:111950 const char kReason[] = "Really nifty reason";
1951
xunjieli26619e72016-11-23 19:39:551952 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1953 ClientSocketHandle handle;
1954 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141955 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501956 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281957 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501958 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1959 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551960 EXPECT_THAT(rv, IsOk());
Matt Menke433de6d2020-03-04 00:24:111961 ASSERT_TRUE(handle.socket());
1962 NetLogSource source = handle.socket()->NetLog().source();
xunjieli26619e72016-11-23 19:39:551963 handle.Reset();
1964 EXPECT_EQ(1, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111965 pool_->CloseIdleSockets(kReason);
1966 ExpectSocketClosedWithReason(source, kReason);
xunjieli26619e72016-11-23 19:39:551967}
1968
xunjieli92feb332017-03-03 17:19:231969TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231970 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1971 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141972 RecordingBoundTestNetLog log;
xunjieli92feb332017-03-03 17:19:231973 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501974 int rv = handle1.Init(
Matt Menkef09e64c2019-04-23 22:16:281975 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501976 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1977 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231978 EXPECT_THAT(rv, IsOk());
1979 ClientSocketHandle handle2;
Matt Menkef09e64c2019-04-23 22:16:281980 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
1981 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501982 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1983 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231984 ClientSocketHandle handle3;
Matt Menkef09e64c2019-04-23 22:16:281985 rv = handle3.Init(TestGroupId("b"), params_, base::nullopt, LOWEST,
1986 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501987 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1988 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231989 EXPECT_THAT(rv, IsOk());
1990 handle1.Reset();
1991 handle2.Reset();
1992 handle3.Reset();
1993 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111994 pool_->CloseIdleSocketsInGroup(TestGroupId("a"), "Very good reason");
xunjieli92feb332017-03-03 17:19:231995 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231996}
1997
xunjieli26619e72016-11-23 19:39:551998TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551999 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2000 ClientSocketHandle handle;
2001 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142002 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502003 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282004 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502005 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2006 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:552007 EXPECT_THAT(rv, IsOk());
2008 StreamSocket* socket = handle.socket();
Matt Menke433de6d2020-03-04 00:24:112009 ASSERT_TRUE(socket);
xunjieli26619e72016-11-23 19:39:552010 handle.Reset();
2011 EXPECT_EQ(1, pool_->IdleSocketCount());
2012
2013 // Disconnect socket now to make the socket unusable.
Matt Menke433de6d2020-03-04 00:24:112014 NetLogSource source = socket->NetLog().source();
xunjieli26619e72016-11-23 19:39:552015 socket->Disconnect();
2016 ClientSocketHandle handle2;
Matt Menkef09e64c2019-04-23 22:16:282017 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2018 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502019 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2020 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:552021 EXPECT_THAT(rv, IsOk());
2022 EXPECT_FALSE(handle2.is_reused());
Matt Menke433de6d2020-03-04 00:24:112023
2024 // This is admittedly not an accurate error in this case, but normally code
2025 // doesn't secretly keep a raw pointers to sockets returned to the socket pool
2026 // and close them out of band, so discovering an idle socket was closed when
2027 // trying to reuse it normally means it was closed by the remote side.
2028 ExpectSocketClosedWithReason(
2029 source, TransportClientSocketPool::kRemoteSideClosedConnection);
xunjieli26619e72016-11-23 19:39:552030}
2031
[email protected]2b7523d2009-07-29 20:29:232032// Regression test for http://crbug.com/17985.
2033TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
2034 const int kMaxSockets = 3;
2035 const int kMaxSocketsPerGroup = 2;
2036 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
2037
[email protected]ac790b42009-12-02 04:31:312038 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:232039
Matt Menkec6b3edf72019-03-19 17:00:392040 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2041 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232042
2043 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:392044 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2045 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232046
2047 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:392048 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232049
2050 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:392051 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2052 IsError(ERR_IO_PENDING));
2053 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2054 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232055
Matt Menkec6b3edf72019-03-19 17:00:392056 // Release the first two sockets from TestGroupId("a"). Because this is a
2057 // keepalive, the first release will unblock the pending request for
2058 // TestGroupId("a"). The second release will unblock a request for "c",
2059 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:132060 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
2061 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:232062
2063 // Closing idle sockets should not get us into trouble, but in the bug
2064 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:392065 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke433de6d2020-03-04 00:24:112066 pool_->CloseIdleSockets("Very good reason");
[email protected]eb5a99382010-07-11 03:18:262067
[email protected]2da659e2013-05-23 20:51:342068 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282069 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232070}
2071
[email protected]4d3b05d2010-01-27 21:27:292072TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532073 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572074
2075 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132076 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522077 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142078 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502079 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282080 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502081 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2082 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012083 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392084 EXPECT_EQ(LOAD_STATE_CONNECTING,
2085 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482086 TestLoadTimingInfoNotConnected(handle);
2087
robpercival214763f2016-07-01 23:27:012088 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132089 EXPECT_TRUE(handle.is_initialized());
2090 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482091 TestLoadTimingInfoConnectedNotReused(handle);
2092
[email protected]2431756e2010-09-29 20:26:132093 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482094 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302095
Eric Roman79cc7552019-07-19 02:17:542096 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402097
Matt Menke9fa17d52019-03-25 19:12:262098 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172099 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262100 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002101 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262102 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2103 EXPECT_TRUE(LogContainsEvent(
2104 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2105 NetLogEventPhase::NONE));
2106 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002107 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2108 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262109 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572110}
2111
[email protected]4d3b05d2010-01-27 21:27:292112TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572113 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532114 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572115
2116 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132117 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522118 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142119 RecordingBoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:182120 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132121 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512122 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502123 EXPECT_EQ(
2124 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282125 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2126 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2127 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2128 pool_.get(), log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:392129 EXPECT_EQ(LOAD_STATE_CONNECTING,
2130 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012131 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132132 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512133 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302134
Eric Roman79cc7552019-07-19 02:17:542135 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402136
Matt Menke9fa17d52019-03-25 19:12:262137 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172138 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262139 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002140 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262141 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2142 EXPECT_TRUE(LogContainsEvent(
2143 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2144 NetLogEventPhase::NONE));
2145 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572146}
2147
mmenke6be122f2015-03-09 22:22:472148// Check that an async ConnectJob failure does not result in creation of a new
2149// ConnectJob when there's another pending request also waiting on its own
2150// ConnectJob. See http://crbug.com/463960.
2151TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2152 CreatePool(2, 2);
2153 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2154
Matt Menkec6b3edf72019-03-19 17:00:392155 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2156 IsError(ERR_IO_PENDING));
2157 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2158 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472159
robpercival214763f2016-07-01 23:27:012160 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2161 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472162
2163 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2164}
2165
[email protected]4d3b05d2010-01-27 21:27:292166TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102167 // TODO(eroman): Add back the log expectations! Removed them because the
2168 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532169 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572170
2171 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132172 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522173 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132174 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522175 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572176
Matt Menke28ac03e2019-02-25 22:25:502177 EXPECT_EQ(
2178 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282179 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2180 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2181 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2182 pool_.get(), NetLogWithSource()));
Matt Muellerd9342e3a2019-11-26 01:41:142183 RecordingBoundTestNetLog log2;
tfarina428341112016-09-22 13:38:202184 EXPECT_EQ(
2185 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282186 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2187 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502188 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2189 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572190
[email protected]2431756e2010-09-29 20:26:132191 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572192
[email protected]fd7b7c92009-08-20 19:38:302193
2194 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302195
robpercival214763f2016-07-01 23:27:012196 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132197 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302198
2199 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532200 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572201}
2202
[email protected]4d3b05d2010-01-27 21:27:292203TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342204 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2205
[email protected]17a0c6c2009-08-04 00:07:042206 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2207
Matt Menkec6b3edf72019-03-19 17:00:392208 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2209 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2210 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2211 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342212
Raul Tambre8335a6d2019-02-21 16:57:432213 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262214 static_cast<int>(
2215 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132216 (*requests())[2]->handle()->Reset();
2217 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432218 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262219 static_cast<int>(
2220 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342221
[email protected]2431756e2010-09-29 20:26:132222 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432223 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262224 static_cast<int>(
2225 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342226
[email protected]2431756e2010-09-29 20:26:132227 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432228 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262229 static_cast<int>(
2230 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342231}
2232
[email protected]5fc08e32009-07-15 17:09:572233// When requests and ConnectJobs are not coupled, the request will get serviced
2234// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292235TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532236 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572237
2238 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322239 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572240
[email protected]2431756e2010-09-29 20:26:132241 std::vector<TestSocketRequest*> request_order;
2242 size_t completion_count; // unused
2243 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502244 int rv = req1.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282245 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502246 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2247 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012248 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2249 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572250
2251 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2252 // without a job.
2253 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2254
[email protected]2431756e2010-09-29 20:26:132255 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502256 rv = req2.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282257 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502258 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2259 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012260 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132261 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502262 rv = req3.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282263 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502264 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2265 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012266 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572267
2268 // Both Requests 2 and 3 are pending. We release socket 1 which should
2269 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332270 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342271 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282272 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332273 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012274 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332275 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572276
2277 // Signal job 2, which should service request 3.
2278
2279 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012280 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572281
Raul Tambre8335a6d2019-02-21 16:57:432282 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132283 EXPECT_EQ(&req1, request_order[0]);
2284 EXPECT_EQ(&req2, request_order[1]);
2285 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392286 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572287}
2288
2289// The requests are not coupled to the jobs. So, the requests should finish in
2290// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292291TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532292 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572293 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322294 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572295
[email protected]2431756e2010-09-29 20:26:132296 std::vector<TestSocketRequest*> request_order;
2297 size_t completion_count; // unused
2298 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502299 int rv = req1.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282300 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502301 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2302 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012303 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572304
[email protected]2431756e2010-09-29 20:26:132305 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502306 rv = req2.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282307 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502308 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2309 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012310 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572311
2312 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322313 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572314
[email protected]2431756e2010-09-29 20:26:132315 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502316 rv = req3.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282317 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502318 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2319 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012320 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572321
robpercival214763f2016-07-01 23:27:012322 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2323 EXPECT_THAT(req2.WaitForResult(), IsOk());
2324 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572325
Raul Tambre8335a6d2019-02-21 16:57:432326 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132327 EXPECT_EQ(&req1, request_order[0]);
2328 EXPECT_EQ(&req2, request_order[1]);
2329 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572330}
2331
[email protected]03b7c8c2013-07-20 04:38:552332// Test GetLoadState in the case there's only one socket request.
2333TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532334 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552335 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572336
[email protected]2431756e2010-09-29 20:26:132337 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522338 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502339 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282340 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502341 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2342 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012343 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552344 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572345
[email protected]03b7c8c2013-07-20 04:38:552346 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2347 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2348
2349 // No point in completing the connection, since ClientSocketHandles only
2350 // expect the LoadState to be checked while connecting.
2351}
2352
2353// Test GetLoadState in the case there are two socket requests.
2354TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2355 CreatePool(2, 2);
2356 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2357
2358 ClientSocketHandle handle;
2359 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502360 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282361 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502362 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2363 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012364 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002365 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2366
2367 ClientSocketHandle handle2;
2368 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282369 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2370 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502371 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2372 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012373 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002374 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2375
Matt Menke4b69f932019-03-04 16:20:012376 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002377 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2378 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2379
Matt Menke4b69f932019-03-04 16:20:012380 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002381 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2382
Matt Menke4b69f932019-03-04 16:20:012383 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002384 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002385 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012386
2387 // Update the state of the second job.
2388 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2389
2390 // Only the state of the second request should have changed.
2391 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2392 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2393
2394 // Second job connects and the first request gets the socket. The
2395 // second handle switches to the state of the remaining ConnectJob.
2396 client_socket_factory_.SignalJob(1);
2397 EXPECT_THAT(callback.WaitForResult(), IsOk());
2398 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552399}
2400
2401// Test GetLoadState in the case the per-group limit is reached.
2402TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2403 CreatePool(2, 1);
2404 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2405
2406 ClientSocketHandle handle;
2407 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502408 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282409 TestGroupId("a"), params_, base::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502410 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2411 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012412 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552413 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2414
2415 // Request another socket from the same pool, buth with a higher priority.
2416 // The first request should now be stalled at the socket group limit.
2417 ClientSocketHandle handle2;
2418 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282419 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
2420 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502421 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2422 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012423 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552424 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2425 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2426
2427 // The first handle should remain stalled as the other socket goes through
2428 // the connect process.
2429
2430 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2431 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2432 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2433
2434 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012435 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552436 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2437
2438 // Closing the second socket should cause the stalled handle to finally get a
2439 // ConnectJob.
2440 handle2.socket()->Disconnect();
2441 handle2.Reset();
2442 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2443}
2444
2445// Test GetLoadState in the case the per-pool limit is reached.
2446TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2447 CreatePool(2, 2);
2448 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2449
2450 ClientSocketHandle handle;
2451 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502452 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282453 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502454 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2455 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012456 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552457
2458 // Request for socket from another pool.
2459 ClientSocketHandle handle2;
2460 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282461 rv = handle2.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
2462 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502463 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2464 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012465 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552466
2467 // Request another socket from the first pool. Request should stall at the
2468 // socket pool limit.
2469 ClientSocketHandle handle3;
2470 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282471 rv = handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2472 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502473 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2474 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012475 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552476
2477 // The third handle should remain stalled as the other sockets in its group
2478 // goes through the connect process.
2479
2480 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2481 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2482
2483 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2484 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2485 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2486
2487 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012488 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552489 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2490
2491 // Closing a socket should allow the stalled handle to finally get a new
2492 // ConnectJob.
2493 handle.socket()->Disconnect();
2494 handle.Reset();
2495 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572496}
2497
Matt Menkeb57663b32019-03-01 17:17:102498TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132499 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102500 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132501
[email protected]2431756e2010-09-29 20:26:132502 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522503 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502504 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102505 ERR_CERT_COMMON_NAME_INVALID,
Matt Menkef09e64c2019-04-23 22:16:282506 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2507 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2508 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2509 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132510 EXPECT_TRUE(handle.is_initialized());
2511 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132512}
2513
Matt Menkeb57663b32019-03-01 17:17:102514TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132515 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2516
Matt Menkeb57663b32019-03-01 17:17:102517 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132518 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522519 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502520 EXPECT_EQ(
2521 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282522 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2523 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2524 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2525 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392526 EXPECT_EQ(LOAD_STATE_CONNECTING,
2527 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102528 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132529 EXPECT_TRUE(handle.is_initialized());
2530 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132531}
2532
[email protected]e60e47a2010-07-14 03:37:182533TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2534 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2535 connect_job_factory_->set_job_type(
2536 TestConnectJob::kMockAdditionalErrorStateJob);
2537
[email protected]2431756e2010-09-29 20:26:132538 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522539 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502540 EXPECT_EQ(
2541 ERR_CONNECTION_FAILED,
Matt Menkef09e64c2019-04-23 22:16:282542 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2543 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2544 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2545 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132546 EXPECT_FALSE(handle.is_initialized());
2547 EXPECT_FALSE(handle.socket());
2548 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512549 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182550}
2551
2552TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2553 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2554
2555 connect_job_factory_->set_job_type(
2556 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132557 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522558 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502559 EXPECT_EQ(
2560 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282561 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2562 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2563 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2564 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392565 EXPECT_EQ(LOAD_STATE_CONNECTING,
2566 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012567 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132568 EXPECT_FALSE(handle.is_initialized());
2569 EXPECT_FALSE(handle.socket());
2570 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512571 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182572}
2573
martijn003cd612016-05-19 22:24:382574// Make sure we can reuse sockets.
2575TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412576 CreatePoolWithIdleTimeouts(
2577 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032578 base::TimeDelta(), // Time out unused sockets immediately.
2579 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2580
2581 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2582
2583 ClientSocketHandle handle;
2584 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502585 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282586 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502587 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2588 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012589 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392590 EXPECT_EQ(LOAD_STATE_CONNECTING,
2591 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012592 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032593
2594 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352595 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382596 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482597 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032598 handle.Reset();
2599
2600 // Should now have one idle socket.
2601 ASSERT_EQ(1, pool_->IdleSocketCount());
2602
2603 // Request a new socket. This should reuse the old socket and complete
2604 // synchronously.
Matt Muellerd9342e3a2019-11-26 01:41:142605 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502606 rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282607 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502608 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2609 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012610 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032611 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482612 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032613
Matt Menke9fa17d52019-03-25 19:12:262614 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392615 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262616 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032617
Eric Roman79cc7552019-07-19 02:17:542618 auto entries = log.GetEntries();
Matt Menke9fa17d52019-03-25 19:12:262619 EXPECT_TRUE(LogContainsEvent(
2620 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2621 NetLogEventPhase::NONE));
2622 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032623 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262624 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032625}
2626
martijn003cd612016-05-19 22:24:382627// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172628TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032629 CreatePoolWithIdleTimeouts(
2630 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2631 base::TimeDelta(), // Time out unused sockets immediately
2632 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412633
2634 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2635
2636 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2637
2638 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522639 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502640 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282641 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502642 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2643 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012644 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392645 EXPECT_EQ(LOAD_STATE_CONNECTING,
2646 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412647
2648 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522649 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282650 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2651 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502652 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2653 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012654 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392655 EXPECT_EQ(LOAD_STATE_CONNECTING,
2656 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412657
2658 // Cancel one of the requests. Wait for the other, which will get the first
2659 // job. Release the socket. Run the loop again to make sure the second
2660 // socket is sitting idle and the first one is released (since ReleaseSocket()
2661 // just posts a DoReleaseSocket() task).
2662
2663 handle.Reset();
robpercival214763f2016-07-01 23:27:012664 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menke433de6d2020-03-04 00:24:112665 // Get the NetLogSource for the socket, so the time out reason can be checked
2666 // at the end of the test.
2667 NetLogSource net_log_source2 = handle2.socket()->NetLog().source();
[email protected]64770b7d2011-11-16 04:30:412668 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352669 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382670 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412671 handle2.Reset();
2672
[email protected]e7b1c6d2c2012-05-05 00:54:032673 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2674 // actually become pending until 2ms after they have been created. In order
2675 // to flush all tasks, we need to wait so that we know there are no
2676 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452677 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412678
[email protected]e7b1c6d2c2012-05-05 00:54:032679 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412680 ASSERT_EQ(2, pool_->IdleSocketCount());
2681
2682 // Request a new socket. This should cleanup the unused and timed out ones.
2683 // A new socket will be created rather than reusing the idle one.
Matt Muellerd9342e3a2019-11-26 01:41:142684 RecordingBoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522685 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282686 rv = handle.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2687 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502688 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2689 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012690 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2691 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412692 EXPECT_FALSE(handle.is_reused());
2693
[email protected]e7b1c6d2c2012-05-05 00:54:032694 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262695 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392696 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262697 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412698
Eric Roman79cc7552019-07-19 02:17:542699 auto entries = log.GetEntries();
[email protected]64770b7d2011-11-16 04:30:412700 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002701 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
Matt Menke433de6d2020-03-04 00:24:112702 ExpectSocketClosedWithReason(
2703 net_log_source2, TransportClientSocketPool::kIdleTimeLimitExpired);
[email protected]64770b7d2011-11-16 04:30:412704}
2705
[email protected]2041cf342010-02-19 03:15:592706// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162707// because of multiple releasing disconnected sockets.
2708TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2709 CreatePoolWithIdleTimeouts(
2710 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2711 base::TimeDelta(), // Time out unused sockets immediately.
2712 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2713
2714 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2715
2716 // Startup 4 connect jobs. Two of them will be pending.
2717
[email protected]2431756e2010-09-29 20:26:132718 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522719 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502720 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282721 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502722 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2723 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012724 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162725
[email protected]2431756e2010-09-29 20:26:132726 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522727 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282728 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2729 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502730 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2731 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012732 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162733
[email protected]2431756e2010-09-29 20:26:132734 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522735 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282736 rv = handle3.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2737 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502738 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2739 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012740 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162741
[email protected]2431756e2010-09-29 20:26:132742 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522743 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:282744 rv = handle4.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2745 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502746 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2747 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012748 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162749
2750 // Release two disconnected sockets.
2751
[email protected]2431756e2010-09-29 20:26:132752 handle.socket()->Disconnect();
2753 handle.Reset();
2754 handle2.socket()->Disconnect();
2755 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162756
robpercival214763f2016-07-01 23:27:012757 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132758 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012759 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132760 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162761}
2762
[email protected]d7027bb2010-05-10 18:58:542763// Regression test for http://crbug.com/42267.
2764// When DoReleaseSocket() is processed for one socket, it is blocked because the
2765// other stalled groups all have releasing sockets, so no progress can be made.
2766TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2767 CreatePoolWithIdleTimeouts(
2768 4 /* socket limit */, 4 /* socket limit per group */,
2769 base::TimeDelta(), // Time out unused sockets immediately.
2770 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2771
2772 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2773
2774 // Max out the socket limit with 2 per group.
2775
[email protected]2431756e2010-09-29 20:26:132776 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522777 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132778 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522779 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542780
2781 for (int i = 0; i < 2; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282782 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, base::nullopt,
2783 LOWEST, SocketTag(),
2784 ClientSocketPool::RespectLimits::ENABLED,
2785 callback_a[i].callback(),
2786 ClientSocketPool::ProxyAuthCallback(),
2787 pool_.get(), NetLogWithSource()));
2788 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, base::nullopt,
2789 LOWEST, SocketTag(),
2790 ClientSocketPool::RespectLimits::ENABLED,
2791 callback_b[i].callback(),
2792 ClientSocketPool::ProxyAuthCallback(),
2793 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542794 }
[email protected]b89f7e42010-05-20 20:37:002795
[email protected]d7027bb2010-05-10 18:58:542796 // Make 4 pending requests, 2 per group.
2797
2798 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282799 EXPECT_EQ(
2800 ERR_IO_PENDING,
2801 handle_a[i].Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2802 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2803 callback_a[i].callback(),
2804 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2805 NetLogWithSource()));
2806 EXPECT_EQ(
2807 ERR_IO_PENDING,
2808 handle_b[i].Init(TestGroupId("b"), params_, base::nullopt, LOWEST,
2809 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2810 callback_b[i].callback(),
2811 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2812 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542813 }
2814
2815 // Release b's socket first. The order is important, because in
2816 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2817 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2818 // first, which has a releasing socket, so it refuses to start up another
2819 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132820 handle_b[0].socket()->Disconnect();
2821 handle_b[0].Reset();
2822 handle_a[0].socket()->Disconnect();
2823 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542824
2825 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282826 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542827
[email protected]2431756e2010-09-29 20:26:132828 handle_b[1].socket()->Disconnect();
2829 handle_b[1].Reset();
2830 handle_a[1].socket()->Disconnect();
2831 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542832
2833 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012834 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2835 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542836 }
2837}
2838
[email protected]fd4fe0b2010-02-08 23:02:152839TEST_F(ClientSocketPoolBaseTest,
2840 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2841 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2842
2843 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2844
Matt Menkec6b3edf72019-03-19 17:00:392845 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2846 IsError(ERR_IO_PENDING));
2847 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2848 IsError(ERR_IO_PENDING));
2849 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2850 IsError(ERR_IO_PENDING));
2851 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2852 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152853
robpercival214763f2016-07-01 23:27:012854 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2855 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132856 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152857
2858 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132859 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012860 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152861
[email protected]2431756e2010-09-29 20:26:132862 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012863 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132864 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152865
2866 EXPECT_EQ(1, GetOrderOfRequest(1));
2867 EXPECT_EQ(2, GetOrderOfRequest(2));
2868 EXPECT_EQ(3, GetOrderOfRequest(3));
2869 EXPECT_EQ(4, GetOrderOfRequest(4));
2870
2871 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132872 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152873}
2874
[email protected]6ecf2b92011-12-15 01:14:522875class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042876 public:
Matt Menke9fa17d52019-03-25 19:12:262877 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132878 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182879 bool reset_releasing_handle)
2880 : pool_(pool),
2881 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042882 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522883
Chris Watkins7a41d3552017-12-01 02:13:272884 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042885
2886 ClientSocketHandle* handle() { return &handle_; }
2887
Bence Béky8ddc2492018-06-13 01:02:042888 CompletionOnceCallback callback() {
2889 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2890 base::Unretained(this));
2891 }
[email protected]4f1e4982010-03-02 18:31:042892
2893 private:
[email protected]6ecf2b92011-12-15 01:14:522894 void OnComplete(int result) {
2895 SetResult(result);
2896 if (reset_releasing_handle_)
2897 handle_.Reset();
2898
Matt Menkec6b3edf72019-03-19 17:00:392899 EXPECT_EQ(
2900 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032901 handle2_.Init(
2902 TestGroupId("a"),
2903 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:282904 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032905 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2906 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522907 }
2908
Matt Menke9fa17d52019-03-25 19:12:262909 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182910 int expected_result_;
2911 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042912 ClientSocketHandle handle_;
2913 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042914};
2915
[email protected]e60e47a2010-07-14 03:37:182916
2917TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2918 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2919
Matt Menkec6b3edf72019-03-19 17:00:392920 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2921 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2922 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182923
[email protected]2431756e2010-09-29 20:26:132924 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182925 client_socket_factory_.allocation_count());
2926
2927 connect_job_factory_->set_job_type(
2928 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2929 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282930 EXPECT_EQ(ERR_IO_PENDING,
2931 req.handle()->Init(
2932 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2933 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2934 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2935 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182936 // The next job should complete synchronously
2937 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2938
robpercival214763f2016-07-01 23:27:012939 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182940 EXPECT_FALSE(req.handle()->is_initialized());
2941 EXPECT_FALSE(req.handle()->socket());
2942 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512943 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182944}
2945
[email protected]b6501d3d2010-06-03 23:53:342946// http://crbug.com/44724 regression test.
2947// We start releasing the pool when we flush on network change. When that
2948// happens, the only active references are in the ClientSocketHandles. When a
2949// ConnectJob completes and calls back into the last ClientSocketHandle, that
2950// callback can release the last reference and delete the pool. After the
2951// callback finishes, we go back to the stack frame within the now-deleted pool.
2952// Executing any code that refers to members of the now-deleted pool can cause
2953// crashes.
2954TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2955 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2956 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2957
2958 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522959 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502960 EXPECT_EQ(
2961 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282962 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2963 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2964 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2965 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342966
Matt Menke433de6d2020-03-04 00:24:112967 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]b6501d3d2010-06-03 23:53:342968
2969 // We'll call back into this now.
2970 callback.WaitForResult();
2971}
2972
[email protected]a7e38572010-06-07 18:22:242973TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2974 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2975 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2976
2977 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522978 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502979 EXPECT_EQ(
2980 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282981 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2982 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2983 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2984 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012985 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242986 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:112987 NetLogSource source = handle.socket()->NetLog().source();
[email protected]a7e38572010-06-07 18:22:242988
Matt Menke433de6d2020-03-04 00:24:112989 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]a7e38572010-06-07 18:22:242990
2991 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282992 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242993
Matt Menke28ac03e2019-02-25 22:25:502994 EXPECT_EQ(
2995 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282996 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2997 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2998 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2999 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013000 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243001 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113002
3003 ExpectSocketClosedWithReason(
3004 source, TransportClientSocketPool::kSocketGenerationOutOfDate);
[email protected]a7e38572010-06-07 18:22:243005}
3006
[email protected]6ecf2b92011-12-15 01:14:523007class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:143008 public:
Matt Menke9fa17d52019-03-25 19:12:263009 ConnectWithinCallback(
3010 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:193011 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:263012 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:393013 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:143014
Chris Watkins7a41d3552017-12-01 02:13:273015 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:143016
3017 int WaitForNestedResult() {
3018 return nested_callback_.WaitForResult();
3019 }
3020
Bence Béky8ddc2492018-06-13 01:02:043021 CompletionOnceCallback callback() {
3022 return base::BindOnce(&ConnectWithinCallback::OnComplete,
3023 base::Unretained(this));
3024 }
[email protected]6ecf2b92011-12-15 01:14:523025
[email protected]06f92462010-08-31 19:24:143026 private:
[email protected]6ecf2b92011-12-15 01:14:523027 void OnComplete(int result) {
3028 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:283029 EXPECT_EQ(
3030 ERR_IO_PENDING,
3031 handle_.Init(group_id_, params_, base::nullopt, DEFAULT_PRIORITY,
3032 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3033 nested_callback_.callback(),
3034 ClientSocketPool::ProxyAuthCallback(), pool_,
3035 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:523036 }
3037
Matt Menkec6b3edf72019-03-19 17:00:393038 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:193039 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:263040 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:143041 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:523042 TestCompletionCallback nested_callback_;
3043
3044 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:143045};
3046
3047TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
3048 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3049
3050 // First job will be waiting until it gets aborted.
3051 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3052
3053 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:393054 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:503055 EXPECT_EQ(
3056 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283057 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3058 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3059 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3060 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:143061
3062 // Second job will be started during the first callback, and will
3063 // asynchronously complete with OK.
3064 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menke433de6d2020-03-04 00:24:113065 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
robpercival214763f2016-07-01 23:27:013066 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
3067 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:143068}
3069
Matt Menke141b87f22019-01-30 02:43:033070TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:263071 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3072 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033073
3074 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3075 ClientSocketHandle handle;
3076 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503077 EXPECT_EQ(
3078 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283079 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3080 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3081 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3082 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033083 // The backup timer fires but doesn't start a new ConnectJob while resolving
3084 // the hostname.
3085 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3086 FastForwardBy(base::TimeDelta::FromMilliseconds(
3087 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3088 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3089
3090 // Once the ConnectJob has finished resolving the hostname, the backup timer
3091 // will create a ConnectJob when it fires.
3092 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
3093 FastForwardBy(base::TimeDelta::FromMilliseconds(
3094 ClientSocketPool::kMaxConnectRetryIntervalMs));
3095 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3096}
3097
3098// Test that no backup socket is created when a ConnectJob connects before it
3099// completes.
3100TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263101 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3102 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033103
3104 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3105 ClientSocketHandle handle;
3106 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503107 EXPECT_EQ(
3108 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283109 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3110 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3111 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3112 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033113 // The backup timer fires but doesn't start a new ConnectJob while resolving
3114 // the hostname.
3115 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3116 FastForwardBy(base::TimeDelta::FromMilliseconds(
3117 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3118 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3119
3120 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3121 client_socket_factory_.SetJobHasEstablishedConnection(0);
3122 FastForwardBy(base::TimeDelta::FromMilliseconds(
3123 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3124 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3125}
3126
[email protected]25eea382010-07-10 23:55:263127// Cancel a pending socket request while we're at max sockets,
3128// and verify that the backup socket firing doesn't cause a crash.
3129TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3130 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263131 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3132 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263133
[email protected]4baaf9d2010-08-31 15:15:443134 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3135 // timer.
[email protected]25eea382010-07-10 23:55:263136 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3137 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523138 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503139 EXPECT_EQ(
3140 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283141 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3142 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3143 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3144 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263145
3146 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3147 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3148 ClientSocketHandle handles[kDefaultMaxSockets];
3149 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:523150 TestCompletionCallback callback;
Matt Menkef09e64c2019-04-23 22:16:283151 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, base::nullopt,
3152 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203153 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503154 callback.callback(),
3155 ClientSocketPool::ProxyAuthCallback(),
3156 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263157 }
3158
fdoray5eeb7642016-06-22 16:11:283159 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263160
3161 // Cancel the pending request.
3162 handle.Reset();
3163
3164 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453165 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003166 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263167
[email protected]25eea382010-07-10 23:55:263168 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3169}
3170
[email protected]3f00be82010-09-27 19:50:023171TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263172 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3173 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443174
3175 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3176 // timer.
3177 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3178 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523179 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503180 EXPECT_EQ(
3181 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283182 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3183 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3184 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3185 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263186 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3187 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3188 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3189 TestGroupId("bar")));
3190 EXPECT_EQ(
3191 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443192
3193 // Cancel the socket request. This should cancel the backup timer. Wait for
3194 // the backup time to see if it indeed got canceled.
3195 handle.Reset();
3196 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453197 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003198 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263199 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3200 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443201}
3202
[email protected]3f00be82010-09-27 19:50:023203TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263204 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3205 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023206
3207 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3208 // timer.
3209 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3210 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523211 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503212 EXPECT_EQ(
3213 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283214 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3215 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3216 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3217 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023218 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3219 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523220 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203221 EXPECT_EQ(
3222 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283223 handle2.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3224 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503225 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3226 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263227 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3228 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023229
3230 // Cancel request 1 and then complete request 2. With the requests finished,
3231 // the backup timer should be cancelled.
3232 handle.Reset();
robpercival214763f2016-07-01 23:27:013233 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023234 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453235 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003236 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023237}
3238
[email protected]eb5a99382010-07-11 03:18:263239// Test delayed socket binding for the case where we have two connects,
3240// and while one is waiting on a connect, the other frees up.
3241// The socket waiting on a connect should switch immediately to the freed
3242// up socket.
3243TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3244 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3245 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3246
3247 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523248 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503249 EXPECT_EQ(
3250 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283251 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3252 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503253 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3254 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013255 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263256
3257 // No idle sockets, no pending jobs.
3258 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263259 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263260
3261 // Create a second socket to the same host, but this one will wait.
3262 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3263 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503264 EXPECT_EQ(
3265 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283266 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3267 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503268 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3269 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263270 // No idle sockets, and one connecting job.
3271 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263272 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263273
3274 // Return the first handle to the pool. This will initiate the delayed
3275 // binding.
3276 handle1.Reset();
3277
fdoray5eeb7642016-06-22 16:11:283278 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263279
3280 // Still no idle sockets, still one pending connect job.
3281 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263282 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263283
3284 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013285 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263286
3287 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263288 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263289
3290 // Finally, signal the waiting Connect.
3291 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263292 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263293
fdoray5eeb7642016-06-22 16:11:283294 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263295}
3296
3297// Test delayed socket binding when a group is at capacity and one
3298// of the group's sockets frees up.
3299TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3300 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3301 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3302
3303 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523304 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503305 EXPECT_EQ(
3306 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283307 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3308 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503309 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3310 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013311 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263312
3313 // No idle sockets, no pending jobs.
3314 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263315 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263316
3317 // Create a second socket to the same host, but this one will wait.
3318 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3319 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503320 EXPECT_EQ(
3321 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283322 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3323 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503324 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3325 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263326 // No idle sockets, and one connecting job.
3327 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263328 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263329
3330 // Return the first handle to the pool. This will initiate the delayed
3331 // binding.
3332 handle1.Reset();
3333
fdoray5eeb7642016-06-22 16:11:283334 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263335
3336 // Still no idle sockets, still one pending connect job.
3337 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263338 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263339
3340 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013341 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263342
3343 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263344 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263345
3346 // Finally, signal the waiting Connect.
3347 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263348 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263349
fdoray5eeb7642016-06-22 16:11:283350 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263351}
3352
3353// Test out the case where we have one socket connected, one
3354// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513355// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263356// should complete, by taking the first socket's idle socket.
3357TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3358 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3359 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3360
3361 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523362 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503363 EXPECT_EQ(
3364 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283365 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3366 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503367 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3368 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013369 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263370
3371 // No idle sockets, no pending jobs.
3372 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263373 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263374
3375 // Create a second socket to the same host, but this one will wait.
3376 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3377 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503378 EXPECT_EQ(
3379 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283380 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3381 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503382 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3383 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263384 // No idle sockets, and one connecting job.
3385 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263386 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263387
3388 // Return the first handle to the pool. This will initiate the delayed
3389 // binding.
3390 handle1.Reset();
3391
fdoray5eeb7642016-06-22 16:11:283392 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263393
3394 // Still no idle sockets, still one pending connect job.
3395 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263396 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263397
3398 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013399 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263400
3401 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263402 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263403
3404 // Finally, signal the waiting Connect.
3405 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263406 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263407
fdoray5eeb7642016-06-22 16:11:283408 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263409}
3410
[email protected]2abfe90a2010-08-25 17:49:513411// Cover the case where on an available socket slot, we have one pending
3412// request that completes synchronously, thereby making the Group empty.
3413TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3414 const int kUnlimitedSockets = 100;
3415 const int kOneSocketPerGroup = 1;
3416 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3417
3418 // Make the first request asynchronous fail.
3419 // This will free up a socket slot later.
3420 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3421
3422 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523423 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203424 EXPECT_EQ(
3425 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283426 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3427 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503428 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3429 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263430 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513431
3432 // Make the second request synchronously fail. This should make the Group
3433 // empty.
3434 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3435 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523436 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513437 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3438 // when created.
tfarina428341112016-09-22 13:38:203439 EXPECT_EQ(
3440 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283441 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3442 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503443 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3444 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513445
Matt Menke9fa17d52019-03-25 19:12:263446 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513447
robpercival214763f2016-07-01 23:27:013448 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3449 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263450 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513451}
3452
[email protected]e1b54dc2010-10-06 21:27:223453TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3454 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3455
3456 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3457
3458 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523459 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203460 EXPECT_EQ(
3461 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283462 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3463 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503464 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3465 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223466
3467 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523468 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203469 EXPECT_EQ(
3470 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283471 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3472 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503473 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3474 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223475 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523476 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203477 EXPECT_EQ(
3478 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283479 handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3480 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503481 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3482 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223483
robpercival214763f2016-07-01 23:27:013484 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3485 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3486 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223487
3488 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353489 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383490 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353491 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383492 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223493
3494 handle1.Reset();
3495 handle2.Reset();
3496 handle3.Reset();
3497
Matt Menkec6b3edf72019-03-19 17:00:393498 EXPECT_EQ(OK, handle1.Init(
Matt Menkef09e64c2019-04-23 22:16:283499 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3500 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393501 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3502 pool_.get(), NetLogWithSource()));
3503 EXPECT_EQ(OK, handle2.Init(
Matt Menkef09e64c2019-04-23 22:16:283504 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3505 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393506 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3507 pool_.get(), NetLogWithSource()));
3508 EXPECT_EQ(OK, handle3.Init(
Matt Menkef09e64c2019-04-23 22:16:283509 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3510 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393511 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3512 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223513
3514 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3515 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3516 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3517}
3518
[email protected]2c2bef152010-10-13 00:55:033519TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3520 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3521 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3522
Matt Menkef09e64c2019-04-23 22:16:283523 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3524 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033525
Matt Menke9fa17d52019-03-25 19:12:263526 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3527 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3528 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3529 TestGroupId("a")));
3530 EXPECT_EQ(2u,
3531 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393532 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033533
3534 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523535 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203536 EXPECT_EQ(
3537 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283538 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3539 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503540 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3541 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033542
3543 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523544 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203545 EXPECT_EQ(
3546 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283547 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3548 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503549 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3550 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033551
Matt Menke9fa17d52019-03-25 19:12:263552 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3553 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3554 TestGroupId("a")));
3555 EXPECT_EQ(0u,
3556 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393557 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033558
robpercival214763f2016-07-01 23:27:013559 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3560 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033561 handle1.Reset();
3562 handle2.Reset();
3563
Matt Menke9fa17d52019-03-25 19:12:263564 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3565 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3566 TestGroupId("a")));
3567 EXPECT_EQ(0u,
3568 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393569 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033570}
3571
3572TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3573 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3574 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3575
3576 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523577 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203578 EXPECT_EQ(
3579 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283580 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3581 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503582 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3583 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033584
Matt Menke9fa17d52019-03-25 19:12:263585 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3586 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3587 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3588 TestGroupId("a")));
3589 EXPECT_EQ(0u,
3590 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393591 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033592
Matt Menkef09e64c2019-04-23 22:16:283593 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3594 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033595
Matt Menke9fa17d52019-03-25 19:12:263596 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3597 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3598 TestGroupId("a")));
3599 EXPECT_EQ(1u,
3600 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393601 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033602
3603 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523604 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203605 EXPECT_EQ(
3606 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283607 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3608 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503609 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3610 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033611
Matt Menke9fa17d52019-03-25 19:12:263612 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3613 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3614 TestGroupId("a")));
3615 EXPECT_EQ(0u,
3616 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393617 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033618
robpercival214763f2016-07-01 23:27:013619 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3620 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033621 handle1.Reset();
3622 handle2.Reset();
3623
Matt Menke9fa17d52019-03-25 19:12:263624 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3625 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3626 TestGroupId("a")));
3627 EXPECT_EQ(0u,
3628 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393629 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033630}
3631
3632TEST_F(ClientSocketPoolBaseTest,
3633 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3634 CreatePool(4, 4);
3635 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3636
3637 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523638 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203639 EXPECT_EQ(
3640 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283641 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3642 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503643 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3644 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033645
3646 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523647 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203648 EXPECT_EQ(
3649 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283650 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3651 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503652 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3653 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033654
3655 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523656 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203657 EXPECT_EQ(
3658 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283659 handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3660 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503661 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3662 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033663
Matt Menke9fa17d52019-03-25 19:12:263664 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3665 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3666 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3667 TestGroupId("a")));
3668 EXPECT_EQ(0u,
3669 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393670 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033671
Matt Menkef09e64c2019-04-23 22:16:283672 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3673 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033674
Matt Menke9fa17d52019-03-25 19:12:263675 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3676 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3677 TestGroupId("a")));
3678 EXPECT_EQ(0u,
3679 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393680 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033681
robpercival214763f2016-07-01 23:27:013682 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3683 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3684 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033685 handle1.Reset();
3686 handle2.Reset();
3687 handle3.Reset();
3688
Matt Menke9fa17d52019-03-25 19:12:263689 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3690 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3691 TestGroupId("a")));
3692 EXPECT_EQ(0u,
3693 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393694 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033695}
3696
3697TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3698 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3699 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3700
Matt Menke9fa17d52019-03-25 19:12:263701 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033702
Matt Menkef09e64c2019-04-23 22:16:283703 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3704 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033705
Matt Menke9fa17d52019-03-25 19:12:263706 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433707 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393708 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263709 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3710 EXPECT_EQ(
3711 kDefaultMaxSockets,
3712 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3713 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433714 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263715 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3716 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033717
Matt Menke9fa17d52019-03-25 19:12:263718 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033719
Matt Menkef09e64c2019-04-23 22:16:283720 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3721 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033722
Matt Menke9fa17d52019-03-25 19:12:263723 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033724}
3725
3726TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3727 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3728 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3729
Matt Menke9fa17d52019-03-25 19:12:263730 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033731
Matt Menkef09e64c2019-04-23 22:16:283732 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3733 kDefaultMaxSockets - 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033734
Matt Menke9fa17d52019-03-25 19:12:263735 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433736 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393737 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263738 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3739 EXPECT_EQ(
3740 kDefaultMaxSockets - 1,
3741 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3742 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433743 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263744 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3745 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483746 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033747
Matt Menke9fa17d52019-03-25 19:12:263748 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033749
Matt Menkef09e64c2019-04-23 22:16:283750 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3751 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033752
Matt Menke9fa17d52019-03-25 19:12:263753 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3754 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483755 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033756}
3757
3758TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3759 CreatePool(4, 4);
3760 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3761
3762 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523763 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203764 EXPECT_EQ(
3765 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283766 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3767 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503768 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3769 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013770 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033771 handle1.Reset();
3772
Matt Menke9fa17d52019-03-25 19:12:263773 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3774 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3775 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3776 TestGroupId("a")));
3777 EXPECT_EQ(0u,
3778 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393779 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033780
Matt Menkef09e64c2019-04-23 22:16:283781 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3782 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033783
Matt Menke9fa17d52019-03-25 19:12:263784 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3785 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3786 TestGroupId("a")));
3787 EXPECT_EQ(1u,
3788 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393789 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033790}
3791
3792TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3793 CreatePool(4, 4);
3794 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3795
3796 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523797 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203798 EXPECT_EQ(
3799 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283800 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3801 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503802 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3803 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013804 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033805
Matt Menke9fa17d52019-03-25 19:12:263806 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3807 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3808 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3809 TestGroupId("a")));
3810 EXPECT_EQ(0u,
3811 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393812 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263813 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033814
Matt Menkef09e64c2019-04-23 22:16:283815 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3816 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033817
Matt Menke9fa17d52019-03-25 19:12:263818 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3819 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3820 TestGroupId("a")));
3821 EXPECT_EQ(1u,
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}
3826
3827TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3828 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3829 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3830
Matt Menkef09e64c2019-04-23 22:16:283831 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3832 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033833
Matt Menke9fa17d52019-03-25 19:12:263834 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3835 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3836 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3837 TestGroupId("a")));
3838 EXPECT_EQ(0u,
3839 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433840 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393841 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033842
Matt Menkef09e64c2019-04-23 22:16:283843 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3844 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033845
Matt Menke9fa17d52019-03-25 19:12:263846 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3847 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3848 TestGroupId("b")));
3849 EXPECT_EQ(0u,
3850 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433851 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393852 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033853}
3854
[email protected]3c819f522010-12-02 02:03:123855TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3856 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3857 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3858
Matt Menkef09e64c2019-04-23 22:16:283859 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3860 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123861
Matt Menke9fa17d52019-03-25 19:12:263862 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523863
3864 connect_job_factory_->set_job_type(
3865 TestConnectJob::kMockAdditionalErrorStateJob);
Matt Menkef09e64c2019-04-23 22:16:283866 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3867 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523868
Matt Menke9fa17d52019-03-25 19:12:263869 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123870}
3871
[email protected]8159a1c2012-06-07 00:00:103872TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033873 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433874 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033875
Matt Menkef09e64c2019-04-23 22:16:283876 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3877 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033878
Matt Menke9fa17d52019-03-25 19:12:263879 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3880 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3881 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3882 TestGroupId("a")));
3883 EXPECT_EQ(2u,
3884 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3885 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393886 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033887
Matt Menkef09e64c2019-04-23 22:16:283888 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3889 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263890 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3891 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3892 TestGroupId("a")));
3893 EXPECT_EQ(2u,
3894 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3895 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393896 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033897
3898 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523899 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203900 EXPECT_EQ(
3901 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283902 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3903 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503904 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3905 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433906
3907 client_socket_factory_.SignalJob(0);
3908 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3909
Matt Menke9fa17d52019-03-25 19:12:263910 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3911 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3912 TestGroupId("a")));
3913 EXPECT_EQ(1u,
3914 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3915 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393916 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033917
3918 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523919 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433920 EXPECT_EQ(
3921 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283922 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3923 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503924 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3925 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433926 client_socket_factory_.SignalJob(0);
3927 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033928
Matt Menke9fa17d52019-03-25 19:12:263929 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3930 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3931 TestGroupId("a")));
3932 EXPECT_EQ(0u,
3933 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3934 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393935 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103936
[email protected]2c2bef152010-10-13 00:55:033937 handle1.Reset();
3938 handle2.Reset();
3939
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(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393946 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033947
Matt Menkef09e64c2019-04-23 22:16:283948 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3949 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263950 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3951 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3952 TestGroupId("a")));
3953 EXPECT_EQ(0u,
3954 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3955 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393956 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033957}
3958
3959TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3960 CreatePool(4, 4);
3961 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3962
Matt Menkef09e64c2019-04-23 22:16:283963 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3964 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033965
Matt Menke9fa17d52019-03-25 19:12:263966 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3967 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3968 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3969 TestGroupId("a")));
3970 EXPECT_EQ(1u,
3971 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393972 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033973
Matt Menkef09e64c2019-04-23 22:16:283974 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3975 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263976 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3977 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3978 TestGroupId("a")));
3979 EXPECT_EQ(2u,
3980 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393981 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033982
Matt Menkef09e64c2019-04-23 22:16:283983 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 3,
3984 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263985 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3986 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3987 TestGroupId("a")));
3988 EXPECT_EQ(3u,
3989 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393990 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033991
Matt Menkef09e64c2019-04-23 22:16:283992 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3993 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263994 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3995 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3996 TestGroupId("a")));
3997 EXPECT_EQ(3u,
3998 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393999 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034000}
4001
4002TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
4003 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434004 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:034005
Matt Menkef09e64c2019-04-23 22:16:284006 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4007 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:034008
Matt Menke9fa17d52019-03-25 19:12:264009 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4010 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4011 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4012 TestGroupId("a")));
4013 EXPECT_EQ(1u,
4014 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394015 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034016
4017 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524018 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204019 EXPECT_EQ(
4020 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284021 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4022 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504023 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4024 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034025
Matt Menke9fa17d52019-03-25 19:12:264026 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4027 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4028 TestGroupId("a")));
4029 EXPECT_EQ(0u,
4030 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394031 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034032
Lily Chenecebf932018-11-02 17:15:434033 client_socket_factory_.SignalJobs();
4034 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4035
Matt Menke9fa17d52019-03-25 19:12:264036 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4037 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4038 TestGroupId("a")));
4039 EXPECT_EQ(0u,
4040 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394041 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264042 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034043
[email protected]0dc88b32014-03-26 20:12:284044 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:484045 // starts, it has a connect start time.
4046 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:034047 handle1.Reset();
4048
Matt Menkec6b3edf72019-03-19 17:00:394049 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034050}
4051
[email protected]034df0f32013-01-07 23:17:484052// Checks that fully connected preconnect jobs have no connect times, and are
4053// marked as reused.
4054TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
4055 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4056 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkef09e64c2019-04-23 22:16:284057 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4058 NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:484059
Matt Menke9fa17d52019-03-25 19:12:264060 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4061 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4062 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4063 TestGroupId("a")));
4064 EXPECT_EQ(0u,
4065 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394066 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484067
4068 ClientSocketHandle handle;
4069 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394070 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:284071 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4072 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394073 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4074 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484075
4076 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394077 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484078
4079 TestLoadTimingInfoConnectedReused(handle);
4080 handle.Reset();
4081 TestLoadTimingInfoNotConnected(handle);
4082}
4083
[email protected]dcbe168a2010-12-02 03:14:464084// http://crbug.com/64940 regression test.
4085TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4086 const int kMaxTotalSockets = 3;
4087 const int kMaxSocketsPerGroup = 2;
4088 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434089 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464090
Matt Menkef6edce752019-03-19 17:21:564091 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464092 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4093
4094 // Set up one idle socket in "a".
4095 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524096 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204097 EXPECT_EQ(
4098 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284099 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4100 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504101 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4102 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264103 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4104 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4105 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4106 TestGroupId("a")));
4107 EXPECT_EQ(0u,
4108 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394109 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464110
Lily Chenecebf932018-11-02 17:15:434111 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014112 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264113 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4114 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4115 TestGroupId("a")));
4116 EXPECT_EQ(0u,
4117 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4118 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434119
[email protected]dcbe168a2010-12-02 03:14:464120 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394121 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464122
4123 // Set up two active sockets in "b".
4124 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524125 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204126 EXPECT_EQ(
4127 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284128 handle1.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
4129 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504130 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4131 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204132 EXPECT_EQ(
4133 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284134 handle2.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
4135 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504136 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4137 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464138
Matt Menke9fa17d52019-03-25 19:12:264139 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4140 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4141 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4142 TestGroupId("b")));
4143 EXPECT_EQ(0u,
4144 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394145 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434146
4147 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014148 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4149 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394150 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264151 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4152 TestGroupId("b")));
4153 EXPECT_EQ(0u,
4154 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4155 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464156
4157 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4158 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4159 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4160 // sockets for "a", and "b" should still have 2 active sockets.
4161
Matt Menkef09e64c2019-04-23 22:16:284162 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
4163 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264164 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4165 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4166 TestGroupId("a")));
4167 EXPECT_EQ(0u,
4168 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394169 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264170 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4171 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4172 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4173 TestGroupId("b")));
4174 EXPECT_EQ(0u,
4175 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394176 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264177 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464178
4179 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4180 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4181 // "a" should result in closing 1 for "b".
4182 handle1.Reset();
4183 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394184 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264185 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464186
Matt Menkef09e64c2019-04-23 22:16:284187 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
4188 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264189 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4190 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4191 TestGroupId("a")));
4192 EXPECT_EQ(1u,
4193 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394194 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264195 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4196 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4197 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4198 TestGroupId("b")));
4199 EXPECT_EQ(0u,
4200 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394201 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264202 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464203}
4204
[email protected]b7b8be42011-07-12 12:46:414205TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264206 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4207 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074208
4209 // Make the ConnectJob hang until it times out, shorten the timeout.
4210 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4211 connect_job_factory_->set_timeout_duration(
4212 base::TimeDelta::FromMilliseconds(500));
Matt Menkef09e64c2019-04-23 22:16:284213 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4214 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264215 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4216 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4217 TestGroupId("a")));
4218 EXPECT_EQ(1u,
4219 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394220 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074221
[email protected]b7b8be42011-07-12 12:46:414222 // Verify the backup timer doesn't create a backup job, by making
4223 // the backup job a pending job instead of a waiting job, so it
4224 // *would* complete if it were created.
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594225 base::RunLoop loop;
[email protected]a9fc8fc2011-05-10 02:41:074226 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454227 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Lukasz Krakowiak855292082020-06-19 12:43:584228 FROM_HERE, loop.QuitClosure(), base::TimeDelta::FromSeconds(1));
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594229 loop.Run();
Matt Menke9fa17d52019-03-25 19:12:264230 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074231}
4232
[email protected]b7b8be42011-07-12 12:46:414233TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264234 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4235 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074236
4237 // Make the ConnectJob hang forever.
4238 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Matt Menkef09e64c2019-04-23 22:16:284239 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4240 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264241 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4242 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4243 TestGroupId("a")));
4244 EXPECT_EQ(1u,
4245 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394246 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284247 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074248
4249 // Make the backup job be a pending job, so it completes normally.
4250 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4251 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524252 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504253 EXPECT_EQ(
4254 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284255 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4256 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4257 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4258 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414259 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264260 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4261 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4262 TestGroupId("a")));
4263 EXPECT_EQ(0u,
4264 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394265 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264266 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014267 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074268
4269 // The hung connect job should still be there, but everything else should be
4270 // complete.
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(1u,
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(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074278}
4279
[email protected]0dc88b32014-03-26 20:12:284280// Tests that a preconnect that starts out with unread data can still be used.
4281// http://crbug.com/334467
4282TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4283 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4284 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4285
Matt Menkef09e64c2019-04-23 22:16:284286 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4287 NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284288
Matt Menke9fa17d52019-03-25 19:12:264289 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4290 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4291 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4292 TestGroupId("a")));
4293 EXPECT_EQ(0u,
4294 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394295 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284296
4297 // Fail future jobs to be sure that handle receives the preconnected socket
4298 // rather than closing it and making a new one.
4299 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4300 ClientSocketHandle handle;
4301 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394302 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:284303 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4304 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394305 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4306 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284307
Matt Menke9fa17d52019-03-25 19:12:264308 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4309 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4310 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4311 TestGroupId("a")));
4312 EXPECT_EQ(0u,
4313 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394314 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264315 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284316
4317 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354318 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284319
4320 TestLoadTimingInfoConnectedReused(handle);
4321 handle.Reset();
4322
4323 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394324 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284325}
4326
Lily Chenecebf932018-11-02 17:15:434327TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4328 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4329 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4330
4331 ClientSocketHandle handle1;
4332 TestCompletionCallback callback1;
4333 EXPECT_EQ(
4334 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284335 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4336 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504337 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4338 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434339
Matt Menke9fa17d52019-03-25 19:12:264340 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4341 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4342 TestGroupId("a")));
4343 EXPECT_EQ(0u,
4344 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394345 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434346
Matt Menkec6b3edf72019-03-19 17:00:394347 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4348 &handle1));
Lily Chenecebf932018-11-02 17:15:434349}
4350
4351TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4352 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4353 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4354
4355 ClientSocketHandle handle1;
4356 TestCompletionCallback callback1;
4357 EXPECT_EQ(
4358 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284359 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4360 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504361 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4362 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434363
Matt Menke9fa17d52019-03-25 19:12:264364 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4365 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4366 TestGroupId("a")));
4367 EXPECT_EQ(0u,
4368 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394369 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434370
4371 ClientSocketHandle handle2;
4372 TestCompletionCallback callback2;
4373 EXPECT_EQ(
4374 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284375 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4376 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504377 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4378 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434379
Matt Menke9fa17d52019-03-25 19:12:264380 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4381 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4382 TestGroupId("a")));
4383 EXPECT_EQ(0u,
4384 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394385 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434386
Matt Menkec6b3edf72019-03-19 17:00:394387 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4388 &handle1));
4389 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4390 &handle2));
Lily Chenecebf932018-11-02 17:15:434391
4392 // One job completes. The other request should still have its job.
4393 client_socket_factory_.SignalJob(0);
4394 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4395
Matt Menke9fa17d52019-03-25 19:12:264396 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4397 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4398 TestGroupId("a")));
4399 EXPECT_EQ(0u,
4400 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4401 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394402 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434403
Matt Menkec6b3edf72019-03-19 17:00:394404 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4405 &handle2));
Lily Chenecebf932018-11-02 17:15:434406}
4407
4408TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4409 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4410 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4411
Matt Menkef09e64c2019-04-23 22:16:284412 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4413 NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434414
Matt Menke9fa17d52019-03-25 19:12:264415 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4416 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4417 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4418 TestGroupId("a")));
4419 EXPECT_EQ(1u,
4420 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394421 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434422
4423 ClientSocketHandle handle1;
4424 TestCompletionCallback callback1;
4425 EXPECT_EQ(
4426 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284427 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4428 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504429 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4430 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434431
Matt Menke9fa17d52019-03-25 19:12:264432 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4433 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4434 TestGroupId("a")));
4435 EXPECT_EQ(0u,
4436 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394437 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434438
Matt Menkec6b3edf72019-03-19 17:00:394439 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4440 &handle1));
Lily Chenecebf932018-11-02 17:15:434441}
4442
4443TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4444 CreatePool(kDefaultMaxSockets, 1);
4445 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4446
4447 ClientSocketHandle handle1;
4448 TestCompletionCallback callback1;
4449 EXPECT_EQ(
4450 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284451 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4452 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504453 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4454 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434455
Matt Menke9fa17d52019-03-25 19:12:264456 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4457 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4458 TestGroupId("a")));
4459 EXPECT_EQ(0u,
4460 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394461 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434462
Matt Menkec6b3edf72019-03-19 17:00:394463 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4464 &handle1));
Lily Chenecebf932018-11-02 17:15:434465
4466 // Insert a higher priority request
4467 ClientSocketHandle handle2;
4468 TestCompletionCallback callback2;
4469 EXPECT_EQ(
4470 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284471 handle2.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4472 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504473 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4474 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434475
Matt Menke9fa17d52019-03-25 19:12:264476 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4477 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4478 TestGroupId("a")));
4479 EXPECT_EQ(0u,
4480 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394481 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434482
4483 // The highest priority request should steal the job from the default priority
4484 // request.
Matt Menkec6b3edf72019-03-19 17:00:394485 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4486 &handle2));
4487 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4488 &handle1));
Lily Chenecebf932018-11-02 17:15:434489}
4490
4491TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4492 CreatePool(3, 3);
4493 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4494
4495 ClientSocketHandle handle_lowest;
4496 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284497 EXPECT_EQ(
4498 ERR_IO_PENDING,
4499 handle_lowest.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
4500 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4501 callback_lowest.callback(),
4502 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4503 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434504
Matt Menke9fa17d52019-03-25 19:12:264505 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4506 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4507 TestGroupId("a")));
4508 EXPECT_EQ(0u,
4509 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394510 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434511
4512 ClientSocketHandle handle_highest;
4513 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284514 EXPECT_EQ(
4515 ERR_IO_PENDING,
4516 handle_highest.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4517 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4518 callback_highest.callback(),
4519 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4520 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434521
Matt Menke9fa17d52019-03-25 19:12:264522 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4523 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4524 TestGroupId("a")));
4525 EXPECT_EQ(0u,
4526 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394527 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434528
4529 ClientSocketHandle handle_low;
4530 TestCompletionCallback callback_low;
4531 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284532 handle_low.Init(
4533 TestGroupId("a"), params_, base::nullopt, LOW, SocketTag(),
4534 ClientSocketPool::RespectLimits::ENABLED,
4535 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4536 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434537
Matt Menke9fa17d52019-03-25 19:12:264538 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4539 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4540 TestGroupId("a")));
4541 EXPECT_EQ(0u,
4542 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394543 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434544
4545 ClientSocketHandle handle_lowest2;
4546 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284547 EXPECT_EQ(
4548 ERR_IO_PENDING,
4549 handle_lowest2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
4550 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4551 callback_lowest2.callback(),
4552 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4553 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434554
Matt Menke9fa17d52019-03-25 19:12:264555 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4556 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4557 TestGroupId("a")));
4558 EXPECT_EQ(0u,
4559 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394560 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434561
4562 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394563 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4564 &handle_highest));
4565 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4566 &handle_low));
4567 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4568 &handle_lowest));
4569 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4570 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434571
4572 // Add another request with medium priority. It should steal the job from the
4573 // lowest priority request with a job.
4574 ClientSocketHandle handle_medium;
4575 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284576 EXPECT_EQ(
4577 ERR_IO_PENDING,
4578 handle_medium.Init(TestGroupId("a"), params_, base::nullopt, MEDIUM,
4579 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4580 callback_medium.callback(),
4581 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4582 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434583
Matt Menke9fa17d52019-03-25 19:12:264584 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4585 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4586 TestGroupId("a")));
4587 EXPECT_EQ(0u,
4588 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394589 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4590 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4591 &handle_highest));
4592 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4593 &handle_medium));
4594 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4595 &handle_low));
4596 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4597 &handle_lowest));
4598 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4599 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434600}
4601
4602TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4603 CreatePool(kDefaultMaxSockets, 1);
4604 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4605
4606 ClientSocketHandle handle1;
4607 TestCompletionCallback callback1;
4608 EXPECT_EQ(
4609 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284610 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4611 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504612 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4613 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434614
Matt Menke9fa17d52019-03-25 19:12:264615 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4616 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4617 TestGroupId("a")));
4618 EXPECT_EQ(0u,
4619 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394620 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434621
4622 ClientSocketHandle handle2;
4623 TestCompletionCallback callback2;
4624 EXPECT_EQ(
4625 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284626 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4627 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504628 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4629 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434630
Matt Menke9fa17d52019-03-25 19:12:264631 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4632 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4633 TestGroupId("a")));
4634 EXPECT_EQ(0u,
4635 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394636 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434637
4638 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394639 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4640 &handle1));
4641 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4642 &handle2));
Lily Chenecebf932018-11-02 17:15:434643
4644 // Reprioritizing the second request places it above the first, and it steals
4645 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394646 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4647 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4648 &handle2));
4649 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4650 &handle1));
Lily Chenecebf932018-11-02 17:15:434651}
4652
4653TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4654 CreatePool(kDefaultMaxSockets, 1);
4655 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4656
4657 ClientSocketHandle handle1;
4658 TestCompletionCallback callback1;
4659 EXPECT_EQ(
4660 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284661 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4662 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504663 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4664 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434665
Matt Menke9fa17d52019-03-25 19:12:264666 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4667 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4668 TestGroupId("a")));
4669 EXPECT_EQ(0u,
4670 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394671 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434672
Matt Menkec6b3edf72019-03-19 17:00:394673 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4674 &handle1));
Lily Chenecebf932018-11-02 17:15:434675
4676 ClientSocketHandle handle2;
4677 TestCompletionCallback callback2;
4678 EXPECT_EQ(
4679 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284680 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4681 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504682 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4683 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434684
Matt Menke9fa17d52019-03-25 19:12:264685 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4686 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4687 TestGroupId("a")));
4688 EXPECT_EQ(0u,
4689 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394690 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434691
4692 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394693 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4694 &handle1));
4695 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4696 &handle2));
Lily Chenecebf932018-11-02 17:15:434697
4698 // The second request should get a job upon cancelling the first request.
4699 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264700 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4701 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4702 TestGroupId("a")));
4703 EXPECT_EQ(0u,
4704 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394705 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434706
Matt Menkec6b3edf72019-03-19 17:00:394707 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4708 &handle2));
Lily Chenecebf932018-11-02 17:15:434709}
4710
4711TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4712 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4713 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4714
4715 ClientSocketHandle handle1;
4716 TestCompletionCallback callback1;
4717 EXPECT_EQ(
4718 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284719 handle1.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4720 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504721 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4722 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434723
Matt Menke9fa17d52019-03-25 19:12:264724 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4725 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4726 TestGroupId("a")));
4727 EXPECT_EQ(0u,
4728 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394729 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434730
4731 ClientSocketHandle handle2;
4732 TestCompletionCallback callback2;
4733 EXPECT_EQ(
4734 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284735 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4736 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504737 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4738 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434739
Matt Menke9fa17d52019-03-25 19:12:264740 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4741 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4742 TestGroupId("a")));
4743 EXPECT_EQ(0u,
4744 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394745 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434746
Matt Menkec6b3edf72019-03-19 17:00:394747 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4748 &handle1));
4749 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4750 &handle2));
Lily Chenecebf932018-11-02 17:15:434751
4752 // The lower-priority job completes first. The higher-priority request should
4753 // get the socket, and the lower-priority request should get the remaining
4754 // job.
4755 client_socket_factory_.SignalJob(1);
4756 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264757 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4758 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4759 TestGroupId("a")));
4760 EXPECT_EQ(0u,
4761 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4762 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394763 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434764 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394765 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4766 &handle2));
Lily Chenecebf932018-11-02 17:15:434767}
4768
[email protected]043b68c82013-08-22 23:41:524769class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204770 public:
Matt Menke9fa17d52019-03-25 19:12:264771 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394772 const ClientSocketPool::GroupId& group_id)
4773 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524774 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204775 }
4776
Daniel Cheng4496d0822018-04-26 21:52:154777 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204778
Matt Menke9fa17d52019-03-25 19:12:264779 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504780 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034781 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:284782 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
4783 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4784 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204785 }
4786
Matt Menke9fa17d52019-03-25 19:12:264787 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504788 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034789 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:284790 base::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504791 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4792 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204793 }
4794
4795 bool ReleaseOneConnection() {
4796 if (!handle_.is_initialized() || !can_release_connection_) {
4797 return false;
4798 }
4799 handle_.socket()->Disconnect();
4800 handle_.Reset();
4801 return true;
4802 }
4803
4804 void set_can_release_connection(bool can_release_connection) {
4805 can_release_connection_ = can_release_connection;
4806 }
4807
4808 MOCK_METHOD0(CloseOneIdleConnection, bool());
4809
4810 private:
Matt Menke9fa17d52019-03-25 19:12:264811 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204812 ClientSocketHandle handle_;
4813 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394814 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204815 bool can_release_connection_;
4816};
4817
[email protected]58e562f2013-04-22 17:32:204818// Tests the basic case of closing an idle socket in a higher layered pool when
4819// a new request is issued and the lower layer pool is stalled.
4820TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4821 CreatePool(1, 1);
4822 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4823
Matt Menkec6b3edf72019-03-19 17:00:394824 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014825 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204826 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4827 .WillOnce(Invoke(&mock_layered_pool,
4828 &MockLayeredPool::ReleaseOneConnection));
4829 ClientSocketHandle handle;
4830 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504831 EXPECT_EQ(
4832 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284833 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4834 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4835 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4836 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014837 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204838}
4839
Matt Menke833678642019-03-05 22:05:514840// Tests the case that trying to close an idle socket in a higher layered pool
4841// fails.
4842TEST_F(ClientSocketPoolBaseTest,
4843 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4844 CreatePool(1, 1);
4845 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4846
Matt Menkec6b3edf72019-03-19 17:00:394847 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514848 mock_layered_pool.set_can_release_connection(false);
4849 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4850 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4851 .WillOnce(Invoke(&mock_layered_pool,
4852 &MockLayeredPool::ReleaseOneConnection));
4853 ClientSocketHandle handle;
4854 TestCompletionCallback callback;
4855 EXPECT_EQ(
4856 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284857 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4858 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4859 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4860 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514861 base::RunLoop().RunUntilIdle();
4862 EXPECT_FALSE(callback.have_result());
4863}
4864
[email protected]58e562f2013-04-22 17:32:204865// Same as above, but the idle socket is in the same group as the stalled
4866// socket, and closes the only other request in its group when closing requests
4867// in higher layered pools. This generally shouldn't happen, but it may be
4868// possible if a higher level pool issues a request and the request is
4869// subsequently cancelled. Even if it's not possible, best not to crash.
4870TEST_F(ClientSocketPoolBaseTest,
4871 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4872 CreatePool(2, 2);
4873 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4874
4875 // Need a socket in another group for the pool to be stalled (If a group
4876 // has the maximum number of connections already, it's not stalled).
4877 ClientSocketHandle handle1;
4878 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284879 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4880 DEFAULT_PRIORITY, SocketTag(),
4881 ClientSocketPool::RespectLimits::ENABLED,
4882 callback1.callback(),
4883 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4884 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204885
Matt Menkec6b3edf72019-03-19 17:00:394886 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014887 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204888 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4889 .WillOnce(Invoke(&mock_layered_pool,
4890 &MockLayeredPool::ReleaseOneConnection));
4891 ClientSocketHandle handle;
4892 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284893 EXPECT_EQ(ERR_IO_PENDING,
4894 handle.Init(
4895 TestGroupId("group2"), params_, base::nullopt, DEFAULT_PRIORITY,
4896 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4897 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4898 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014899 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204900}
4901
4902// Tests the case when an idle socket can be closed when a new request is
4903// issued, and the new request belongs to a group that was previously stalled.
4904TEST_F(ClientSocketPoolBaseTest,
4905 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4906 CreatePool(2, 2);
4907 std::list<TestConnectJob::JobType> job_types;
4908 job_types.push_back(TestConnectJob::kMockJob);
4909 job_types.push_back(TestConnectJob::kMockJob);
4910 job_types.push_back(TestConnectJob::kMockJob);
4911 job_types.push_back(TestConnectJob::kMockJob);
4912 connect_job_factory_->set_job_types(&job_types);
4913
4914 ClientSocketHandle handle1;
4915 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284916 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4917 DEFAULT_PRIORITY, SocketTag(),
4918 ClientSocketPool::RespectLimits::ENABLED,
4919 callback1.callback(),
4920 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4921 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204922
Matt Menkec6b3edf72019-03-19 17:00:394923 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014924 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204925 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4926 .WillRepeatedly(Invoke(&mock_layered_pool,
4927 &MockLayeredPool::ReleaseOneConnection));
4928 mock_layered_pool.set_can_release_connection(false);
4929
4930 // The third request is made when the socket pool is in a stalled state.
4931 ClientSocketHandle handle3;
4932 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:284933 EXPECT_EQ(ERR_IO_PENDING,
4934 handle3.Init(
4935 TestGroupId("group3"), params_, base::nullopt, DEFAULT_PRIORITY,
4936 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4937 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4938 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204939
4940 base::RunLoop().RunUntilIdle();
4941 EXPECT_FALSE(callback3.have_result());
4942
4943 // The fourth request is made when the pool is no longer stalled. The third
4944 // request should be serviced first, since it was issued first and has the
4945 // same priority.
4946 mock_layered_pool.set_can_release_connection(true);
4947 ClientSocketHandle handle4;
4948 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:284949 EXPECT_EQ(ERR_IO_PENDING,
4950 handle4.Init(
4951 TestGroupId("group3"), params_, base::nullopt, DEFAULT_PRIORITY,
4952 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4953 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4954 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014955 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204956 EXPECT_FALSE(callback4.have_result());
4957
4958 // Closing a handle should free up another socket slot.
4959 handle1.Reset();
robpercival214763f2016-07-01 23:27:014960 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204961}
4962
4963// Tests the case when an idle socket can be closed when a new request is
4964// issued, and the new request belongs to a group that was previously stalled.
4965//
4966// The two differences from the above test are that the stalled requests are not
4967// in the same group as the layered pool's request, and the the fourth request
4968// has a higher priority than the third one, so gets a socket first.
4969TEST_F(ClientSocketPoolBaseTest,
4970 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4971 CreatePool(2, 2);
4972 std::list<TestConnectJob::JobType> job_types;
4973 job_types.push_back(TestConnectJob::kMockJob);
4974 job_types.push_back(TestConnectJob::kMockJob);
4975 job_types.push_back(TestConnectJob::kMockJob);
4976 job_types.push_back(TestConnectJob::kMockJob);
4977 connect_job_factory_->set_job_types(&job_types);
4978
4979 ClientSocketHandle handle1;
4980 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284981 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4982 DEFAULT_PRIORITY, SocketTag(),
4983 ClientSocketPool::RespectLimits::ENABLED,
4984 callback1.callback(),
4985 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4986 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204987
Matt Menkec6b3edf72019-03-19 17:00:394988 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014989 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204990 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4991 .WillRepeatedly(Invoke(&mock_layered_pool,
4992 &MockLayeredPool::ReleaseOneConnection));
4993 mock_layered_pool.set_can_release_connection(false);
4994
4995 // The third request is made when the socket pool is in a stalled state.
4996 ClientSocketHandle handle3;
4997 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204998 EXPECT_EQ(
4999 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285000 handle3.Init(TestGroupId("group3"), params_, base::nullopt, MEDIUM,
5001 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505002 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5003 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205004
5005 base::RunLoop().RunUntilIdle();
5006 EXPECT_FALSE(callback3.have_result());
5007
5008 // The fourth request is made when the pool is no longer stalled. This
5009 // request has a higher priority than the third request, so is serviced first.
5010 mock_layered_pool.set_can_release_connection(true);
5011 ClientSocketHandle handle4;
5012 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:205013 EXPECT_EQ(
5014 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285015 handle4.Init(TestGroupId("group3"), params_, base::nullopt, HIGHEST,
5016 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505017 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5018 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015019 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205020 EXPECT_FALSE(callback3.have_result());
5021
5022 // Closing a handle should free up another socket slot.
5023 handle1.Reset();
robpercival214763f2016-07-01 23:27:015024 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205025}
5026
5027TEST_F(ClientSocketPoolBaseTest,
5028 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
5029 CreatePool(1, 1);
5030 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5031
Matt Menkec6b3edf72019-03-19 17:00:395032 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:015033 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205034 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
5035 .WillRepeatedly(Invoke(&mock_layered_pool1,
5036 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:395037 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:015038 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
5039 IsOk());
[email protected]58e562f2013-04-22 17:32:205040 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
5041 .WillRepeatedly(Invoke(&mock_layered_pool2,
5042 &MockLayeredPool::ReleaseOneConnection));
5043 ClientSocketHandle handle;
5044 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:505045 EXPECT_EQ(
5046 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285047 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
5048 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5049 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5050 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015051 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205052}
5053
[email protected]b021ece62013-06-11 11:06:335054// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:155055// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
5056// socket instead of a request with the same priority that was issued earlier,
5057// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:335058TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:335059 CreatePool(1, 1);
5060
5061 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395062 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5063 TestGroupId("a"), MAXIMUM_PRIORITY,
5064 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265065 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335066
5067 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5068
mmenked3641e12016-01-28 16:06:155069 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395070 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155071 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265072 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335073
mmenked3641e12016-01-28 16:06:155074 // Issue a request that ignores the limits, so a new ConnectJob is
5075 // created.
5076 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395077 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155078 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265079 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335080
robpercival214763f2016-07-01 23:27:015081 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335082 EXPECT_FALSE(request(1)->have_result());
5083}
5084
[email protected]c55fabd2013-11-04 23:26:565085// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155086// issued for a request with RespectLimits::DISABLED is not cancelled when a
5087// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565088TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565089 CreatePool(1, 1);
5090
5091 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395092 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5093 TestGroupId("a"), MAXIMUM_PRIORITY,
5094 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265095 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565096
5097 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5098
mmenked3641e12016-01-28 16:06:155099 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395100 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155101 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265102 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565103
mmenked3641e12016-01-28 16:06:155104 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5105 // created.
5106 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395107 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155108 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265109 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335110
mmenked3641e12016-01-28 16:06:155111 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335112 // should not be cancelled.
5113 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265114 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335115
robpercival214763f2016-07-01 23:27:015116 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335117 EXPECT_FALSE(request(1)->have_result());
5118}
5119
Matt Menkeb57663b32019-03-01 17:17:105120TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5121 CreatePool(1, 1);
5122
5123 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5124
5125 ClientSocketHandle handle;
5126 TestCompletionCallback callback;
5127 EXPECT_EQ(
5128 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285129 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
5130 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5131 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5132 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105133
Matt Menke9fa17d52019-03-25 19:12:265134 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105135
5136 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5137 EXPECT_FALSE(handle.is_initialized());
5138 EXPECT_FALSE(handle.socket());
5139
5140 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265141 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105142}
5143
5144class TestAuthHelper {
5145 public:
5146 TestAuthHelper() = default;
5147 ~TestAuthHelper() = default;
5148
Matt Menkec6b3edf72019-03-19 17:00:395149 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195150 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265151 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395152 RequestPriority priority = DEFAULT_PRIORITY,
5153 ClientSocketPool::RespectLimits respect_limits =
5154 ClientSocketPool::RespectLimits::ENABLED,
5155 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105156 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285157 handle_.Init(group_id_in, params, base::nullopt, priority,
5158 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105159 base::BindRepeating(&TestAuthHelper::AuthCallback,
5160 base::Unretained(this)),
5161 pool, NetLogWithSource()));
5162 }
5163
5164 void WaitForAuth() {
5165 run_loop_ = std::make_unique<base::RunLoop>();
5166 run_loop_->Run();
5167 run_loop_.reset();
5168 }
5169
5170 void WaitForAuthAndRestartSync() {
5171 restart_sync_ = true;
5172 WaitForAuth();
5173 restart_sync_ = false;
5174 }
5175
5176 void WaitForAuthAndResetHandleSync() {
5177 reset_handle_sync_ = true;
5178 WaitForAuth();
5179 reset_handle_sync_ = false;
5180 }
5181
5182 void RestartWithAuth() {
5183 DCHECK(restart_with_auth_callback_);
5184 std::move(restart_with_auth_callback_).Run();
5185 }
5186
5187 int WaitForResult() {
5188 int result = callback_.WaitForResult();
5189 // There shouldn't be any callback waiting to be invoked once the request is
5190 // complete.
5191 EXPECT_FALSE(restart_with_auth_callback_);
5192 // The socket should only be initialized on success.
5193 EXPECT_EQ(result == OK, handle_.is_initialized());
5194 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5195 return result;
5196 }
5197
5198 ClientSocketHandle* handle() { return &handle_; }
5199 int auth_count() const { return auth_count_; }
5200 int have_result() const { return callback_.have_result(); }
5201
5202 private:
5203 void AuthCallback(const HttpResponseInfo& response,
5204 HttpAuthController* auth_controller,
5205 base::OnceClosure restart_with_auth_callback) {
5206 EXPECT_FALSE(restart_with_auth_callback_);
5207 EXPECT_TRUE(restart_with_auth_callback);
5208
5209 // Once there's a result, this method shouldn't be invoked again.
5210 EXPECT_FALSE(callback_.have_result());
5211
5212 ++auth_count_;
5213 run_loop_->Quit();
5214 if (restart_sync_) {
5215 std::move(restart_with_auth_callback).Run();
5216 return;
5217 }
5218
5219 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5220
5221 if (reset_handle_sync_) {
5222 handle_.Reset();
5223 return;
5224 }
5225 }
5226
5227 std::unique_ptr<base::RunLoop> run_loop_;
5228 base::OnceClosure restart_with_auth_callback_;
5229
5230 bool restart_sync_ = false;
5231 bool reset_handle_sync_ = false;
5232
5233 ClientSocketHandle handle_;
5234 int auth_count_ = 0;
5235 TestCompletionCallback callback_;
5236
5237 DISALLOW_COPY_AND_ASSIGN(TestAuthHelper);
5238};
5239
5240TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5241 CreatePool(1, 1);
5242 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5243
5244 TestAuthHelper auth_helper;
5245 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265246 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015247 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395248 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105249
5250 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265251 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015252 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395253 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105254
5255 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265256 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015257 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395258 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105259
5260 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5261 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265262 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5263 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395264 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105265 EXPECT_EQ(0, pool_->IdleSocketCount());
5266}
5267
5268TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5269 CreatePool(1, 1);
5270 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5271
5272 TestAuthHelper auth_helper;
5273 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265274 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015275 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395276 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105277
5278 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265279 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015280 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395281 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105282
5283 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5284 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265285 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5286 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395287 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105288 EXPECT_EQ(0, pool_->IdleSocketCount());
5289}
5290
5291TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5292 CreatePool(1, 1);
5293 connect_job_factory_->set_job_type(
5294 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5295
5296 TestAuthHelper auth_helper;
5297 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265298 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105299
5300 auth_helper.WaitForAuth();
5301 auth_helper.RestartWithAuth();
5302 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5303
5304 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265305 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105306 EXPECT_EQ(0, pool_->IdleSocketCount());
5307}
5308
5309TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5310 CreatePool(1, 1);
5311 connect_job_factory_->set_job_type(
5312 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5313
5314 TestAuthHelper auth_helper;
5315 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265316 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105317
5318 auth_helper.WaitForAuthAndRestartSync();
5319 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5320
5321 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265322 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105323 EXPECT_EQ(0, pool_->IdleSocketCount());
5324}
5325
5326TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5327 CreatePool(1, 1);
5328 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5329
5330 TestAuthHelper auth_helper;
5331 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265332 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105333
5334 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265335 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105336
5337 auth_helper.handle()->Reset();
5338
5339 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265340 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105341 EXPECT_EQ(0, pool_->IdleSocketCount());
5342 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5343 EXPECT_FALSE(auth_helper.handle()->socket());
5344}
5345
5346TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5347 CreatePool(1, 1);
5348 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5349
5350 TestAuthHelper auth_helper;
5351 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265352 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105353
5354 auth_helper.WaitForAuthAndResetHandleSync();
5355 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265356 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105357 EXPECT_EQ(0, pool_->IdleSocketCount());
5358 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5359 EXPECT_FALSE(auth_helper.handle()->socket());
5360}
5361
5362TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5363 CreatePool(1, 1);
5364 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5365
5366 TestAuthHelper auth_helper;
5367 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265368 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105369
5370 auth_helper.WaitForAuth();
5371
Matt Menke433de6d2020-03-04 00:24:115372 pool_->FlushWithError(ERR_FAILED, "Network changed");
Matt Menkeb57663b32019-03-01 17:17:105373 base::RunLoop().RunUntilIdle();
5374
5375 // When flushing the socket pool, bound sockets should delay returning the
5376 // error until completion.
5377 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265378 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105379 EXPECT_EQ(0, pool_->IdleSocketCount());
5380
5381 auth_helper.RestartWithAuth();
5382 // The callback should be called asynchronously.
5383 EXPECT_FALSE(auth_helper.have_result());
5384
5385 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265386 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105387 EXPECT_EQ(0, pool_->IdleSocketCount());
5388}
5389
5390TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5391 CreatePool(1, 1);
5392 connect_job_factory_->set_job_type(
5393 TestConnectJob::kMockAuthChallengeTwiceJob);
5394
5395 TestAuthHelper auth_helper;
5396 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265397 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015398 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395399 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105400
5401 auth_helper.WaitForAuth();
5402 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265403 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105404 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015405 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395406 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105407
5408 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265409 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015410 EXPECT_EQ(2, auth_helper.auth_count());
5411 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395412 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015413
Matt Menkeb57663b32019-03-01 17:17:105414 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265415 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105416 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015417 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395418 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105419
5420 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5421 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265422 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5423 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395424 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105425 EXPECT_EQ(0, pool_->IdleSocketCount());
5426}
5427
5428TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5429 CreatePool(1, 1);
5430 connect_job_factory_->set_job_type(
5431 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5432
5433 TestAuthHelper auth_helper;
5434 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265435 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105436
5437 auth_helper.WaitForAuth();
5438 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265439 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105440 EXPECT_EQ(1, auth_helper.auth_count());
5441
5442 auth_helper.WaitForAuth();
5443 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265444 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105445 EXPECT_EQ(2, auth_helper.auth_count());
5446
5447 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5448 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265449 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105450 EXPECT_EQ(0, pool_->IdleSocketCount());
5451}
5452
5453// Makes sure that when a bound request is destroyed, a new ConnectJob is
5454// created, if needed.
5455TEST_F(ClientSocketPoolBaseTest,
5456 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5457 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5458 connect_job_factory_->set_job_type(
5459 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5460
5461 // First request creates a ConnectJob.
5462 TestAuthHelper auth_helper1;
5463 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265464 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105465
5466 // A second request come in, but no new ConnectJob is needed, since the limit
5467 // has been reached.
5468 TestAuthHelper auth_helper2;
5469 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265470 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105471
5472 // Run until the auth callback for the first request is invoked.
5473 auth_helper1.WaitForAuth();
5474 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265475 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5476 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395477 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105478
5479 // Make connect jobs succeed, then cancel the first request, which should
5480 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5481 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5482 auth_helper1.handle()->Reset();
5483 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265484 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105485
5486 // The second ConnectJob should succeed.
5487 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5488 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265489 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105490}
5491
5492// Makes sure that when a bound request is destroyed, a new ConnectJob is
5493// created for another group, if needed.
5494TEST_F(ClientSocketPoolBaseTest,
5495 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5496 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5497 connect_job_factory_->set_job_type(
5498 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5499
5500 // First request creates a ConnectJob.
5501 TestAuthHelper auth_helper1;
5502 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265503 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105504
5505 // A second request come in, but no new ConnectJob is needed, since the limit
5506 // has been reached.
5507 TestAuthHelper auth_helper2;
5508 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395509 ClientSocketPool::RespectLimits::ENABLED,
5510 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265511 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5512 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105513
5514 // Run until the auth callback for the first request is invoked.
5515 auth_helper1.WaitForAuth();
5516 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265517 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5518 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395519 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265520 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5521 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395522 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105523
5524 // Make connect jobs succeed, then cancel the first request, which should
5525 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5526 // other group.
5527 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5528 auth_helper1.handle()->Reset();
5529 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265530 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5531 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105532
5533 // The second ConnectJob should succeed.
5534 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5535 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265536 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5537 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105538}
5539
5540// Test that once an auth challenge is bound, that's the request that gets all
5541// subsequent calls and the socket itself.
5542TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5543 CreatePool(1, 1);
5544 connect_job_factory_->set_job_type(
5545 TestConnectJob::kMockAuthChallengeTwiceJob);
5546
5547 // First request creates a ConnectJob.
5548 TestAuthHelper auth_helper1;
5549 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265550 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105551
5552 // A second, higher priority request is made.
5553 TestAuthHelper auth_helper2;
5554 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265555 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105556
5557 // Run until the auth callback for the second request is invoked.
5558 auth_helper2.WaitForAuth();
5559 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265560 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5561 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395562 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105563
5564 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5565 // ConnectJob.
5566 TestAuthHelper auth_helper3;
5567 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265568 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105569
5570 // Start a higher job that ignores limits, creating a hanging socket. It
5571 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5572 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5573 TestAuthHelper auth_helper4;
5574 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5575 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265576 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105577
5578 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5579 // again.
5580 auth_helper2.RestartWithAuth();
5581 auth_helper2.WaitForAuth();
5582 EXPECT_EQ(0, auth_helper1.auth_count());
5583 EXPECT_FALSE(auth_helper1.have_result());
5584 EXPECT_EQ(2, auth_helper2.auth_count());
5585 EXPECT_FALSE(auth_helper2.have_result());
5586 EXPECT_EQ(0, auth_helper3.auth_count());
5587 EXPECT_FALSE(auth_helper3.have_result());
5588 EXPECT_EQ(0, auth_helper4.auth_count());
5589 EXPECT_FALSE(auth_helper4.have_result());
5590
5591 // Advance auth again, and |auth_helper2| should get the socket.
5592 auth_helper2.RestartWithAuth();
5593 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5594 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5595 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265596 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5597 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105598 EXPECT_EQ(0, auth_helper1.auth_count());
5599 EXPECT_FALSE(auth_helper1.have_result());
5600 EXPECT_EQ(0, auth_helper3.auth_count());
5601 EXPECT_FALSE(auth_helper3.have_result());
5602 EXPECT_EQ(0, auth_helper4.auth_count());
5603 EXPECT_FALSE(auth_helper4.have_result());
5604
5605 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5606 // socket request should be able to claim it.
5607 auth_helper2.handle()->Reset();
5608 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5609 EXPECT_EQ(0, auth_helper1.auth_count());
5610 EXPECT_FALSE(auth_helper1.have_result());
5611 EXPECT_EQ(0, auth_helper3.auth_count());
5612 EXPECT_FALSE(auth_helper3.have_result());
5613 EXPECT_EQ(0, auth_helper4.auth_count());
5614}
5615
David Benjaminbac8dff2019-08-07 01:30:415616enum class RefreshType {
5617 kServer,
5618 kProxy,
5619};
5620
5621// Common base class to test RefreshGroup() when called from either
5622// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5623//
5624// Tests which test behavior specific to one or the other case should use
5625// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5626// when the pool's proxy matches.
5627class ClientSocketPoolBaseRefreshTest
5628 : public ClientSocketPoolBaseTest,
5629 public testing::WithParamInterface<RefreshType> {
5630 public:
5631 void CreatePoolForRefresh(int max_sockets,
5632 int max_sockets_per_group,
5633 bool enable_backup_connect_jobs = false) {
5634 switch (GetParam()) {
5635 case RefreshType::kServer:
5636 CreatePool(max_sockets, max_sockets_per_group,
5637 enable_backup_connect_jobs);
5638 break;
5639 case RefreshType::kProxy:
5640 CreatePoolWithIdleTimeouts(
5641 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5642 ClientSocketPool::used_idle_socket_timeout(),
5643 enable_backup_connect_jobs,
5644 ProxyServer::FromPacString("HTTPS myproxy:70"));
5645 break;
5646 }
5647 }
5648
5649 static ClientSocketPool::GroupId GetGroupId() {
5650 return TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5651 }
5652
David Benjamin6dd7e882019-10-10 02:35:235653 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5654 // Note this GroupId will match GetGroupId() unless
5655 // kPartitionConnectionsByNetworkIsolationKey is enabled.
5656 const auto kOrigin = url::Origin::Create(GURL("https://b/"));
5657 const NetworkIsolationKey kNetworkIsolationKey(kOrigin, kOrigin);
5658 return TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5659 PrivacyMode::PRIVACY_MODE_DISABLED,
5660 kNetworkIsolationKey);
5661 }
5662
David Benjaminbac8dff2019-08-07 01:30:415663 void OnSSLConfigForServerChanged() {
5664 switch (GetParam()) {
5665 case RefreshType::kServer:
5666 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5667 break;
5668 case RefreshType::kProxy:
5669 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5670 break;
5671 }
5672 }
5673};
5674
5675INSTANTIATE_TEST_SUITE_P(RefreshType,
5676 ClientSocketPoolBaseRefreshTest,
5677 ::testing::Values(RefreshType::kServer,
5678 RefreshType::kProxy));
5679
5680TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5681 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5682 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245683
5684 // First job will be waiting until it gets aborted.
5685 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5686
5687 ClientSocketHandle handle;
5688 TestCompletionCallback callback;
5689 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285690 handle.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5691 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5692 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5693 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245694 IsError(ERR_IO_PENDING));
5695
5696 // Switch connect job types, so creating a new ConnectJob will result in
5697 // success.
5698 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5699
David Benjaminbac8dff2019-08-07 01:30:415700 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245701 EXPECT_EQ(OK, callback.WaitForResult());
5702 ASSERT_TRUE(handle.socket());
5703 EXPECT_EQ(0, pool_->IdleSocketCount());
5704 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5705 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5706 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5707 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5708}
5709
David Benjaminbac8dff2019-08-07 01:30:415710TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235711 base::test::ScopedFeatureList feature_list;
5712 feature_list.InitAndEnableFeature(
5713 features::kPartitionConnectionsByNetworkIsolationKey);
5714
David Benjaminbac8dff2019-08-07 01:30:415715 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5716 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235717 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245718
Matt Menkef09e64c2019-04-23 22:16:285719 pool_->RequestSockets(kGroupId, params_, base::nullopt, 2,
5720 NetLogWithSource());
David Benjamin6dd7e882019-10-10 02:35:235721 pool_->RequestSockets(kGroupIdInPartition, params_, base::nullopt, 2,
5722 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245723 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235724 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5725 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245726 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235727 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245728
David Benjaminbac8dff2019-08-07 01:30:415729 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245730 EXPECT_EQ(0, pool_->IdleSocketCount());
5731 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235732 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245733}
5734
5735TEST_F(ClientSocketPoolBaseTest,
5736 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5737 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415738 const ClientSocketPool::GroupId kGroupId =
5739 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5740 const ClientSocketPool::GroupId kOtherGroupId =
5741 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
Matt Menkebf3c767d2019-04-15 23:28:245742
Matt Menkef09e64c2019-04-23 22:16:285743 pool_->RequestSockets(kOtherGroupId, params_, base::nullopt, 2,
5744 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245745 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5746 EXPECT_EQ(2, pool_->IdleSocketCount());
5747 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5748
David Benjaminbac8dff2019-08-07 01:30:415749 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245750 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5751 EXPECT_EQ(2, pool_->IdleSocketCount());
5752 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5753}
5754
David Benjaminbac8dff2019-08-07 01:30:415755TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5756 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5757 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245758
5759 ClientSocketHandle handle;
5760 TestCompletionCallback callback;
5761 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285762 handle.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5763 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5764 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5765 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245766 IsOk());
5767 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5768 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5769
David Benjaminbac8dff2019-08-07 01:30:415770 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245771
5772 handle.Reset();
5773 EXPECT_EQ(0, pool_->IdleSocketCount());
5774 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5775}
5776
5777TEST_F(ClientSocketPoolBaseTest,
5778 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5779 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415780 const ClientSocketPool::GroupId kGroupId =
5781 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5782 const ClientSocketPool::GroupId kOtherGroupId =
5783 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
Matt Menkebf3c767d2019-04-15 23:28:245784
5785 ClientSocketHandle handle;
5786 TestCompletionCallback callback;
5787 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285788 handle.Init(kOtherGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5789 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5790 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5791 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245792 IsOk());
5793 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5794 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5795
David Benjaminbac8dff2019-08-07 01:30:415796 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245797
5798 handle.Reset();
5799 EXPECT_EQ(1, pool_->IdleSocketCount());
5800 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5801 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5802}
5803
David Benjaminbac8dff2019-08-07 01:30:415804TEST_P(ClientSocketPoolBaseRefreshTest,
5805 RefreshGroupReplacesBoundConnectJobOnConnect) {
5806 CreatePoolForRefresh(1, 1);
5807 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245808 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5809
5810 TestAuthHelper auth_helper;
5811 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5812 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5813 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5814
5815 auth_helper.WaitForAuth();
5816
5817 // This should update the generation, but not cancel the old ConnectJob - it's
5818 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415819 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245820
5821 // Providing auth credentials and restarting the request with them will cause
5822 // the ConnectJob to complete successfully, but the result will be discarded
5823 // because of the generation mismatch.
5824 auth_helper.RestartWithAuth();
5825
5826 // Despite using ConnectJobs that simulate a single challenge, a second
5827 // challenge will be seen, due to using a new ConnectJob.
5828 auth_helper.WaitForAuth();
5829 auth_helper.RestartWithAuth();
5830
5831 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5832 EXPECT_TRUE(auth_helper.handle()->socket());
5833 EXPECT_EQ(2, auth_helper.auth_count());
5834
5835 // When released, the socket will be returned to the socket pool, and
5836 // available for reuse.
5837 auth_helper.handle()->Reset();
5838 EXPECT_EQ(1, pool_->IdleSocketCount());
5839 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5840 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5841}
5842
David Benjaminbac8dff2019-08-07 01:30:415843TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5844 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5845 kUnusedIdleSocketTimeout,
5846 ClientSocketPool::used_idle_socket_timeout(),
5847 false /* no backup connect jobs */,
5848 ProxyServer::FromPacString("HTTPS myproxy:70"));
5849
5850 const ClientSocketPool::GroupId kGroupId1 =
5851 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5852 const ClientSocketPool::GroupId kGroupId2 =
5853 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
5854 const ClientSocketPool::GroupId kGroupId3 =
5855 TestGroupId("c", 443, ClientSocketPool::SocketType::kSsl);
5856
5857 // Make three sockets in three different groups. The third socket is released
5858 // to the pool as idle.
5859 ClientSocketHandle handle1, handle2, handle3;
5860 TestCompletionCallback callback;
5861 EXPECT_THAT(
5862 handle1.Init(kGroupId1, params_, base::nullopt, DEFAULT_PRIORITY,
5863 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5864 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5865 pool_.get(), NetLogWithSource()),
5866 IsOk());
5867 EXPECT_THAT(
5868 handle2.Init(kGroupId2, params_, base::nullopt, DEFAULT_PRIORITY,
5869 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5870 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5871 pool_.get(), NetLogWithSource()),
5872 IsOk());
5873 EXPECT_THAT(
5874 handle3.Init(kGroupId3, params_, base::nullopt, DEFAULT_PRIORITY,
5875 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5876 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5877 pool_.get(), NetLogWithSource()),
5878 IsOk());
5879 handle3.Reset();
5880 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5881 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5882 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5883 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5884 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5885 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5886
5887 // Changes to some other proxy do not affect the pool. The idle socket remains
5888 // alive and closing |handle2| makes the socket available for the pool.
5889 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5890
5891 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5892 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5893 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5894 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5895 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5896 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5897
5898 handle2.Reset();
5899 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5900 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5901
5902 // Changes to the matching proxy refreshes all groups.
5903 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5904
5905 // Idle sockets are closed.
5906 EXPECT_EQ(0, pool_->IdleSocketCount());
5907 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
5908 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
5909
5910 // The active socket, however, continues to be active.
5911 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5912 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5913
5914 // Closing it does not make it available for the pool.
5915 handle1.Reset();
5916 EXPECT_EQ(0, pool_->IdleSocketCount());
5917 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
5918}
5919
5920TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
5921 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5922
5923 const ClientSocketPool::GroupId kGroupId =
5924 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5925 PrivacyMode::PRIVACY_MODE_DISABLED);
5926 const ClientSocketPool::GroupId kGroupIdPrivacy =
5927 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5928 PrivacyMode::PRIVACY_MODE_ENABLED);
5929 const ClientSocketPool::GroupId kOtherGroupId =
5930 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
5931
5932 // Make a socket in each groups.
5933 ClientSocketHandle handle1, handle2, handle3;
5934 TestCompletionCallback callback;
5935 EXPECT_THAT(
5936 handle1.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5937 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5938 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5939 pool_.get(), NetLogWithSource()),
5940 IsOk());
5941 EXPECT_THAT(
5942 handle2.Init(kGroupIdPrivacy, params_, base::nullopt, DEFAULT_PRIORITY,
5943 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5944 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5945 pool_.get(), NetLogWithSource()),
5946 IsOk());
5947 EXPECT_THAT(
5948 handle3.Init(kOtherGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5949 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5950 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5951 pool_.get(), NetLogWithSource()),
5952 IsOk());
5953 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5954 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5955 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5956 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5957 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5958 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5959
5960 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5961
5962 // Active sockets continue to be active.
5963 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5964 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5965 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5966 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5967 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5968 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5969
5970 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
5971 // are unusable.
5972 handle1.Reset();
5973 handle2.Reset();
5974 handle3.Reset();
5975 EXPECT_EQ(1, pool_->IdleSocketCount());
5976 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5977 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5978 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5979 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5980}
5981
[email protected]f6d1d6eb2009-06-24 20:16:095982} // namespace
5983
5984} // namespace net