blob: 1fb16fb8b7d9e508fa714af2c022192c5776371b [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"
Matt Menke4807a9a2020-11-21 00:14:4137#include "net/base/schemeful_site.h"
[email protected]f6d1d6eb2009-06-24 20:16:0938#include "net/base/test_completion_callback.h"
dalykedd30d982019-12-16 15:31:1039#include "net/dns/public/resolve_error_info.h"
Ben Schwartz3ff4dc1e62021-04-27 21:15:2340#include "net/dns/public/secure_dns_policy.h"
[email protected]277d5942010-08-11 21:02:3541#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5142#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0743#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0044#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1945#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0046#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5647#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4648#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0949#include "net/socket/client_socket_factory.h"
50#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2651#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2852#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5453#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1754#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4455#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1056#include "net/socket/stream_socket.h"
Matt Menke9fa17d52019-03-25 19:12:2657#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5158#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0159#include "net/test/gtest_util.h"
Gabriel Charettec7108742019-08-23 03:31:4060#include "net/test/test_with_task_environment.h"
Matt Menkef09e64c2019-04-23 22:16:2861#include "net/traffic_annotation/network_traffic_annotation.h"
Ramin Halavati0a08cc82018-02-06 07:46:3862#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4863#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0964#include "testing/gtest/include/gtest/gtest.h"
65
robpercival214763f2016-07-01 23:27:0166using net::test::IsError;
67using net::test::IsOk;
68
[email protected]51fdc7c2012-04-10 19:19:4869using ::testing::Invoke;
70using ::testing::Return;
71
[email protected]f6d1d6eb2009-06-24 20:16:0972namespace net {
73
74namespace {
75
[email protected]211d21722009-07-22 15:48:5376const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2077const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5978constexpr base::TimeDelta kUnusedIdleSocketTimeout =
79 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0180
Matt Menkebdf777802019-04-22 19:38:5981ClientSocketPool::GroupId TestGroupId(
82 const std::string& host,
83 int port = 80,
84 ClientSocketPool::SocketType socket_type =
85 ClientSocketPool::SocketType::kHttp,
Matt Menke166443c2019-05-24 18:45:5986 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED,
87 NetworkIsolationKey network_isolation_key = NetworkIsolationKey()) {
Matt Menkec6b3edf72019-03-19 17:00:3988 return ClientSocketPool::GroupId(HostPortPair(host, port), socket_type,
dalyk5f48a132019-10-14 15:20:1989 privacy_mode, network_isolation_key,
Ben Schwartz3ff4dc1e62021-04-27 21:15:2390 SecureDnsPolicy::kAllow);
Matt Menkec6b3edf72019-03-19 17:00:3991}
92
[email protected]034df0f32013-01-07 23:17:4893// Make sure |handle| sets load times correctly when it has been assigned a
94// reused socket.
95void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
96 LoadTimingInfo load_timing_info;
97 // Only pass true in as |is_reused|, as in general, HttpStream types should
98 // have stricter concepts of reuse than socket pools.
99 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
100
101 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19102 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48103
[email protected]b258e0792013-01-12 07:11:59104 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
105 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48106}
107
108// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33109// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48110// of a connection where |is_reused| is false may consider the connection
111// reused.
112void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
113 EXPECT_FALSE(handle.is_reused());
114
115 LoadTimingInfo load_timing_info;
116 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
117
118 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19119 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48120
[email protected]b258e0792013-01-12 07:11:59121 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
122 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
123 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48124
125 TestLoadTimingInfoConnectedReused(handle);
126}
127
128// Make sure |handle| sets load times correctly, in the case that it does not
129// currently have a socket.
130void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
131 // Should only be set to true once a socket is assigned, if at all.
132 EXPECT_FALSE(handle.is_reused());
133
134 LoadTimingInfo load_timing_info;
135 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
136
137 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19138 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48139
[email protected]b258e0792013-01-12 07:11:59140 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
141 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48142}
143
[email protected]3268023f2011-05-05 00:08:10144class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09145 public:
[email protected]034df0f32013-01-07 23:17:48146 explicit MockClientSocket(net::NetLog* net_log)
147 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28148 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20149 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30150 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09151
[email protected]0dc88b32014-03-26 20:12:28152 // Sets whether the socket has unread data. If true, the next call to Read()
153 // will return 1 byte and IsConnectedAndIdle() will return false.
154 void set_has_unread_data(bool has_unread_data) {
155 has_unread_data_ = has_unread_data;
156 }
157
[email protected]3f55aa12011-12-07 02:03:33158 // Socket implementation.
dchengb03027d2014-10-21 12:00:20159 int Read(IOBuffer* /* buf */,
160 int len,
Brad Lassey3a814172018-04-26 03:30:21161 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28162 if (has_unread_data_ && len > 0) {
163 has_unread_data_ = false;
164 was_used_to_convey_data_ = true;
165 return 1;
166 }
[email protected]e86df8dc2013-03-30 13:18:28167 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33168 }
[email protected]ab838892009-06-30 18:49:05169
[email protected]a2b2cfc2017-12-06 09:06:08170 int Write(
171 IOBuffer* /* buf */,
172 int len,
Brad Lassey3a814172018-04-26 03:30:21173 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08174 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01175 was_used_to_convey_data_ = true;
176 return len;
[email protected]ab838892009-06-30 18:49:05177 }
Avi Drissman13fc8932015-12-20 04:40:46178 int SetReceiveBufferSize(int32_t size) override { return OK; }
179 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05180
[email protected]dbf036f2011-12-06 23:33:24181 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21182 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24183 connected_ = true;
184 return OK;
185 }
[email protected]f6d1d6eb2009-06-24 20:16:09186
dchengb03027d2014-10-21 12:00:20187 void Disconnect() override { connected_ = false; }
188 bool IsConnected() const override { return connected_; }
189 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28190 return connected_ && !has_unread_data_;
191 }
[email protected]0b7648c2009-07-06 20:14:01192
dchengb03027d2014-10-21 12:00:20193 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16194 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09195 }
[email protected]f6d1d6eb2009-06-24 20:16:09196
dchengb03027d2014-10-21 12:00:20197 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35198 return ERR_UNEXPECTED;
199 }
200
tfarina428341112016-09-22 13:38:20201 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02202
dchengb03027d2014-10-21 12:00:20203 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37204 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20205 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
206 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03207 void GetConnectionAttempts(ConnectionAttempts* out) const override {
208 out->clear();
209 }
210 void ClearConnectionAttempts() override {}
211 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49212 int64_t GetTotalReceivedBytes() const override {
213 NOTIMPLEMENTED();
214 return 0;
215 }
Paul Jensen0f49dec2017-12-12 23:39:58216 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45217
[email protected]f6d1d6eb2009-06-24 20:16:09218 private:
219 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28220 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20221 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01222 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09223
[email protected]ab838892009-06-30 18:49:05224 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09225};
226
[email protected]5fc08e32009-07-15 17:09:57227class TestConnectJob;
228
[email protected]f6d1d6eb2009-06-24 20:16:09229class MockClientSocketFactory : public ClientSocketFactory {
230 public:
[email protected]ab838892009-06-30 18:49:05231 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09232
danakj655b66c2016-04-16 00:51:38233 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04234 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41235 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19236 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41237 NOTREACHED();
David Benjamin24725be2019-07-24 20:57:18238 return nullptr;
[email protected]98b0e582011-06-22 14:31:41239 }
240
Helen Lid5bb9222018-04-12 15:33:09241 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07242 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38243 std::unique_ptr<
244 SocketPerformanceWatcher> /* socket_performance_watcher */,
Eric Roman2bc77162020-09-16 18:30:45245 NetworkQualityEstimator* /* network_quality_estimator */,
[email protected]0a0b7682010-08-25 17:08:07246 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19247 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09248 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09249 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09250 }
251
danakj655b66c2016-04-16 00:51:38252 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
David Benjamin24725be2019-07-24 20:57:18253 SSLClientContext* context,
Matt Menke841fc412019-03-05 23:20:12254 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27255 const HostPortPair& host_and_port,
David Benjamin24725be2019-07-24 20:57:18256 const SSLConfig& ssl_config) override {
[email protected]f6d1d6eb2009-06-24 20:16:09257 NOTIMPLEMENTED();
David Benjamin24725be2019-07-24 20:57:18258 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09259 }
Matt Menkefd956922019-02-04 23:44:03260
Matt Menke52cd95a2019-02-08 06:16:27261 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
262 std::unique_ptr<StreamSocket> stream_socket,
263 const std::string& user_agent,
264 const HostPortPair& endpoint,
265 const ProxyServer& proxy_server,
266 HttpAuthController* http_auth_controller,
267 bool tunnel,
268 bool using_spdy,
269 NextProto negotiated_protocol,
270 ProxyDelegate* proxy_delegate,
Matt Menke52cd95a2019-02-08 06:16:27271 const NetworkTrafficAnnotationTag& traffic_annotation) override {
272 NOTIMPLEMENTED();
273 return nullptr;
274 }
275
[email protected]5fc08e32009-07-15 17:09:57276 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55277
[email protected]5fc08e32009-07-15 17:09:57278 void SignalJobs();
279
[email protected]03b7c8c2013-07-20 04:38:55280 void SignalJob(size_t job);
281
282 void SetJobLoadState(size_t job, LoadState load_state);
283
Matt Menke141b87f22019-01-30 02:43:03284 // Sets the HasConnectionEstablished value of the specified job to true,
285 // without invoking the callback.
286 void SetJobHasEstablishedConnection(size_t job);
287
[email protected]f6d1d6eb2009-06-24 20:16:09288 int allocation_count() const { return allocation_count_; }
289
[email protected]f6d1d6eb2009-06-24 20:16:09290 private:
291 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57292 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09293};
294
[email protected]ab838892009-06-30 18:49:05295class TestConnectJob : public ConnectJob {
296 public:
297 enum JobType {
298 kMockJob,
299 kMockFailingJob,
300 kMockPendingJob,
301 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57302 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10303
304 // Certificate errors return a socket in addition to an error code.
305 kMockCertErrorJob,
306 kMockPendingCertErrorJob,
307
[email protected]e60e47a2010-07-14 03:37:18308 kMockAdditionalErrorStateJob,
309 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28310 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10311
312 kMockAuthChallengeOnceJob,
313 kMockAuthChallengeTwiceJob,
314 kMockAuthChallengeOnceFailingJob,
315 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05316 };
317
[email protected]994d4932010-07-12 17:55:13318 // The kMockPendingJob uses a slight delay before allowing the connect
319 // to complete.
320 static const int kPendingConnectDelay = 2;
321
[email protected]ab838892009-06-30 18:49:05322 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40323 RequestPriority request_priority,
324 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34325 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43326 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05327 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43328 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40329 : ConnectJob(request_priority,
330 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38331 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43332 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38333 delegate,
334 nullptr /* net_log */,
335 NetLogSourceType::TRANSPORT_CONNECT_JOB,
336 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58337 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05338 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18339 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03340 has_established_connection_(false),
Jeremy Romand54000b22019-07-08 18:40:16341 store_additional_error_state_(false) {}
[email protected]ab838892009-06-30 18:49:05342
[email protected]974ebd62009-08-03 23:14:34343 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13344 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34345 }
346
[email protected]03b7c8c2013-07-20 04:38:55347 void set_load_state(LoadState load_state) { load_state_ = load_state; }
348
Matt Menke141b87f22019-01-30 02:43:03349 void set_has_established_connection() {
350 DCHECK(!has_established_connection_);
351 has_established_connection_ = true;
352 }
353
[email protected]03b7c8c2013-07-20 04:38:55354 // From ConnectJob:
355
dchengb03027d2014-10-21 12:00:20356 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21357
Matt Menke141b87f22019-01-30 02:43:03358 bool HasEstablishedConnection() const override {
359 return has_established_connection_;
360 }
361
dalykedd30d982019-12-16 15:31:10362 ResolveErrorInfo GetResolveErrorInfo() const override {
363 return ResolveErrorInfo(OK);
364 }
365
Matt Menke6f84d1f12019-04-11 19:26:47366 bool IsSSLError() const override { return store_additional_error_state_; }
367
368 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
369 if (store_additional_error_state_)
370 return base::MakeRefCounted<SSLCertRequestInfo>();
371 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18372 }
373
[email protected]974ebd62009-08-03 23:14:34374 private:
[email protected]03b7c8c2013-07-20 04:38:55375 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05376
dchengb03027d2014-10-21 12:00:20377 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05378 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35379 client_socket_factory_->CreateTransportClientSocket(
Eric Roman2bc77162020-09-16 18:30:45380 ignored, nullptr, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05381 switch (job_type_) {
382 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13383 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10384 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05385 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13386 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10387 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05388 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57389 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47390
391 // Depending on execution timings, posting a delayed task can result
392 // in the task getting executed the at the earliest possible
393 // opportunity or only after returning once from the message loop and
394 // then a second call into the message loop. In order to make behavior
395 // more deterministic, we change the default delay to 2ms. This should
396 // always require us to wait for the second call into the message loop.
397 //
398 // N.B. The correct fix for this and similar timing problems is to
399 // abstract time for the purpose of unittests. Unfortunately, we have
400 // a lot of third-party components that directly call the various
401 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45402 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05403 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49404 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
405 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10406 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53407 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05408 return ERR_IO_PENDING;
409 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57410 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45411 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05412 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49413 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
414 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10415 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53416 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05417 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57418 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55419 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57420 client_socket_factory_->WaitForSignal(this);
421 waiting_success_ = true;
422 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10423 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13424 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10425 true /* cert_error */);
426 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13427 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45428 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13429 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49430 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
431 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10432 true /* async */, true /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53433 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13434 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18435 case kMockAdditionalErrorStateJob:
436 store_additional_error_state_ = true;
437 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10438 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18439 case kMockPendingAdditionalErrorStateJob:
440 set_load_state(LOAD_STATE_CONNECTING);
441 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45442 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18443 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49444 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
445 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10446 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53447 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18448 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28449 case kMockUnreadDataJob: {
450 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10451 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28452 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
453 return ret;
454 }
Matt Menkeb57663b32019-03-01 17:17:10455 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01456 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10457 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
458 return ERR_IO_PENDING;
459 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01460 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10461 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
462 return ERR_IO_PENDING;
463 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01464 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10465 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
466 return ERR_IO_PENDING;
467 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01468 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10469 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
470 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05471 default:
472 NOTREACHED();
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19473 SetSocket(std::unique_ptr<StreamSocket>(), base::nullopt);
[email protected]ab838892009-06-30 18:49:05474 return ERR_FAILED;
475 }
476 }
477
Lily Chen02ef29a2018-11-30 16:31:43478 void ChangePriorityInternal(RequestPriority priority) override {}
479
Matt Menkeb57663b32019-03-01 17:17:10480 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13481 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03482 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05483 if (succeed) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19484 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
485 base::nullopt);
Bence Békybdbb0e72018-08-07 21:42:59486 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10487 } else if (cert_error) {
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19488 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()),
489 base::nullopt);
Matt Menkeb57663b32019-03-01 17:17:10490 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40491 } else {
[email protected]e772db3f2010-07-12 18:11:13492 result = ERR_CONNECTION_FAILED;
Cammie Smith Barnesaa2a8b52020-12-17 19:33:19493 SetSocket(std::unique_ptr<StreamSocket>(), base::nullopt);
[email protected]ab838892009-06-30 18:49:05494 }
[email protected]2ab05b52009-07-01 23:57:58495
496 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30497 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05498 return result;
499 }
500
Matt Menkeb57663b32019-03-01 17:17:10501 void DoAdvanceAuthChallenge(int remaining_challenges,
502 bool succeed_after_last_challenge) {
503 base::ThreadTaskRunnerHandle::Get()->PostTask(
504 FROM_HERE,
505 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
506 weak_factory_.GetWeakPtr(), remaining_challenges,
507 succeed_after_last_challenge));
508 }
509
510 void InvokeNextProxyAuthCallback(int remaining_challenges,
511 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01512 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10513 if (remaining_challenges == 0) {
514 DoConnect(succeed_after_last_challenge, true /* was_async */,
515 false /* cert_error */);
516 return;
517 }
518
519 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
520 // The auth tests here are just focused on ConnectJob bookkeeping.
521 HttpResponseInfo info;
522 NotifyDelegateOfProxyAuth(
523 info, nullptr /* http_auth_controller */,
524 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
525 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
526 succeed_after_last_challenge));
527 }
528
[email protected]5fc08e32009-07-15 17:09:57529 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05530 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57531 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21532 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03533 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18534 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05535
Jeremy Romand54000b22019-07-08 18:40:16536 base::WeakPtrFactory<TestConnectJob> weak_factory_{this};
[email protected]d5492c52013-11-10 20:44:39537
[email protected]ab838892009-06-30 18:49:05538 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
539};
540
[email protected]d80a4322009-08-14 07:07:49541class TestConnectJobFactory
Matt Menke16f5c2e52019-03-25 21:50:40542 : public TransportClientSocketPool::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05543 public:
[email protected]034df0f32013-01-07 23:17:48544 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
545 NetLog* net_log)
Matt Menkea6f99ad2019-03-08 02:26:43546 : common_connect_job_params_(
547 nullptr /* client_socket_factory */,
548 nullptr /* host_resolver */,
Matt Menkeb88837e2019-03-20 11:50:40549 nullptr /* http_auth_cache */,
550 nullptr /* http_auth_handler_factory */,
551 nullptr /* spdy_session_pool */,
Matt Menkeb5fb42b2019-03-22 17:26:13552 nullptr /* quic_supported_versions */,
Matt Menkeb88837e2019-03-20 11:50:40553 nullptr /* quic_stream_factory */,
Matt Menkea6f99ad2019-03-08 02:26:43554 nullptr /* proxy_delegate */,
Matt Menked732ea42019-03-08 12:05:00555 nullptr /* http_user_agent_settings */,
David Benjamin24725be2019-07-24 20:57:18556 nullptr /* ssl_client_context */,
Matt Menkea6f99ad2019-03-08 02:26:43557 nullptr /* socket_performance_watcher_factory */,
558 nullptr /* network_quality_estimator */,
559 net_log,
560 nullptr /* websocket_endpoint_lock_manager */),
561 job_type_(TestConnectJob::kMockJob),
Raul Tambre94493c652019-03-11 17:18:35562 job_types_(nullptr),
Matt Menkea6f99ad2019-03-08 02:26:43563 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05564
Chris Watkins7a41d3552017-12-01 02:13:27565 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05566
567 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
568
[email protected]51fdc7c2012-04-10 19:19:48569 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
570 job_types_ = job_types;
571 CHECK(!job_types_->empty());
572 }
573
[email protected]974ebd62009-08-03 23:14:34574 void set_timeout_duration(base::TimeDelta timeout_duration) {
575 timeout_duration_ = timeout_duration;
576 }
577
[email protected]3f55aa12011-12-07 02:03:33578 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55579
danakj655b66c2016-04-16 00:51:38580 std::unique_ptr<ConnectJob> NewConnectJob(
Matt Menkeaafff542019-04-22 22:09:36581 ClientSocketPool::GroupId group_id,
582 scoped_refptr<ClientSocketPool::SocketParams> socket_params,
Matt Menkef09e64c2019-04-23 22:16:28583 const base::Optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag,
Matt Menke16f5c2e52019-03-25 21:50:40584 RequestPriority request_priority,
585 SocketTag socket_tag,
mostynbba063d6032014-10-09 11:01:13586 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48587 EXPECT_TRUE(!job_types_ || !job_types_->empty());
588 TestConnectJob::JobType job_type = job_type_;
589 if (job_types_ && !job_types_->empty()) {
590 job_type = job_types_->front();
591 job_types_->pop_front();
592 }
Matt Menkea6f99ad2019-03-08 02:26:43593 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40594 job_type, request_priority, socket_tag, timeout_duration_,
595 &common_connect_job_params_, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05596 }
597
598 private:
Matt Menkea6f99ad2019-03-08 02:26:43599 const CommonConnectJobParams common_connect_job_params_;
[email protected]ab838892009-06-30 18:49:05600 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48601 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34602 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57603 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05604
605 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
606};
607
[email protected]a937a06d2009-08-19 21:19:24608} // namespace
609
[email protected]a937a06d2009-08-19 21:19:24610namespace {
611
[email protected]5fc08e32009-07-15 17:09:57612void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26613 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57614 (*it)->Signal();
615 }
616 waiting_jobs_.clear();
617}
618
[email protected]03b7c8c2013-07-20 04:38:55619void MockClientSocketFactory::SignalJob(size_t job) {
620 ASSERT_LT(job, waiting_jobs_.size());
621 waiting_jobs_[job]->Signal();
622 waiting_jobs_.erase(waiting_jobs_.begin() + job);
623}
624
625void MockClientSocketFactory::SetJobLoadState(size_t job,
626 LoadState load_state) {
627 ASSERT_LT(job, waiting_jobs_.size());
628 waiting_jobs_[job]->set_load_state(load_state);
629}
630
Matt Menke141b87f22019-01-30 02:43:03631void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
632 ASSERT_LT(job, waiting_jobs_.size());
633 waiting_jobs_[job]->set_has_established_connection();
634}
635
Gabriel Charette694c3c332019-08-19 14:53:05636class ClientSocketPoolBaseTest : public TestWithTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09637 protected:
Alex Clarke0def2092018-12-10 12:01:45638 ClientSocketPoolBaseTest()
Gabriel Charette694c3c332019-08-19 14:53:05639 : TestWithTaskEnvironment(
640 base::test::TaskEnvironment::TimeSource::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03641 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54642 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40643 TransportClientSocketPool::connect_backup_jobs_enabled();
644 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54645 }
[email protected]2431756e2010-09-29 20:26:13646
dcheng67be2b1f2014-10-27 21:47:29647 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40648 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54649 connect_backup_jobs_enabled_);
650 }
[email protected]c9d6a1d2009-07-14 16:15:20651
Matt Menke9fa17d52019-03-25 19:12:26652 void CreatePool(int max_sockets,
653 int max_sockets_per_group,
654 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59655 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
656 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26657 ClientSocketPool::used_idle_socket_timeout(),
658 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16659 }
660
David Benjaminbac8dff2019-08-07 01:30:41661 void CreatePoolWithIdleTimeouts(
662 int max_sockets,
663 int max_sockets_per_group,
664 base::TimeDelta unused_idle_socket_timeout,
665 base::TimeDelta used_idle_socket_timeout,
666 bool enable_backup_connect_jobs = false,
667 ProxyServer proxy_server = ProxyServer::Direct()) {
[email protected]c9d6a1d2009-07-14 16:15:20668 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26669 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
670 std::make_unique<TestConnectJobFactory>(&client_socket_factory_,
671 &net_log_);
672 connect_job_factory_ = connect_job_factory.get();
673 pool_ = TransportClientSocketPool::CreateForTesting(
674 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
David Benjaminbac8dff2019-08-07 01:30:41675 used_idle_socket_timeout, proxy_server, std::move(connect_job_factory),
Matt Menke9fa17d52019-03-25 19:12:26676 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20677 }
[email protected]f6d1d6eb2009-06-24 20:16:09678
mmenked3641e12016-01-28 16:06:15679 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39680 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33681 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15682 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39683 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15684 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33685 }
686
Matt Menkec6b3edf72019-03-19 17:00:39687 int StartRequest(const ClientSocketPool::GroupId& group_id,
688 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15689 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39690 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09691 }
692
[email protected]2431756e2010-09-29 20:26:13693 int GetOrderOfRequest(size_t index) const {
694 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09695 }
696
[email protected]2431756e2010-09-29 20:26:13697 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
698 return test_base_.ReleaseOneConnection(keep_alive);
699 }
700
701 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
702 test_base_.ReleaseAllConnections(keep_alive);
703 }
704
Matt Menke433de6d2020-03-04 00:24:11705 // Expects a single NetLogEventType::SOCKET_POOL_CLOSING_SOCKET in |net_log_|.
706 // It should be logged for the provided source and have the indicated reason.
707 void ExpectSocketClosedWithReason(NetLogSource expected_source,
708 const char* expected_reason) {
709 auto entries = net_log_.GetEntriesForSourceWithType(
710 expected_source, NetLogEventType::SOCKET_POOL_CLOSING_SOCKET,
711 NetLogEventPhase::NONE);
712 ASSERT_EQ(1u, entries.size());
713 ASSERT_TRUE(entries[0].HasParams());
714 ASSERT_TRUE(entries[0].params.is_dict());
715 const std::string* reason = entries[0].params.FindStringKey("reason");
716 ASSERT_TRUE(reason);
717 EXPECT_EQ(expected_reason, *reason);
718 }
719
[email protected]2431756e2010-09-29 20:26:13720 TestSocketRequest* request(int i) { return test_base_.request(i); }
721 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38722 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42723 return test_base_.requests();
724 }
rdsmith29dbad12017-02-17 02:22:18725 // Only counts the requests that get sockets asynchronously;
726 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13727 size_t completion_count() const { return test_base_.completion_count(); }
728
Matt Muellerd9342e3a2019-11-26 01:41:14729 RecordingTestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54730 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09731 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04732 TestConnectJobFactory* connect_job_factory_;
Matt Menke9fa17d52019-03-25 19:12:26733 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19734 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26735 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13736 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09737};
738
[email protected]5fc08e32009-07-15 17:09:57739TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53740 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20741
[email protected]6ecf2b92011-12-15 01:14:52742 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06743 ClientSocketHandle handle;
Matt Muellerd9342e3a2019-11-26 01:41:14744 RecordingBoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48745 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53746
Matt Menkef09e64c2019-04-23 22:16:28747 EXPECT_EQ(OK, handle.Init(
748 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
749 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
750 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
751 pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09752 EXPECT_TRUE(handle.is_initialized());
753 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48754 TestLoadTimingInfoConnectedNotReused(handle);
755
[email protected]f6d1d6eb2009-06-24 20:16:09756 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48757 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30758
Eric Roman79cc7552019-07-19 02:17:54759 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40760
Matt Menke9fa17d52019-03-25 19:12:26761 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53762 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26763 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00764 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26765 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
766 EXPECT_TRUE(LogContainsEvent(
767 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
768 NetLogEventPhase::NONE));
769 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00770 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
771 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26772 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09773}
774
[email protected]ab838892009-06-30 18:49:05775TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53776 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20777
[email protected]ab838892009-06-30 18:49:05778 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
Matt Muellerd9342e3a2019-11-26 01:41:14779 RecordingBoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53780
[email protected]2431756e2010-09-29 20:26:13781 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52782 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18783 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13784 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51785 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50786 EXPECT_EQ(
787 ERR_CONNECTION_FAILED,
Matt Menkef09e64c2019-04-23 22:16:28788 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
789 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
790 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
791 pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13792 EXPECT_FALSE(handle.socket());
793 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51794 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48795 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30796
Eric Roman79cc7552019-07-19 02:17:54797 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:40798
Matt Menke9fa17d52019-03-25 19:12:26799 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17800 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26801 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00802 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26803 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
804 EXPECT_TRUE(LogContainsEvent(
805 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
806 NetLogEventPhase::NONE));
807 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09808}
809
Matt Menke433de6d2020-03-04 00:24:11810// Test releasing an open socket into the socket pool, telling the socket pool
811// to close the socket.
812TEST_F(ClientSocketPoolBaseTest, ReleaseAndCloseConnection) {
813 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
814
815 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
816 ASSERT_TRUE(request(0)->handle()->socket());
817 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
818 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
819
820 EXPECT_EQ(0, pool_->IdleSocketCount());
821 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
822
823 ExpectSocketClosedWithReason(
824 source, TransportClientSocketPool::kClosedConnectionReturnedToPool);
825}
826
827TEST_F(ClientSocketPoolBaseTest, SocketWithUnreadDataReturnedToPool) {
828 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
829 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
830
831 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
832 ASSERT_TRUE(request(0)->handle()->socket());
833 net::NetLogSource source = request(0)->handle()->socket()->NetLog().source();
834 EXPECT_TRUE(request(0)->handle()->socket()->IsConnected());
835 EXPECT_FALSE(request(0)->handle()->socket()->IsConnectedAndIdle());
836 ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE);
837
838 EXPECT_EQ(0, pool_->IdleSocketCount());
839 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
840
841 ExpectSocketClosedWithReason(
842 source, TransportClientSocketPool::kDataReceivedUnexpectedly);
843}
844
Matt Menkef6edce752019-03-19 17:21:56845// Make sure different groups do not share sockets.
846TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
Matt Menke166443c2019-05-24 18:45:59847 base::test::ScopedFeatureList feature_list;
848 feature_list.InitAndEnableFeature(
849 features::kPartitionConnectionsByNetworkIsolationKey);
850
Matt Menkef6edce752019-03-19 17:21:56851 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
852
853 const HostPortPair kHostPortPairs[] = {
854 {"a", 80},
855 {"a", 443},
856 {"b", 80},
857 };
858
859 const ClientSocketPool::SocketType kSocketTypes[] = {
860 ClientSocketPool::SocketType::kHttp,
861 ClientSocketPool::SocketType::kSsl,
Matt Menkef6edce752019-03-19 17:21:56862 };
863
Matt Menkebdf777802019-04-22 19:38:59864 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
865 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56866
Matt Menke4807a9a2020-11-21 00:14:41867 const SchemefulSite kSiteA(GURL("http://a.test/"));
868 const SchemefulSite kSiteB(GURL("http://b.test/"));
Matt Menke166443c2019-05-24 18:45:59869 const NetworkIsolationKey kNetworkIsolationKeys[] = {
Matt Menke4807a9a2020-11-21 00:14:41870 NetworkIsolationKey(kSiteA, kSiteA),
871 NetworkIsolationKey(kSiteB, kSiteB),
Matt Menke166443c2019-05-24 18:45:59872 };
873
Ben Schwartz3ff4dc1e62021-04-27 21:15:23874 const SecureDnsPolicy kSecureDnsPolicys[] = {SecureDnsPolicy::kAllow,
875 SecureDnsPolicy::kDisable};
dalyk5f48a132019-10-14 15:20:19876
Matt Menkef6edce752019-03-19 17:21:56877 int total_idle_sockets = 0;
878
879 // Walk through each GroupId, making sure that requesting a socket for one
880 // group does not return a previously connected socket for another group.
881 for (const auto& host_port_pair : kHostPortPairs) {
882 SCOPED_TRACE(host_port_pair.ToString());
883 for (const auto& socket_type : kSocketTypes) {
884 SCOPED_TRACE(static_cast<int>(socket_type));
885 for (const auto& privacy_mode : kPrivacyModes) {
886 SCOPED_TRACE(privacy_mode);
Matt Menke166443c2019-05-24 18:45:59887 for (const auto& network_isolation_key : kNetworkIsolationKeys) {
888 SCOPED_TRACE(network_isolation_key.ToString());
Ben Schwartz3ff4dc1e62021-04-27 21:15:23889 for (const auto& secure_dns_policy : kSecureDnsPolicys) {
890 SCOPED_TRACE(static_cast<int>(secure_dns_policy));
Matt Menkef6edce752019-03-19 17:21:56891
dalyk5f48a132019-10-14 15:20:19892 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkef6edce752019-03-19 17:21:56893
dalyk5f48a132019-10-14 15:20:19894 ClientSocketPool::GroupId group_id(
895 host_port_pair, socket_type, privacy_mode,
Ben Schwartz3ff4dc1e62021-04-27 21:15:23896 network_isolation_key, secure_dns_policy);
Matt Menkef6edce752019-03-19 17:21:56897
dalyk5f48a132019-10-14 15:20:19898 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56899
dalyk5f48a132019-10-14 15:20:19900 TestCompletionCallback callback;
901 ClientSocketHandle handle;
Matt Menkef6edce752019-03-19 17:21:56902
dalyk5f48a132019-10-14 15:20:19903 // Since the group is empty, requesting a socket should not complete
904 // synchronously.
905 EXPECT_THAT(handle.Init(group_id, params_, base::nullopt,
906 DEFAULT_PRIORITY, SocketTag(),
907 ClientSocketPool::RespectLimits::ENABLED,
908 callback.callback(),
909 ClientSocketPool::ProxyAuthCallback(),
910 pool_.get(), NetLogWithSource()),
911 IsError(ERR_IO_PENDING));
912 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
913 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56914
dalyk5f48a132019-10-14 15:20:19915 EXPECT_THAT(callback.WaitForResult(), IsOk());
916 EXPECT_TRUE(handle.socket());
917 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
918 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56919
dalyk5f48a132019-10-14 15:20:19920 // Return socket to pool.
921 handle.Reset();
922 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56923
dalyk5f48a132019-10-14 15:20:19924 // Requesting a socket again should return the same socket as
925 // before, so should complete synchronously.
926 EXPECT_THAT(handle.Init(group_id, params_, base::nullopt,
927 DEFAULT_PRIORITY, SocketTag(),
928 ClientSocketPool::RespectLimits::ENABLED,
929 callback.callback(),
930 ClientSocketPool::ProxyAuthCallback(),
931 pool_.get(), NetLogWithSource()),
932 IsOk());
933 EXPECT_TRUE(handle.socket());
934 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56935
dalyk5f48a132019-10-14 15:20:19936 // Return socket to pool again.
937 handle.Reset();
938 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
Matt Menkef6edce752019-03-19 17:21:56939
dalyk5f48a132019-10-14 15:20:19940 ++total_idle_sockets;
941 }
Matt Menke166443c2019-05-24 18:45:59942 }
Matt Menkef6edce752019-03-19 17:21:56943 }
944 }
945 }
946}
947
[email protected]211d21722009-07-22 15:48:53948TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
949 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
950
[email protected]9e743cd2010-03-16 07:03:53951 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30952
Matt Menkec6b3edf72019-03-19 17:00:39953 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
954 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
955 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
956 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53957
[email protected]2431756e2010-09-29 20:26:13958 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53959 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13960 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53961
Matt Menkec6b3edf72019-03-19 17:00:39962 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
963 IsError(ERR_IO_PENDING));
964 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
965 IsError(ERR_IO_PENDING));
966 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
967 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53968
[email protected]2431756e2010-09-29 20:26:13969 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53970
[email protected]2431756e2010-09-29 20:26:13971 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53972 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13973 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53974
975 EXPECT_EQ(1, GetOrderOfRequest(1));
976 EXPECT_EQ(2, GetOrderOfRequest(2));
977 EXPECT_EQ(3, GetOrderOfRequest(3));
978 EXPECT_EQ(4, GetOrderOfRequest(4));
979 EXPECT_EQ(5, GetOrderOfRequest(5));
980 EXPECT_EQ(6, GetOrderOfRequest(6));
981 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17982
983 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13984 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53985}
986
987TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
988 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
989
[email protected]9e743cd2010-03-16 07:03:53990 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30991
[email protected]211d21722009-07-22 15:48:53992 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39993 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
994 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
995 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
996 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53997
[email protected]2431756e2010-09-29 20:26:13998 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53999 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131000 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531001
1002 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:391003 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1004 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531005
[email protected]2431756e2010-09-29 20:26:131006 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531007
[email protected]2431756e2010-09-29 20:26:131008 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531009 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131010 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531011
1012 EXPECT_EQ(1, GetOrderOfRequest(1));
1013 EXPECT_EQ(2, GetOrderOfRequest(2));
1014 EXPECT_EQ(3, GetOrderOfRequest(3));
1015 EXPECT_EQ(4, GetOrderOfRequest(4));
1016 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:171017
1018 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131019 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531020}
1021
1022TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
1023 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1024
Matt Menkec6b3edf72019-03-19 17:00:391025 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
1026 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
1027 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1028 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:531029
[email protected]2431756e2010-09-29 20:26:131030 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531031 client_socket_factory_.allocation_count());
1032
Matt Menkec6b3edf72019-03-19 17:00:391033 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
1034 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1035 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531036
[email protected]2431756e2010-09-29 20:26:131037 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531038
[email protected]2431756e2010-09-29 20:26:131039 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531040
1041 // First 4 requests don't have to wait, and finish in order.
1042 EXPECT_EQ(1, GetOrderOfRequest(1));
1043 EXPECT_EQ(2, GetOrderOfRequest(2));
1044 EXPECT_EQ(3, GetOrderOfRequest(3));
1045 EXPECT_EQ(4, GetOrderOfRequest(4));
1046
Matt Menkec6b3edf72019-03-19 17:00:391047 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1048 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531049 EXPECT_EQ(7, GetOrderOfRequest(5));
1050 EXPECT_EQ(6, GetOrderOfRequest(6));
1051 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171052
1053 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131054 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531055}
1056
rdsmith29dbad12017-02-17 02:22:181057// Test reprioritizing a request before completion doesn't interfere with
1058// its completion.
1059TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1060 CreatePool(kDefaultMaxSockets, 1);
1061
Matt Menkec6b3edf72019-03-19 17:00:391062 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1063 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181064 EXPECT_TRUE(request(0)->handle()->socket());
1065 EXPECT_FALSE(request(1)->handle()->socket());
1066
Lily Chenecebf932018-11-02 17:15:431067 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181068
1069 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1070
1071 EXPECT_TRUE(request(1)->handle()->socket());
1072}
1073
1074// Reprioritize a request up past another one and make sure that changes the
1075// completion order.
1076TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1077 CreatePool(kDefaultMaxSockets, 1);
1078
Matt Menkec6b3edf72019-03-19 17:00:391079 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1080 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1081 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181082 EXPECT_TRUE(request(0)->handle()->socket());
1083 EXPECT_FALSE(request(1)->handle()->socket());
1084 EXPECT_FALSE(request(2)->handle()->socket());
1085
1086 request(2)->handle()->SetPriority(HIGHEST);
1087
1088 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1089
1090 EXPECT_EQ(1, GetOrderOfRequest(1));
1091 EXPECT_EQ(3, GetOrderOfRequest(2));
1092 EXPECT_EQ(2, GetOrderOfRequest(3));
1093}
1094
1095// Reprioritize a request without changing relative priorities and check
1096// that the order doesn't change.
1097TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1098 CreatePool(kDefaultMaxSockets, 1);
1099
Matt Menkec6b3edf72019-03-19 17:00:391100 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1101 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1102 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181103 EXPECT_TRUE(request(0)->handle()->socket());
1104 EXPECT_FALSE(request(1)->handle()->socket());
1105 EXPECT_FALSE(request(2)->handle()->socket());
1106
1107 request(2)->handle()->SetPriority(MEDIUM);
1108
1109 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1110
1111 EXPECT_EQ(1, GetOrderOfRequest(1));
1112 EXPECT_EQ(2, GetOrderOfRequest(2));
1113 EXPECT_EQ(3, GetOrderOfRequest(3));
1114}
1115
1116// Reprioritize a request past down another one and make sure that changes the
1117// completion order.
1118TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1119 CreatePool(kDefaultMaxSockets, 1);
1120
Matt Menkec6b3edf72019-03-19 17:00:391121 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1122 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1123 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181124 EXPECT_TRUE(request(0)->handle()->socket());
1125 EXPECT_FALSE(request(1)->handle()->socket());
1126 EXPECT_FALSE(request(2)->handle()->socket());
1127
1128 request(1)->handle()->SetPriority(LOW);
1129
1130 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1131
1132 EXPECT_EQ(1, GetOrderOfRequest(1));
1133 EXPECT_EQ(3, GetOrderOfRequest(2));
1134 EXPECT_EQ(2, GetOrderOfRequest(3));
1135}
1136
1137// Reprioritize a request to the same level as another and confirm it is
1138// put after the old request.
1139TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1140 CreatePool(kDefaultMaxSockets, 1);
1141
Matt Menkec6b3edf72019-03-19 17:00:391142 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1143 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1144 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181145 EXPECT_TRUE(request(0)->handle()->socket());
1146 EXPECT_FALSE(request(1)->handle()->socket());
1147 EXPECT_FALSE(request(2)->handle()->socket());
1148
1149 request(1)->handle()->SetPriority(MEDIUM);
1150
1151 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1152
1153 EXPECT_EQ(1, GetOrderOfRequest(1));
1154 EXPECT_EQ(3, GetOrderOfRequest(2));
1155 EXPECT_EQ(2, GetOrderOfRequest(3));
1156}
1157
[email protected]211d21722009-07-22 15:48:531158TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1159 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1160
Matt Menkec6b3edf72019-03-19 17:00:391161 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1162 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1163 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1164 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531165
[email protected]2431756e2010-09-29 20:26:131166 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531167 client_socket_factory_.allocation_count());
1168
Matt Menkec6b3edf72019-03-19 17:00:391169 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1170 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1171 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531172
[email protected]2431756e2010-09-29 20:26:131173 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531174
[email protected]2431756e2010-09-29 20:26:131175 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531176 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131177 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531178
1179 // First 4 requests don't have to wait, and finish in order.
1180 EXPECT_EQ(1, GetOrderOfRequest(1));
1181 EXPECT_EQ(2, GetOrderOfRequest(2));
1182 EXPECT_EQ(3, GetOrderOfRequest(3));
1183 EXPECT_EQ(4, GetOrderOfRequest(4));
1184
1185 // Request ("b", 7) has the highest priority, but we can't make new socket for
1186 // group "b", because it has reached the per-group limit. Then we make
1187 // socket for ("c", 6), because it has higher priority than ("a", 4),
1188 // and we still can't make a socket for group "b".
1189 EXPECT_EQ(5, GetOrderOfRequest(5));
1190 EXPECT_EQ(6, GetOrderOfRequest(6));
1191 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171192
1193 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131194 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531195}
1196
1197// Make sure that we count connecting sockets against the total limit.
1198TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1199 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1200
Matt Menkec6b3edf72019-03-19 17:00:391201 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1202 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1203 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531204
1205 // Create one asynchronous request.
1206 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391207 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1208 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531209
[email protected]6b175382009-10-13 06:47:471210 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1211 // actually become pending until 2ms after they have been created. In order
1212 // to flush all tasks, we need to wait so that we know there are no
1213 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451214 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471215
[email protected]211d21722009-07-22 15:48:531216 // The next synchronous request should wait for its turn.
1217 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391218 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1219 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531220
[email protected]2431756e2010-09-29 20:26:131221 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531222
[email protected]2431756e2010-09-29 20:26:131223 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531224 client_socket_factory_.allocation_count());
1225
1226 EXPECT_EQ(1, GetOrderOfRequest(1));
1227 EXPECT_EQ(2, GetOrderOfRequest(2));
1228 EXPECT_EQ(3, GetOrderOfRequest(3));
1229 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171230 EXPECT_EQ(5, GetOrderOfRequest(5));
1231
1232 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131233 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531234}
1235
[email protected]6427fe22010-04-16 22:27:411236TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1237 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1238 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1239
Matt Menkec6b3edf72019-03-19 17:00:391240 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1241 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1242 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1243 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411244
1245 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1246
1247 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1248
Matt Menkec6b3edf72019-03-19 17:00:391249 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1250 IsError(ERR_IO_PENDING));
1251 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1252 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411253
1254 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1255
[email protected]2431756e2010-09-29 20:26:131256 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411257 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131258 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411259 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131260 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1261 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411262 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1263}
1264
[email protected]d7027bb2010-05-10 18:58:541265TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1266 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1267 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1268
1269 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521270 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501271 EXPECT_EQ(
1272 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281273 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1274 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1275 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1276 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541277
1278 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241279 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521280 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501281 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391282 handles[i].Init(
Matt Menkef09e64c2019-04-23 22:16:281283 TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
1284 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1285 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1286 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541287 }
1288
1289 // One will be stalled, cancel all the handles now.
1290 // This should hit the OnAvailableSocketSlot() code where we previously had
1291 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241292 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541293 handles[i].Reset();
1294}
1295
[email protected]eb5a99382010-07-11 03:18:261296TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541297 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1298 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1299
[email protected]eb5a99382010-07-11 03:18:261300 {
1301 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521302 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261303 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkef09e64c2019-04-23 22:16:281304 EXPECT_EQ(OK,
1305 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
1306 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
1307 ClientSocketPool::RespectLimits::ENABLED,
1308 callbacks[i].callback(),
1309 ClientSocketPool::ProxyAuthCallback(),
1310 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261311 }
1312
1313 // Force a stalled group.
1314 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521315 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201316 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391317 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281318 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1319 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1320 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1321 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261322
1323 // Cancel the stalled request.
1324 stalled_handle.Reset();
1325
1326 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1327 EXPECT_EQ(0, pool_->IdleSocketCount());
1328
1329 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541330 }
1331
[email protected]43a21b82010-06-10 21:30:541332 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1333 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261334}
[email protected]43a21b82010-06-10 21:30:541335
[email protected]eb5a99382010-07-11 03:18:261336TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1337 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1338 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1339
1340 {
1341 ClientSocketHandle handles[kDefaultMaxSockets];
1342 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521343 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201344 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391345 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
Matt Menkef09e64c2019-04-23 22:16:281346 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkec6b3edf72019-03-19 17:00:391347 ClientSocketPool::RespectLimits::ENABLED,
1348 callback.callback(),
1349 ClientSocketPool::ProxyAuthCallback(),
1350 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261351 }
1352
1353 // Force a stalled group.
1354 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1355 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521356 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201357 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391358 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281359 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1360 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1361 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1362 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261363
1364 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261365 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1366 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1367 TestGroupId("foo")));
1368 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1369 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261370
1371 // Cancel the stalled request.
1372 handles[0].Reset();
1373
[email protected]eb5a99382010-07-11 03:18:261374 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261375 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1376 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1377 TestGroupId("foo")));
1378 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1379 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261380
1381 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011382 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261383
1384 EXPECT_EQ(kDefaultMaxSockets + 1,
1385 client_socket_factory_.allocation_count());
1386 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261387 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1388 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1389 TestGroupId("foo")));
1390 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1391 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261392
1393 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541394 }
1395
[email protected]eb5a99382010-07-11 03:18:261396 EXPECT_EQ(1, pool_->IdleSocketCount());
1397}
[email protected]43a21b82010-06-10 21:30:541398
[email protected]eb5a99382010-07-11 03:18:261399TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1400 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1401 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541402
[email protected]eb5a99382010-07-11 03:18:261403 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521404 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261405 {
[email protected]51fdc7c2012-04-10 19:19:481406 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261407 ClientSocketHandle handles[kDefaultMaxSockets];
1408 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521409 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391410 EXPECT_EQ(
Matt Menkef09e64c2019-04-23 22:16:281411 OK, handles[i].Init(
1412 TestGroupId(base::StringPrintf("Take 2: %d", i)), params_,
1413 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
1414 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1415 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1416 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261417 }
1418
1419 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1420 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481421 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261422
1423 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201424 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391425 stalled_handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281426 TestGroupId("foo"), params_, base::nullopt, DEFAULT_PRIORITY,
1427 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1428 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1429 pool_.get(), NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481430 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261431
1432 // Dropping out of scope will close all handles and return them to idle.
1433 }
[email protected]43a21b82010-06-10 21:30:541434
1435 // But if we wait for it, the released idle sockets will be closed in
1436 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011437 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261438
1439 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1440 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541441}
1442
1443// Regression test for http://crbug.com/40952.
1444TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261445 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1446 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541447 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1448
1449 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1450 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521451 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391452 EXPECT_EQ(OK, handle.Init(TestGroupId(base::NumberToString(i)), params_,
Matt Menkef09e64c2019-04-23 22:16:281453 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menkec6b3edf72019-03-19 17:00:391454 ClientSocketPool::RespectLimits::ENABLED,
1455 callback.callback(),
1456 ClientSocketPool::ProxyAuthCallback(),
1457 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541458 }
1459
1460 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281461 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541462
1463 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1464 // reuse a socket.
1465 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1466 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521467 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541468
1469 // "0" is special here, since it should be the first entry in the sorted map,
1470 // which is the one which we would close an idle socket for. We shouldn't
1471 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391472 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281473 TestGroupId("0"), params_, base::nullopt, DEFAULT_PRIORITY,
1474 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:391475 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1476 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541477
1478 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1479 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1480}
1481
[email protected]ab838892009-06-30 18:49:051482TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531483 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091484
Matt Menkec6b3edf72019-03-19 17:00:391485 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1486 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1487 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1488 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1489 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1490 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1491 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1492 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091493
[email protected]2431756e2010-09-29 20:26:131494 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201495 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1496 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131497 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1498 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091499
[email protected]c9d6a1d2009-07-14 16:15:201500 EXPECT_EQ(1, GetOrderOfRequest(1));
1501 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031502 EXPECT_EQ(8, GetOrderOfRequest(3));
1503 EXPECT_EQ(6, GetOrderOfRequest(4));
1504 EXPECT_EQ(4, GetOrderOfRequest(5));
1505 EXPECT_EQ(3, GetOrderOfRequest(6));
1506 EXPECT_EQ(5, GetOrderOfRequest(7));
1507 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171508
1509 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131510 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091511}
1512
[email protected]ab838892009-06-30 18:49:051513TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531514 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091515
Matt Menkec6b3edf72019-03-19 17:00:391516 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1517 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1518 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1519 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1520 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1521 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1522 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091523
[email protected]2431756e2010-09-29 20:26:131524 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091525
[email protected]2431756e2010-09-29 20:26:131526 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011527 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201528
[email protected]2431756e2010-09-29 20:26:131529 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201530 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131531 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1532 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091533}
1534
Matt Menke7eb405e2019-04-25 20:48:211535TEST_F(ClientSocketPoolBaseTest, ResetAndCloseSocket) {
1536 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1537
1538 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1539 ClientSocketHandle handle;
1540 TestCompletionCallback callback;
1541 EXPECT_EQ(
1542 ERR_IO_PENDING,
1543 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1544 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1545 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1546 pool_.get(), NetLogWithSource()));
1547
1548 EXPECT_THAT(callback.WaitForResult(), IsOk());
1549 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1550 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1551 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
1552 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1553
1554 handle.ResetAndCloseSocket();
1555 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1556}
1557
Matt Menke99251ea42019-04-25 22:59:021558// This test will start up a socket request and then call Reset() on the handle.
1559// The pending ConnectJob should not be destroyed.
Matt Menke7eb405e2019-04-25 20:48:211560TEST_F(ClientSocketPoolBaseTest, CancelRequestKeepsConnectJob) {
[email protected]211d21722009-07-22 15:48:531561 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201562
[email protected]ab838892009-06-30 18:49:051563 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131564 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521565 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501566 EXPECT_EQ(
1567 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281568 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1569 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1570 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1571 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131572 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211573 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1574 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1575}
1576
Matt Menke99251ea42019-04-25 22:59:021577// This test will start up a socket request and then call ResetAndCloseSocket()
1578// on the handle. The pending ConnectJob or connected socket should be
1579// destroyed.
Matt Menke7eb405e2019-04-25 20:48:211580TEST_F(ClientSocketPoolBaseTest, CancelRequestAndCloseSocket) {
1581 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1582
Matt Menke99251ea42019-04-25 22:59:021583 // When true, the socket connects before it's canceled.
1584 for (bool cancel_when_callback_pending : {false, true}) {
1585 if (cancel_when_callback_pending) {
1586 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1587 } else {
1588 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1589 }
1590 ClientSocketHandle handle;
1591 TestCompletionCallback callback;
1592 EXPECT_EQ(
1593 ERR_IO_PENDING,
1594 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1595 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1596 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1597 pool_.get(), NetLogWithSource()));
1598 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1599 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1600
1601 if (cancel_when_callback_pending) {
1602 client_socket_factory_.SignalJobs();
1603 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1604 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1605 }
1606
1607 handle.ResetAndCloseSocket();
1608 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1609 }
Matt Menke7eb405e2019-04-25 20:48:211610}
1611
1612TEST_F(ClientSocketPoolBaseTest,
1613 CancelRequestAndCloseSocketWhenMoreRequestsThanConnectJobs) {
1614 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1615
Matt Menke99251ea42019-04-25 22:59:021616 // When true, the sockets connect before they're canceled.
1617 for (bool cancel_when_callback_pending : {false, true}) {
1618 if (cancel_when_callback_pending) {
1619 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1620 } else {
1621 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1622 }
Matt Menke7eb405e2019-04-25 20:48:211623
Matt Menke99251ea42019-04-25 22:59:021624 std::vector<std::unique_ptr<ClientSocketHandle>> handles;
1625 TestCompletionCallback callback;
1626 // Make |kDefaultMaxSockets + 1| socket requests.
1627 for (int i = 0; i < kDefaultMaxSocketsPerGroup + 1; ++i) {
1628 std::unique_ptr<ClientSocketHandle> handle =
1629 std::make_unique<ClientSocketHandle>();
1630 EXPECT_EQ(ERR_IO_PENDING,
1631 handle->Init(
1632 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1633 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1634 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1635 pool_.get(), NetLogWithSource()));
1636 handles.push_back(std::move(handle));
Matt Menke7eb405e2019-04-25 20:48:211637 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menke99251ea42019-04-25 22:59:021638 EXPECT_EQ(
1639 static_cast<size_t>(std::min(i + 1, kDefaultMaxSocketsPerGroup)),
1640 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1641 }
1642
1643 if (cancel_when_callback_pending) {
1644 client_socket_factory_.SignalJobs();
1645 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1646 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1647 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1648 }
1649
1650 // Calling ResetAndCloseSocket() on a handle should not cancel a ConnectJob
1651 // or close a socket, since there are more requests than ConnectJobs or
1652 // sockets.
1653 handles[kDefaultMaxSocketsPerGroup]->ResetAndCloseSocket();
1654 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1655 if (cancel_when_callback_pending) {
1656 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1657 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1658 } else {
1659 EXPECT_EQ(static_cast<size_t>(kDefaultMaxSocketsPerGroup),
Matt Menke7eb405e2019-04-25 20:48:211660 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1661 }
Matt Menke99251ea42019-04-25 22:59:021662
1663 // Calling ResetAndCloseSocket() on other handles should cancel a ConnectJob
1664 // or close a socket.
1665 for (int i = kDefaultMaxSocketsPerGroup - 1; i >= 0; --i) {
1666 handles[i]->ResetAndCloseSocket();
1667 if (i > 0) {
1668 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1669 if (cancel_when_callback_pending) {
1670 EXPECT_EQ(i,
1671 pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1672 } else {
1673 EXPECT_EQ(static_cast<size_t>(i),
1674 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1675 }
1676 } else {
1677 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
1678 }
1679 }
Matt Menke7eb405e2019-04-25 20:48:211680 }
[email protected]f6d1d6eb2009-06-24 20:16:091681}
1682
[email protected]ab838892009-06-30 18:49:051683TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531684 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201685
[email protected]ab838892009-06-30 18:49:051686 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061687 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521688 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091689
Matt Menke28ac03e2019-02-25 22:25:501690 EXPECT_EQ(
1691 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281692 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1693 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1694 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1695 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091696
1697 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211698 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1699 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091700
Matt Menke7eb405e2019-04-25 20:48:211701 // This will create a second ConnectJob, since the other ConnectJob was
1702 // previously assigned to a request.
[email protected]6ecf2b92011-12-15 01:14:521703 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501704 EXPECT_EQ(
1705 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:281706 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1707 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501708 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1709 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091710
Matt Menke7eb405e2019-04-25 20:48:211711 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1712 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
1713
robpercival214763f2016-07-01 23:27:011714 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091715 EXPECT_FALSE(callback.have_result());
Matt Menke7eb405e2019-04-25 20:48:211716 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1717 // One ConnectJob completed, and its socket is now assigned to |handle|.
1718 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
1719 // The other ConnectJob should have either completed, or still be connecting.
1720 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1721 pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091722
1723 handle.Reset();
Matt Menke7eb405e2019-04-25 20:48:211724 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
1725 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")) +
1726 pool_->IdleSocketCountInGroup(TestGroupId("a")));
1727 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]f6d1d6eb2009-06-24 20:16:091728}
1729
[email protected]ab838892009-06-30 18:49:051730TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531731 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091732
Matt Menkec6b3edf72019-03-19 17:00:391733 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1734 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1735 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1736 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1737 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1738 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1739 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091740
1741 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201742 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131743 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1744 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091745
[email protected]2431756e2010-09-29 20:26:131746 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091747
[email protected]c9d6a1d2009-07-14 16:15:201748 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1749 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131750 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1751 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091752
[email protected]c9d6a1d2009-07-14 16:15:201753 EXPECT_EQ(1, GetOrderOfRequest(1));
1754 EXPECT_EQ(2, GetOrderOfRequest(2));
1755 EXPECT_EQ(5, GetOrderOfRequest(3));
1756 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131757 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1758 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201759 EXPECT_EQ(4, GetOrderOfRequest(6));
1760 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171761
1762 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131763 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091764}
1765
mmenke33d24423d2015-05-19 19:41:091766// Function to be used as a callback on socket request completion. It first
1767// disconnects the successfully connected socket from the first request, and
1768// then reuses the ClientSocketHandle to request another socket.
1769//
1770// |nested_callback| is called with the result of the second socket request.
1771void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261772 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091773 TestConnectJobFactory* test_connect_job_factory,
1774 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411775 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091776 int first_request_result) {
robpercival214763f2016-07-01 23:27:011777 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091778
1779 test_connect_job_factory->set_job_type(next_job_type);
1780
1781 // Don't allow reuse of the socket. Disconnect it and then release it.
1782 if (handle->socket())
1783 handle->socket()->Disconnect();
1784 handle->Reset();
1785
mmenke33d24423d2015-05-19 19:41:091786 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501787 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031788 TestGroupId("a"),
Matt Menkef09e64c2019-04-23 22:16:281789 ClientSocketPool::SocketParams::CreateForHttpForTesting(), base::nullopt,
1790 LOWEST, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke870e19ab2019-04-23 16:23:031791 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1792 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091793 if (rv != ERR_IO_PENDING) {
1794 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411795 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091796 } else {
1797 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521798 }
mmenke33d24423d2015-05-19 19:41:091799}
[email protected]f6d1d6eb2009-06-24 20:16:091800
mmenke33d24423d2015-05-19 19:41:091801// Tests the case where a second socket is requested in a completion callback,
1802// and the second socket connects asynchronously. Reuses the same
1803// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581804TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531805 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201806
[email protected]0b7648c2009-07-06 20:14:011807 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061808 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091809 TestCompletionCallback second_result_callback;
1810 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281811 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541812 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501813 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1814 connect_job_factory_, TestConnectJob::kMockPendingJob,
1815 &second_result_callback),
1816 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011817 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091818
robpercival214763f2016-07-01 23:27:011819 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581820}
[email protected]f6d1d6eb2009-06-24 20:16:091821
mmenke33d24423d2015-05-19 19:41:091822// Tests the case where a second socket is requested in a completion callback,
1823// and the second socket connects synchronously. Reuses the same
1824// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581825TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531826 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201827
[email protected]0b7648c2009-07-06 20:14:011828 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061829 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091830 TestCompletionCallback second_result_callback;
1831 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281832 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541833 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501834 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1835 connect_job_factory_, TestConnectJob::kMockPendingJob,
1836 &second_result_callback),
1837 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011838 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581839
robpercival214763f2016-07-01 23:27:011840 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091841}
1842
1843// Make sure that pending requests get serviced after active requests get
1844// cancelled.
[email protected]ab838892009-06-30 18:49:051845TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531846 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201847
[email protected]0b7648c2009-07-06 20:14:011848 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091849
Matt Menkec6b3edf72019-03-19 17:00:391850 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));
1860 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1861 IsError(ERR_IO_PENDING));
1862 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1863 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091864
[email protected]c9d6a1d2009-07-14 16:15:201865 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1866 // Let's cancel them.
1867 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131868 ASSERT_FALSE(request(i)->handle()->is_initialized());
1869 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091870 }
1871
[email protected]f6d1d6eb2009-06-24 20:16:091872 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131873 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011874 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131875 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091876 }
1877
[email protected]2431756e2010-09-29 20:26:131878 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1879 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091880}
1881
1882// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051883TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531884 const size_t kMaxSockets = 5;
1885 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201886
[email protected]0b7648c2009-07-06 20:14:011887 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091888
[email protected]211d21722009-07-22 15:48:531889 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1890 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091891
1892 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531893 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391894 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1895 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091896
[email protected]211d21722009-07-22 15:48:531897 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011898 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091899}
1900
mmenke9d72fe42017-05-18 22:36:071901// Make sure that pending requests that complete synchronously get serviced
1902// after active requests fail. See https://crbug.com/723748
1903TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1904 const size_t kNumberOfRequests = 10;
1905 const size_t kMaxSockets = 1;
1906 CreatePool(kMaxSockets, kMaxSockets);
1907
1908 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1909
Matt Menkec6b3edf72019-03-19 17:00:391910 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1911 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071912
1913 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1914
1915 // Queue up all the other requests
1916 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391917 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1918 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071919
1920 // Make sure all requests fail, instead of hanging.
1921 for (size_t i = 0; i < kNumberOfRequests; ++i)
1922 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1923}
1924
[email protected]5fc08e32009-07-15 17:09:571925TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531926 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571927
1928 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1929
[email protected]2431756e2010-09-29 20:26:131930 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521931 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501932 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281933 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501934 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1935 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011936 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571937
1938 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131939 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571940
Matt Menkef09e64c2019-04-23 22:16:281941 rv = handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
1942 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501943 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1944 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011945 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1946 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571947
[email protected]2431756e2010-09-29 20:26:131948 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481949 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571950 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1951}
1952
xunjieli26619e72016-11-23 19:39:551953TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
Matt Menke433de6d2020-03-04 00:24:111954 const char kReason[] = "Really nifty reason";
1955
xunjieli26619e72016-11-23 19:39:551956 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1957 ClientSocketHandle handle;
1958 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141959 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501960 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:281961 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501962 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1963 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551964 EXPECT_THAT(rv, IsOk());
Matt Menke433de6d2020-03-04 00:24:111965 ASSERT_TRUE(handle.socket());
1966 NetLogSource source = handle.socket()->NetLog().source();
xunjieli26619e72016-11-23 19:39:551967 handle.Reset();
1968 EXPECT_EQ(1, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111969 pool_->CloseIdleSockets(kReason);
1970 ExpectSocketClosedWithReason(source, kReason);
xunjieli26619e72016-11-23 19:39:551971}
1972
xunjieli92feb332017-03-03 17:19:231973TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231974 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1975 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:141976 RecordingBoundTestNetLog log;
xunjieli92feb332017-03-03 17:19:231977 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501978 int rv = handle1.Init(
Matt Menkef09e64c2019-04-23 22:16:281979 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501980 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1981 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231982 EXPECT_THAT(rv, IsOk());
1983 ClientSocketHandle handle2;
Matt Menkef09e64c2019-04-23 22:16:281984 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
1985 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501986 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1987 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231988 ClientSocketHandle handle3;
Matt Menkef09e64c2019-04-23 22:16:281989 rv = handle3.Init(TestGroupId("b"), params_, base::nullopt, LOWEST,
1990 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501991 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1992 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231993 EXPECT_THAT(rv, IsOk());
1994 handle1.Reset();
1995 handle2.Reset();
1996 handle3.Reset();
1997 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menke433de6d2020-03-04 00:24:111998 pool_->CloseIdleSocketsInGroup(TestGroupId("a"), "Very good reason");
xunjieli92feb332017-03-03 17:19:231999 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:232000}
2001
xunjieli26619e72016-11-23 19:39:552002TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:552003 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2004 ClientSocketHandle handle;
2005 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142006 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502007 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282008 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502009 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2010 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:552011 EXPECT_THAT(rv, IsOk());
2012 StreamSocket* socket = handle.socket();
Matt Menke433de6d2020-03-04 00:24:112013 ASSERT_TRUE(socket);
xunjieli26619e72016-11-23 19:39:552014 handle.Reset();
2015 EXPECT_EQ(1, pool_->IdleSocketCount());
2016
2017 // Disconnect socket now to make the socket unusable.
Matt Menke433de6d2020-03-04 00:24:112018 NetLogSource source = socket->NetLog().source();
xunjieli26619e72016-11-23 19:39:552019 socket->Disconnect();
2020 ClientSocketHandle handle2;
Matt Menkef09e64c2019-04-23 22:16:282021 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2022 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502023 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2024 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:552025 EXPECT_THAT(rv, IsOk());
2026 EXPECT_FALSE(handle2.is_reused());
Matt Menke433de6d2020-03-04 00:24:112027
2028 // This is admittedly not an accurate error in this case, but normally code
2029 // doesn't secretly keep a raw pointers to sockets returned to the socket pool
2030 // and close them out of band, so discovering an idle socket was closed when
2031 // trying to reuse it normally means it was closed by the remote side.
2032 ExpectSocketClosedWithReason(
2033 source, TransportClientSocketPool::kRemoteSideClosedConnection);
xunjieli26619e72016-11-23 19:39:552034}
2035
[email protected]2b7523d2009-07-29 20:29:232036// Regression test for http://crbug.com/17985.
2037TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
2038 const int kMaxSockets = 3;
2039 const int kMaxSocketsPerGroup = 2;
2040 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
2041
[email protected]ac790b42009-12-02 04:31:312042 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:232043
Matt Menkec6b3edf72019-03-19 17:00:392044 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2045 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232046
2047 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:392048 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2049 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232050
2051 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:392052 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:232053
2054 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:392055 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2056 IsError(ERR_IO_PENDING));
2057 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
2058 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:232059
Matt Menkec6b3edf72019-03-19 17:00:392060 // Release the first two sockets from TestGroupId("a"). Because this is a
2061 // keepalive, the first release will unblock the pending request for
2062 // TestGroupId("a"). The second release will unblock a request for "c",
2063 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:132064 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
2065 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:232066
2067 // Closing idle sockets should not get us into trouble, but in the bug
2068 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:392069 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke433de6d2020-03-04 00:24:112070 pool_->CloseIdleSockets("Very good reason");
[email protected]eb5a99382010-07-11 03:18:262071
[email protected]2da659e2013-05-23 20:51:342072 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282073 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:232074}
2075
[email protected]4d3b05d2010-01-27 21:27:292076TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:532077 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572078
2079 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132080 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522081 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142082 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502083 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282084 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502085 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2086 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012087 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392088 EXPECT_EQ(LOAD_STATE_CONNECTING,
2089 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:482090 TestLoadTimingInfoNotConnected(handle);
2091
robpercival214763f2016-07-01 23:27:012092 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132093 EXPECT_TRUE(handle.is_initialized());
2094 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:482095 TestLoadTimingInfoConnectedNotReused(handle);
2096
[email protected]2431756e2010-09-29 20:26:132097 handle.Reset();
[email protected]034df0f32013-01-07 23:17:482098 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:302099
Eric Roman79cc7552019-07-19 02:17:542100 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402101
Matt Menke9fa17d52019-03-25 19:12:262102 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:172103 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262104 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002105 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262106 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2107 EXPECT_TRUE(LogContainsEvent(
2108 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2109 NetLogEventPhase::NONE));
2110 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:002111 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
2112 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262113 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572114}
2115
[email protected]4d3b05d2010-01-27 21:27:292116TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:572117 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:532118 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572119
2120 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:132121 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522122 TestCompletionCallback callback;
Matt Muellerd9342e3a2019-11-26 01:41:142123 RecordingBoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:182124 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:132125 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:512126 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:502127 EXPECT_EQ(
2128 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282129 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2130 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2131 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2132 pool_.get(), log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:392133 EXPECT_EQ(LOAD_STATE_CONNECTING,
2134 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012135 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132136 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512137 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:302138
Eric Roman79cc7552019-07-19 02:17:542139 auto entries = log.GetEntries();
[email protected]b2fcd0e2010-12-01 15:19:402140
Matt Menke9fa17d52019-03-25 19:12:262141 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:172142 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:262143 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:002144 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:262145 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
2146 EXPECT_TRUE(LogContainsEvent(
2147 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
2148 NetLogEventPhase::NONE));
2149 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:572150}
2151
mmenke6be122f2015-03-09 22:22:472152// Check that an async ConnectJob failure does not result in creation of a new
2153// ConnectJob when there's another pending request also waiting on its own
2154// ConnectJob. See http://crbug.com/463960.
2155TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
2156 CreatePool(2, 2);
2157 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2158
Matt Menkec6b3edf72019-03-19 17:00:392159 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2160 IsError(ERR_IO_PENDING));
2161 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2162 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:472163
robpercival214763f2016-07-01 23:27:012164 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2165 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:472166
2167 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2168}
2169
[email protected]4d3b05d2010-01-27 21:27:292170TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:102171 // TODO(eroman): Add back the log expectations! Removed them because the
2172 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:532173 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572174
2175 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:132176 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522177 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132178 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522179 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:572180
Matt Menke28ac03e2019-02-25 22:25:502181 EXPECT_EQ(
2182 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282183 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2184 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2185 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2186 pool_.get(), NetLogWithSource()));
Matt Muellerd9342e3a2019-11-26 01:41:142187 RecordingBoundTestNetLog log2;
tfarina428341112016-09-22 13:38:202188 EXPECT_EQ(
2189 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282190 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2191 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502192 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2193 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:572194
[email protected]2431756e2010-09-29 20:26:132195 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:572196
[email protected]fd7b7c92009-08-20 19:38:302197
2198 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:302199
robpercival214763f2016-07-01 23:27:012200 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132201 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:302202
2203 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:532204 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:572205}
2206
[email protected]4d3b05d2010-01-27 21:27:292207TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:342208 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2209
[email protected]17a0c6c2009-08-04 00:07:042210 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2211
Matt Menkec6b3edf72019-03-19 17:00:392212 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2213 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2214 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2215 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342216
Raul Tambre8335a6d2019-02-21 16:57:432217 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262218 static_cast<int>(
2219 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132220 (*requests())[2]->handle()->Reset();
2221 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432222 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262223 static_cast<int>(
2224 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342225
[email protected]2431756e2010-09-29 20:26:132226 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432227 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262228 static_cast<int>(
2229 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342230
[email protected]2431756e2010-09-29 20:26:132231 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432232 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:262233 static_cast<int>(
2234 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342235}
2236
[email protected]5fc08e32009-07-15 17:09:572237// When requests and ConnectJobs are not coupled, the request will get serviced
2238// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292239TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532240 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572241
2242 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322243 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572244
[email protected]2431756e2010-09-29 20:26:132245 std::vector<TestSocketRequest*> request_order;
2246 size_t completion_count; // unused
2247 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502248 int rv = req1.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282249 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502250 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2251 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012252 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2253 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572254
2255 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2256 // without a job.
2257 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2258
[email protected]2431756e2010-09-29 20:26:132259 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502260 rv = req2.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282261 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502262 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2263 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012264 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132265 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502266 rv = req3.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282267 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502268 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2269 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012270 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572271
2272 // Both Requests 2 and 3 are pending. We release socket 1 which should
2273 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332274 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342275 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282276 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332277 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012278 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332279 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572280
2281 // Signal job 2, which should service request 3.
2282
2283 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012284 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572285
Raul Tambre8335a6d2019-02-21 16:57:432286 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132287 EXPECT_EQ(&req1, request_order[0]);
2288 EXPECT_EQ(&req2, request_order[1]);
2289 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392290 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572291}
2292
2293// The requests are not coupled to the jobs. So, the requests should finish in
2294// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292295TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532296 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572297 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322298 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572299
[email protected]2431756e2010-09-29 20:26:132300 std::vector<TestSocketRequest*> request_order;
2301 size_t completion_count; // unused
2302 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502303 int rv = req1.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282304 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502305 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2306 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012307 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572308
[email protected]2431756e2010-09-29 20:26:132309 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502310 rv = req2.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282311 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502312 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2313 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012314 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572315
2316 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322317 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572318
[email protected]2431756e2010-09-29 20:26:132319 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502320 rv = req3.handle()->Init(
Matt Menkef09e64c2019-04-23 22:16:282321 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502322 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2323 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012324 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572325
robpercival214763f2016-07-01 23:27:012326 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2327 EXPECT_THAT(req2.WaitForResult(), IsOk());
2328 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572329
Raul Tambre8335a6d2019-02-21 16:57:432330 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132331 EXPECT_EQ(&req1, request_order[0]);
2332 EXPECT_EQ(&req2, request_order[1]);
2333 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572334}
2335
[email protected]03b7c8c2013-07-20 04:38:552336// Test GetLoadState in the case there's only one socket request.
2337TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532338 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552339 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572340
[email protected]2431756e2010-09-29 20:26:132341 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522342 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502343 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282344 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502345 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2346 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012347 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552348 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572349
[email protected]03b7c8c2013-07-20 04:38:552350 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2351 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2352
2353 // No point in completing the connection, since ClientSocketHandles only
2354 // expect the LoadState to be checked while connecting.
2355}
2356
2357// Test GetLoadState in the case there are two socket requests.
2358TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2359 CreatePool(2, 2);
2360 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2361
2362 ClientSocketHandle handle;
2363 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502364 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282365 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502366 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2367 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012368 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002369 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2370
2371 ClientSocketHandle handle2;
2372 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282373 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2374 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502375 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2376 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012377 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002378 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2379
Matt Menke4b69f932019-03-04 16:20:012380 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002381 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2382 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2383
Matt Menke4b69f932019-03-04 16:20:012384 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002385 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2386
Matt Menke4b69f932019-03-04 16:20:012387 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002388 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002389 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012390
2391 // Update the state of the second job.
2392 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2393
2394 // Only the state of the second request should have changed.
2395 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2396 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2397
2398 // Second job connects and the first request gets the socket. The
2399 // second handle switches to the state of the remaining ConnectJob.
2400 client_socket_factory_.SignalJob(1);
2401 EXPECT_THAT(callback.WaitForResult(), IsOk());
2402 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552403}
2404
2405// Test GetLoadState in the case the per-group limit is reached.
2406TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2407 CreatePool(2, 1);
2408 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2409
2410 ClientSocketHandle handle;
2411 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502412 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282413 TestGroupId("a"), params_, base::nullopt, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502414 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2415 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012416 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552417 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2418
2419 // Request another socket from the same pool, buth with a higher priority.
2420 // The first request should now be stalled at the socket group limit.
2421 ClientSocketHandle handle2;
2422 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282423 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
2424 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502425 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2426 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012427 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552428 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2429 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2430
2431 // The first handle should remain stalled as the other socket goes through
2432 // the connect process.
2433
2434 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2435 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2436 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2437
2438 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012439 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552440 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2441
2442 // Closing the second socket should cause the stalled handle to finally get a
2443 // ConnectJob.
2444 handle2.socket()->Disconnect();
2445 handle2.Reset();
2446 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2447}
2448
2449// Test GetLoadState in the case the per-pool limit is reached.
2450TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2451 CreatePool(2, 2);
2452 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2453
2454 ClientSocketHandle handle;
2455 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502456 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282457 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502458 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2459 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012460 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552461
2462 // Request for socket from another pool.
2463 ClientSocketHandle handle2;
2464 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282465 rv = handle2.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
2466 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502467 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2468 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012469 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552470
2471 // Request another socket from the first pool. Request should stall at the
2472 // socket pool limit.
2473 ClientSocketHandle handle3;
2474 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282475 rv = handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2476 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502477 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2478 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012479 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552480
2481 // The third handle should remain stalled as the other sockets in its group
2482 // goes through the connect process.
2483
2484 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2485 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2486
2487 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2488 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2489 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2490
2491 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012492 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552493 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2494
2495 // Closing a socket should allow the stalled handle to finally get a new
2496 // ConnectJob.
2497 handle.socket()->Disconnect();
2498 handle.Reset();
2499 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572500}
2501
Matt Menkeb57663b32019-03-01 17:17:102502TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132503 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102504 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132505
[email protected]2431756e2010-09-29 20:26:132506 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522507 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502508 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102509 ERR_CERT_COMMON_NAME_INVALID,
Matt Menkef09e64c2019-04-23 22:16:282510 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2511 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2512 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2513 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132514 EXPECT_TRUE(handle.is_initialized());
2515 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132516}
2517
Matt Menkeb57663b32019-03-01 17:17:102518TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132519 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2520
Matt Menkeb57663b32019-03-01 17:17:102521 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132522 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522523 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502524 EXPECT_EQ(
2525 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282526 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2527 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2528 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2529 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392530 EXPECT_EQ(LOAD_STATE_CONNECTING,
2531 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102532 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132533 EXPECT_TRUE(handle.is_initialized());
2534 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132535}
2536
[email protected]e60e47a2010-07-14 03:37:182537TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2538 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2539 connect_job_factory_->set_job_type(
2540 TestConnectJob::kMockAdditionalErrorStateJob);
2541
[email protected]2431756e2010-09-29 20:26:132542 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522543 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502544 EXPECT_EQ(
2545 ERR_CONNECTION_FAILED,
Matt Menkef09e64c2019-04-23 22:16:282546 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2547 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2548 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2549 pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132550 EXPECT_FALSE(handle.is_initialized());
2551 EXPECT_FALSE(handle.socket());
2552 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512553 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182554}
2555
2556TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2557 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2558
2559 connect_job_factory_->set_job_type(
2560 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132561 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522562 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502563 EXPECT_EQ(
2564 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282565 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2566 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2567 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2568 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392569 EXPECT_EQ(LOAD_STATE_CONNECTING,
2570 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012571 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132572 EXPECT_FALSE(handle.is_initialized());
2573 EXPECT_FALSE(handle.socket());
2574 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512575 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182576}
2577
martijn003cd612016-05-19 22:24:382578// Make sure we can reuse sockets.
2579TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412580 CreatePoolWithIdleTimeouts(
2581 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032582 base::TimeDelta(), // Time out unused sockets immediately.
2583 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2584
2585 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2586
2587 ClientSocketHandle handle;
2588 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502589 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282590 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502591 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2592 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012593 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392594 EXPECT_EQ(LOAD_STATE_CONNECTING,
2595 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012596 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032597
2598 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352599 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382600 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482601 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032602 handle.Reset();
2603
2604 // Should now have one idle socket.
2605 ASSERT_EQ(1, pool_->IdleSocketCount());
2606
2607 // Request a new socket. This should reuse the old socket and complete
2608 // synchronously.
Matt Muellerd9342e3a2019-11-26 01:41:142609 RecordingBoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502610 rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282611 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502612 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2613 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012614 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032615 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482616 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032617
Matt Menke9fa17d52019-03-25 19:12:262618 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392619 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262620 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032621
Eric Roman79cc7552019-07-19 02:17:542622 auto entries = log.GetEntries();
Matt Menke9fa17d52019-03-25 19:12:262623 EXPECT_TRUE(LogContainsEvent(
2624 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2625 NetLogEventPhase::NONE));
2626 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032627 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262628 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032629}
2630
martijn003cd612016-05-19 22:24:382631// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172632TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032633 CreatePoolWithIdleTimeouts(
2634 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2635 base::TimeDelta(), // Time out unused sockets immediately
2636 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412637
2638 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2639
2640 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2641
2642 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522643 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502644 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282645 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502646 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2647 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012648 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392649 EXPECT_EQ(LOAD_STATE_CONNECTING,
2650 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412651
2652 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522653 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282654 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2655 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502656 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2657 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012658 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392659 EXPECT_EQ(LOAD_STATE_CONNECTING,
2660 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412661
2662 // Cancel one of the requests. Wait for the other, which will get the first
2663 // job. Release the socket. Run the loop again to make sure the second
2664 // socket is sitting idle and the first one is released (since ReleaseSocket()
2665 // just posts a DoReleaseSocket() task).
2666
2667 handle.Reset();
robpercival214763f2016-07-01 23:27:012668 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menke433de6d2020-03-04 00:24:112669 // Get the NetLogSource for the socket, so the time out reason can be checked
2670 // at the end of the test.
2671 NetLogSource net_log_source2 = handle2.socket()->NetLog().source();
[email protected]64770b7d2011-11-16 04:30:412672 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352673 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382674 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412675 handle2.Reset();
2676
[email protected]e7b1c6d2c2012-05-05 00:54:032677 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2678 // actually become pending until 2ms after they have been created. In order
2679 // to flush all tasks, we need to wait so that we know there are no
2680 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452681 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412682
[email protected]e7b1c6d2c2012-05-05 00:54:032683 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412684 ASSERT_EQ(2, pool_->IdleSocketCount());
2685
2686 // Request a new socket. This should cleanup the unused and timed out ones.
2687 // A new socket will be created rather than reusing the idle one.
Matt Muellerd9342e3a2019-11-26 01:41:142688 RecordingBoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522689 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282690 rv = handle.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2691 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502692 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2693 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012694 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2695 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412696 EXPECT_FALSE(handle.is_reused());
2697
[email protected]e7b1c6d2c2012-05-05 00:54:032698 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262699 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392700 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262701 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412702
Eric Roman79cc7552019-07-19 02:17:542703 auto entries = log.GetEntries();
[email protected]64770b7d2011-11-16 04:30:412704 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002705 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
Matt Menke433de6d2020-03-04 00:24:112706 ExpectSocketClosedWithReason(
2707 net_log_source2, TransportClientSocketPool::kIdleTimeLimitExpired);
[email protected]64770b7d2011-11-16 04:30:412708}
2709
[email protected]2041cf342010-02-19 03:15:592710// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162711// because of multiple releasing disconnected sockets.
2712TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2713 CreatePoolWithIdleTimeouts(
2714 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2715 base::TimeDelta(), // Time out unused sockets immediately.
2716 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2717
2718 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2719
2720 // Startup 4 connect jobs. Two of them will be pending.
2721
[email protected]2431756e2010-09-29 20:26:132722 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522723 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502724 int rv = handle.Init(
Matt Menkef09e64c2019-04-23 22:16:282725 TestGroupId("a"), params_, base::nullopt, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502726 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2727 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012728 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162729
[email protected]2431756e2010-09-29 20:26:132730 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522731 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:282732 rv = handle2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2733 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502734 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2735 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012736 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162737
[email protected]2431756e2010-09-29 20:26:132738 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522739 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:282740 rv = handle3.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2741 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502742 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2743 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012744 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162745
[email protected]2431756e2010-09-29 20:26:132746 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522747 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:282748 rv = handle4.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2749 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502750 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2751 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012752 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162753
2754 // Release two disconnected sockets.
2755
[email protected]2431756e2010-09-29 20:26:132756 handle.socket()->Disconnect();
2757 handle.Reset();
2758 handle2.socket()->Disconnect();
2759 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162760
robpercival214763f2016-07-01 23:27:012761 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132762 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012763 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132764 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162765}
2766
[email protected]d7027bb2010-05-10 18:58:542767// Regression test for http://crbug.com/42267.
2768// When DoReleaseSocket() is processed for one socket, it is blocked because the
2769// other stalled groups all have releasing sockets, so no progress can be made.
2770TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2771 CreatePoolWithIdleTimeouts(
2772 4 /* socket limit */, 4 /* socket limit per group */,
2773 base::TimeDelta(), // Time out unused sockets immediately.
2774 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2775
2776 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2777
2778 // Max out the socket limit with 2 per group.
2779
[email protected]2431756e2010-09-29 20:26:132780 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522781 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132782 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522783 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542784
2785 for (int i = 0; i < 2; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282786 EXPECT_EQ(OK, handle_a[i].Init(TestGroupId("a"), params_, base::nullopt,
2787 LOWEST, SocketTag(),
2788 ClientSocketPool::RespectLimits::ENABLED,
2789 callback_a[i].callback(),
2790 ClientSocketPool::ProxyAuthCallback(),
2791 pool_.get(), NetLogWithSource()));
2792 EXPECT_EQ(OK, handle_b[i].Init(TestGroupId("b"), params_, base::nullopt,
2793 LOWEST, SocketTag(),
2794 ClientSocketPool::RespectLimits::ENABLED,
2795 callback_b[i].callback(),
2796 ClientSocketPool::ProxyAuthCallback(),
2797 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542798 }
[email protected]b89f7e42010-05-20 20:37:002799
[email protected]d7027bb2010-05-10 18:58:542800 // Make 4 pending requests, 2 per group.
2801
2802 for (int i = 2; i < 4; ++i) {
Matt Menkef09e64c2019-04-23 22:16:282803 EXPECT_EQ(
2804 ERR_IO_PENDING,
2805 handle_a[i].Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
2806 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2807 callback_a[i].callback(),
2808 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2809 NetLogWithSource()));
2810 EXPECT_EQ(
2811 ERR_IO_PENDING,
2812 handle_b[i].Init(TestGroupId("b"), params_, base::nullopt, LOWEST,
2813 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2814 callback_b[i].callback(),
2815 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2816 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542817 }
2818
2819 // Release b's socket first. The order is important, because in
2820 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2821 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2822 // first, which has a releasing socket, so it refuses to start up another
2823 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132824 handle_b[0].socket()->Disconnect();
2825 handle_b[0].Reset();
2826 handle_a[0].socket()->Disconnect();
2827 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542828
2829 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282830 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542831
[email protected]2431756e2010-09-29 20:26:132832 handle_b[1].socket()->Disconnect();
2833 handle_b[1].Reset();
2834 handle_a[1].socket()->Disconnect();
2835 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542836
2837 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012838 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2839 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542840 }
2841}
2842
[email protected]fd4fe0b2010-02-08 23:02:152843TEST_F(ClientSocketPoolBaseTest,
2844 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2845 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2846
2847 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2848
Matt Menkec6b3edf72019-03-19 17:00:392849 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));
2853 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2854 IsError(ERR_IO_PENDING));
2855 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2856 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152857
robpercival214763f2016-07-01 23:27:012858 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2859 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132860 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152861
2862 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132863 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012864 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152865
[email protected]2431756e2010-09-29 20:26:132866 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012867 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132868 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152869
2870 EXPECT_EQ(1, GetOrderOfRequest(1));
2871 EXPECT_EQ(2, GetOrderOfRequest(2));
2872 EXPECT_EQ(3, GetOrderOfRequest(3));
2873 EXPECT_EQ(4, GetOrderOfRequest(4));
2874
2875 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132876 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152877}
2878
[email protected]6ecf2b92011-12-15 01:14:522879class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042880 public:
Matt Menke9fa17d52019-03-25 19:12:262881 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132882 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182883 bool reset_releasing_handle)
2884 : pool_(pool),
2885 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042886 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522887
Chris Watkins7a41d3552017-12-01 02:13:272888 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042889
2890 ClientSocketHandle* handle() { return &handle_; }
2891
Bence Béky8ddc2492018-06-13 01:02:042892 CompletionOnceCallback callback() {
2893 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2894 base::Unretained(this));
2895 }
[email protected]4f1e4982010-03-02 18:31:042896
2897 private:
[email protected]6ecf2b92011-12-15 01:14:522898 void OnComplete(int result) {
2899 SetResult(result);
2900 if (reset_releasing_handle_)
2901 handle_.Reset();
2902
Matt Menkec6b3edf72019-03-19 17:00:392903 EXPECT_EQ(
2904 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032905 handle2_.Init(
2906 TestGroupId("a"),
2907 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:282908 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
Matt Menke870e19ab2019-04-23 16:23:032909 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2910 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522911 }
2912
Matt Menke9fa17d52019-03-25 19:12:262913 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182914 int expected_result_;
2915 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042916 ClientSocketHandle handle_;
2917 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042918};
2919
[email protected]e60e47a2010-07-14 03:37:182920
2921TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2922 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2923
Matt Menkec6b3edf72019-03-19 17:00:392924 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2925 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2926 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182927
[email protected]2431756e2010-09-29 20:26:132928 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182929 client_socket_factory_.allocation_count());
2930
2931 connect_job_factory_->set_job_type(
2932 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2933 TestReleasingSocketRequest req(pool_.get(), OK, false);
Matt Menkef09e64c2019-04-23 22:16:282934 EXPECT_EQ(ERR_IO_PENDING,
2935 req.handle()->Init(
2936 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2937 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2938 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2939 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182940 // The next job should complete synchronously
2941 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2942
robpercival214763f2016-07-01 23:27:012943 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182944 EXPECT_FALSE(req.handle()->is_initialized());
2945 EXPECT_FALSE(req.handle()->socket());
2946 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512947 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182948}
2949
[email protected]b6501d3d2010-06-03 23:53:342950// http://crbug.com/44724 regression test.
2951// We start releasing the pool when we flush on network change. When that
2952// happens, the only active references are in the ClientSocketHandles. When a
2953// ConnectJob completes and calls back into the last ClientSocketHandle, that
2954// callback can release the last reference and delete the pool. After the
2955// callback finishes, we go back to the stack frame within the now-deleted pool.
2956// Executing any code that refers to members of the now-deleted pool can cause
2957// crashes.
2958TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2959 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2960 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2961
2962 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522963 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502964 EXPECT_EQ(
2965 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282966 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2967 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2968 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2969 pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342970
Matt Menke433de6d2020-03-04 00:24:112971 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]b6501d3d2010-06-03 23:53:342972
2973 // We'll call back into this now.
2974 callback.WaitForResult();
2975}
2976
[email protected]a7e38572010-06-07 18:22:242977TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2978 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2979 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2980
2981 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522982 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502983 EXPECT_EQ(
2984 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:282985 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
2986 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2987 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
2988 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012989 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242990 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:112991 NetLogSource source = handle.socket()->NetLog().source();
[email protected]a7e38572010-06-07 18:22:242992
Matt Menke433de6d2020-03-04 00:24:112993 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
[email protected]a7e38572010-06-07 18:22:242994
2995 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282996 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242997
Matt Menke28ac03e2019-02-25 22:25:502998 EXPECT_EQ(
2999 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283000 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3001 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3002 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3003 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013004 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:243005 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
Matt Menke433de6d2020-03-04 00:24:113006
3007 ExpectSocketClosedWithReason(
3008 source, TransportClientSocketPool::kSocketGenerationOutOfDate);
[email protected]a7e38572010-06-07 18:22:243009}
3010
[email protected]6ecf2b92011-12-15 01:14:523011class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:143012 public:
Matt Menke9fa17d52019-03-25 19:12:263013 ConnectWithinCallback(
3014 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:193015 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:263016 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:393017 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:143018
Chris Watkins7a41d3552017-12-01 02:13:273019 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:143020
3021 int WaitForNestedResult() {
3022 return nested_callback_.WaitForResult();
3023 }
3024
Bence Béky8ddc2492018-06-13 01:02:043025 CompletionOnceCallback callback() {
3026 return base::BindOnce(&ConnectWithinCallback::OnComplete,
3027 base::Unretained(this));
3028 }
[email protected]6ecf2b92011-12-15 01:14:523029
[email protected]06f92462010-08-31 19:24:143030 private:
[email protected]6ecf2b92011-12-15 01:14:523031 void OnComplete(int result) {
3032 SetResult(result);
Matt Menkef09e64c2019-04-23 22:16:283033 EXPECT_EQ(
3034 ERR_IO_PENDING,
3035 handle_.Init(group_id_, params_, base::nullopt, DEFAULT_PRIORITY,
3036 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3037 nested_callback_.callback(),
3038 ClientSocketPool::ProxyAuthCallback(), pool_,
3039 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:523040 }
3041
Matt Menkec6b3edf72019-03-19 17:00:393042 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:193043 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:263044 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:143045 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:523046 TestCompletionCallback nested_callback_;
3047
3048 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:143049};
3050
3051TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
3052 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3053
3054 // First job will be waiting until it gets aborted.
3055 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3056
3057 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:393058 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:503059 EXPECT_EQ(
3060 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283061 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3062 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3063 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3064 pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:143065
3066 // Second job will be started during the first callback, and will
3067 // asynchronously complete with OK.
3068 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menke433de6d2020-03-04 00:24:113069 pool_->FlushWithError(ERR_NETWORK_CHANGED, "Network changed");
robpercival214763f2016-07-01 23:27:013070 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
3071 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:143072}
3073
Matt Menke141b87f22019-01-30 02:43:033074TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:263075 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3076 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033077
3078 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3079 ClientSocketHandle handle;
3080 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503081 EXPECT_EQ(
3082 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283083 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3084 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3085 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3086 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033087 // The backup timer fires but doesn't start a new ConnectJob while resolving
3088 // the hostname.
3089 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3090 FastForwardBy(base::TimeDelta::FromMilliseconds(
3091 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3092 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3093
3094 // Once the ConnectJob has finished resolving the hostname, the backup timer
3095 // will create a ConnectJob when it fires.
3096 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
3097 FastForwardBy(base::TimeDelta::FromMilliseconds(
3098 ClientSocketPool::kMaxConnectRetryIntervalMs));
3099 EXPECT_EQ(2, client_socket_factory_.allocation_count());
3100}
3101
3102// Test that no backup socket is created when a ConnectJob connects before it
3103// completes.
3104TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:263105 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3106 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:033107
3108 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3109 ClientSocketHandle handle;
3110 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503111 EXPECT_EQ(
3112 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283113 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3114 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3115 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3116 pool_.get(), NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:033117 // The backup timer fires but doesn't start a new ConnectJob while resolving
3118 // the hostname.
3119 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
3120 FastForwardBy(base::TimeDelta::FromMilliseconds(
3121 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3122 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3123
3124 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
3125 client_socket_factory_.SetJobHasEstablishedConnection(0);
3126 FastForwardBy(base::TimeDelta::FromMilliseconds(
3127 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
3128 EXPECT_EQ(1, client_socket_factory_.allocation_count());
3129}
3130
[email protected]25eea382010-07-10 23:55:263131// Cancel a pending socket request while we're at max sockets,
3132// and verify that the backup socket firing doesn't cause a crash.
3133TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
3134 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:263135 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3136 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:263137
[email protected]4baaf9d2010-08-31 15:15:443138 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3139 // timer.
[email protected]25eea382010-07-10 23:55:263140 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3141 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523142 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503143 EXPECT_EQ(
3144 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283145 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3146 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3147 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3148 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263149
3150 // Start (MaxSockets - 1) connected sockets to reach max sockets.
3151 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3152 ClientSocketHandle handles[kDefaultMaxSockets];
3153 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:523154 TestCompletionCallback callback;
Matt Menkef09e64c2019-04-23 22:16:283155 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, base::nullopt,
3156 DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203157 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503158 callback.callback(),
3159 ClientSocketPool::ProxyAuthCallback(),
3160 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:263161 }
3162
fdoray5eeb7642016-06-22 16:11:283163 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:263164
3165 // Cancel the pending request.
3166 handle.Reset();
3167
3168 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453169 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003170 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:263171
[email protected]25eea382010-07-10 23:55:263172 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
3173}
3174
[email protected]3f00be82010-09-27 19:50:023175TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263176 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3177 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:443178
3179 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3180 // timer.
3181 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3182 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523183 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503184 EXPECT_EQ(
3185 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283186 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3187 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3188 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3189 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263190 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3191 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
3192 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3193 TestGroupId("bar")));
3194 EXPECT_EQ(
3195 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443196
3197 // Cancel the socket request. This should cancel the backup timer. Wait for
3198 // the backup time to see if it indeed got canceled.
3199 handle.Reset();
3200 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453201 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003202 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:263203 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3204 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:443205}
3206
[email protected]3f00be82010-09-27 19:50:023207TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:263208 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
3209 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:023210
3211 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
3212 // timer.
3213 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3214 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523215 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503216 EXPECT_EQ(
3217 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283218 handle.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3219 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
3220 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3221 pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:023222 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3223 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523224 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203225 EXPECT_EQ(
3226 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283227 handle2.Init(TestGroupId("bar"), params_, base::nullopt, DEFAULT_PRIORITY,
3228 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503229 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3230 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263231 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
3232 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:023233
3234 // Cancel request 1 and then complete request 2. With the requests finished,
3235 // the backup timer should be cancelled.
3236 handle.Reset();
robpercival214763f2016-07-01 23:27:013237 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023238 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453239 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003240 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023241}
3242
[email protected]eb5a99382010-07-11 03:18:263243// Test delayed socket binding for the case where we have two connects,
3244// and while one is waiting on a connect, the other frees up.
3245// The socket waiting on a connect should switch immediately to the freed
3246// up socket.
3247TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3248 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3249 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3250
3251 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523252 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503253 EXPECT_EQ(
3254 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283255 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3256 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503257 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3258 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013259 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263260
3261 // No idle sockets, no pending jobs.
3262 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263263 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263264
3265 // Create a second socket to the same host, but this one will wait.
3266 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3267 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503268 EXPECT_EQ(
3269 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283270 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3271 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503272 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3273 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263274 // No idle sockets, and one connecting job.
3275 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263276 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263277
3278 // Return the first handle to the pool. This will initiate the delayed
3279 // binding.
3280 handle1.Reset();
3281
fdoray5eeb7642016-06-22 16:11:283282 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263283
3284 // Still no idle sockets, still one pending connect job.
3285 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263286 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263287
3288 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013289 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263290
3291 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263292 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263293
3294 // Finally, signal the waiting Connect.
3295 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263296 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263297
fdoray5eeb7642016-06-22 16:11:283298 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263299}
3300
3301// Test delayed socket binding when a group is at capacity and one
3302// of the group's sockets frees up.
3303TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3304 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3305 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3306
3307 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523308 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503309 EXPECT_EQ(
3310 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283311 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3312 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503313 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3314 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013315 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263316
3317 // No idle sockets, no pending jobs.
3318 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263319 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263320
3321 // Create a second socket to the same host, but this one will wait.
3322 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3323 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503324 EXPECT_EQ(
3325 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283326 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3327 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503328 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3329 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263330 // No idle sockets, and one connecting job.
3331 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263332 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263333
3334 // Return the first handle to the pool. This will initiate the delayed
3335 // binding.
3336 handle1.Reset();
3337
fdoray5eeb7642016-06-22 16:11:283338 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263339
3340 // Still no idle sockets, still one pending connect job.
3341 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263342 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263343
3344 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013345 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263346
3347 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263348 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263349
3350 // Finally, signal the waiting Connect.
3351 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263352 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263353
fdoray5eeb7642016-06-22 16:11:283354 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263355}
3356
3357// Test out the case where we have one socket connected, one
3358// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513359// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263360// should complete, by taking the first socket's idle socket.
3361TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3362 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3363 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3364
3365 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523366 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503367 EXPECT_EQ(
3368 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283369 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3370 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503371 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3372 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013373 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263374
3375 // No idle sockets, no pending jobs.
3376 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263377 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263378
3379 // Create a second socket to the same host, but this one will wait.
3380 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3381 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503382 EXPECT_EQ(
3383 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283384 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3385 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503386 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3387 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263388 // No idle sockets, and one connecting job.
3389 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263390 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263391
3392 // Return the first handle to the pool. This will initiate the delayed
3393 // binding.
3394 handle1.Reset();
3395
fdoray5eeb7642016-06-22 16:11:283396 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263397
3398 // Still no idle sockets, still one pending connect job.
3399 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263400 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263401
3402 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013403 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263404
3405 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263406 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263407
3408 // Finally, signal the waiting Connect.
3409 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263410 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263411
fdoray5eeb7642016-06-22 16:11:283412 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263413}
3414
[email protected]2abfe90a2010-08-25 17:49:513415// Cover the case where on an available socket slot, we have one pending
3416// request that completes synchronously, thereby making the Group empty.
3417TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3418 const int kUnlimitedSockets = 100;
3419 const int kOneSocketPerGroup = 1;
3420 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3421
3422 // Make the first request asynchronous fail.
3423 // This will free up a socket slot later.
3424 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3425
3426 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523427 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203428 EXPECT_EQ(
3429 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283430 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3431 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503432 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3433 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263434 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513435
3436 // Make the second request synchronously fail. This should make the Group
3437 // empty.
3438 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3439 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523440 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513441 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3442 // when created.
tfarina428341112016-09-22 13:38:203443 EXPECT_EQ(
3444 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283445 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3446 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503447 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3448 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513449
Matt Menke9fa17d52019-03-25 19:12:263450 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513451
robpercival214763f2016-07-01 23:27:013452 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3453 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263454 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513455}
3456
[email protected]e1b54dc2010-10-06 21:27:223457TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3458 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3459
3460 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3461
3462 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523463 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203464 EXPECT_EQ(
3465 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283466 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3467 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503468 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3469 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223470
3471 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523472 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203473 EXPECT_EQ(
3474 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283475 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3476 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503477 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3478 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223479 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523480 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203481 EXPECT_EQ(
3482 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283483 handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3484 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503485 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3486 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223487
robpercival214763f2016-07-01 23:27:013488 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3489 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3490 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223491
3492 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353493 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383494 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353495 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383496 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223497
3498 handle1.Reset();
3499 handle2.Reset();
3500 handle3.Reset();
3501
Matt Menkec6b3edf72019-03-19 17:00:393502 EXPECT_EQ(OK, handle1.Init(
Matt Menkef09e64c2019-04-23 22:16:283503 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3504 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393505 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3506 pool_.get(), NetLogWithSource()));
3507 EXPECT_EQ(OK, handle2.Init(
Matt Menkef09e64c2019-04-23 22:16:283508 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3509 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393510 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3511 pool_.get(), NetLogWithSource()));
3512 EXPECT_EQ(OK, handle3.Init(
Matt Menkef09e64c2019-04-23 22:16:283513 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3514 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:393515 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3516 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223517
3518 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3519 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3520 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3521}
3522
[email protected]2c2bef152010-10-13 00:55:033523TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3524 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3525 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3526
Matt Menkef09e64c2019-04-23 22:16:283527 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3528 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033529
Matt Menke9fa17d52019-03-25 19:12:263530 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3531 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3532 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3533 TestGroupId("a")));
3534 EXPECT_EQ(2u,
3535 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393536 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033537
3538 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523539 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203540 EXPECT_EQ(
3541 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283542 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3543 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503544 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3545 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033546
3547 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523548 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203549 EXPECT_EQ(
3550 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283551 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3552 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503553 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3554 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033555
Matt Menke9fa17d52019-03-25 19:12:263556 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3557 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3558 TestGroupId("a")));
3559 EXPECT_EQ(0u,
3560 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393561 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033562
robpercival214763f2016-07-01 23:27:013563 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3564 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033565 handle1.Reset();
3566 handle2.Reset();
3567
Matt Menke9fa17d52019-03-25 19:12:263568 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3569 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3570 TestGroupId("a")));
3571 EXPECT_EQ(0u,
3572 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393573 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033574}
3575
3576TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3577 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3578 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3579
3580 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523581 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203582 EXPECT_EQ(
3583 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283584 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3585 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503586 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3587 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033588
Matt Menke9fa17d52019-03-25 19:12:263589 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3590 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3591 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3592 TestGroupId("a")));
3593 EXPECT_EQ(0u,
3594 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393595 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033596
Matt Menkef09e64c2019-04-23 22:16:283597 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3598 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033599
Matt Menke9fa17d52019-03-25 19:12:263600 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3601 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3602 TestGroupId("a")));
3603 EXPECT_EQ(1u,
3604 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393605 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033606
3607 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523608 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203609 EXPECT_EQ(
3610 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283611 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3612 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503613 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3614 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033615
Matt Menke9fa17d52019-03-25 19:12:263616 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3617 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3618 TestGroupId("a")));
3619 EXPECT_EQ(0u,
3620 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393621 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033622
robpercival214763f2016-07-01 23:27:013623 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3624 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033625 handle1.Reset();
3626 handle2.Reset();
3627
Matt Menke9fa17d52019-03-25 19:12:263628 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3629 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3630 TestGroupId("a")));
3631 EXPECT_EQ(0u,
3632 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393633 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033634}
3635
3636TEST_F(ClientSocketPoolBaseTest,
3637 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3638 CreatePool(4, 4);
3639 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3640
3641 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523642 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203643 EXPECT_EQ(
3644 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283645 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3646 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503647 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3648 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033649
3650 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523651 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203652 EXPECT_EQ(
3653 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283654 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3655 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503656 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3657 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033658
3659 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523660 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203661 EXPECT_EQ(
3662 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283663 handle3.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3664 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503665 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3666 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033667
Matt Menke9fa17d52019-03-25 19:12:263668 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3669 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3670 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3671 TestGroupId("a")));
3672 EXPECT_EQ(0u,
3673 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393674 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033675
Matt Menkef09e64c2019-04-23 22:16:283676 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3677 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033678
Matt Menke9fa17d52019-03-25 19:12:263679 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3680 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3681 TestGroupId("a")));
3682 EXPECT_EQ(0u,
3683 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393684 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033685
robpercival214763f2016-07-01 23:27:013686 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3687 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3688 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033689 handle1.Reset();
3690 handle2.Reset();
3691 handle3.Reset();
3692
Matt Menke9fa17d52019-03-25 19:12:263693 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3694 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3695 TestGroupId("a")));
3696 EXPECT_EQ(0u,
3697 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393698 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033699}
3700
3701TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3702 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3703 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3704
Matt Menke9fa17d52019-03-25 19:12:263705 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033706
Matt Menkef09e64c2019-04-23 22:16:283707 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3708 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033709
Matt Menke9fa17d52019-03-25 19:12:263710 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433711 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393712 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263713 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3714 EXPECT_EQ(
3715 kDefaultMaxSockets,
3716 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3717 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433718 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263719 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3720 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033721
Matt Menke9fa17d52019-03-25 19:12:263722 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033723
Matt Menkef09e64c2019-04-23 22:16:283724 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3725 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033726
Matt Menke9fa17d52019-03-25 19:12:263727 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033728}
3729
3730TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3731 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3732 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3733
Matt Menke9fa17d52019-03-25 19:12:263734 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033735
Matt Menkef09e64c2019-04-23 22:16:283736 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3737 kDefaultMaxSockets - 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033738
Matt Menke9fa17d52019-03-25 19:12:263739 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433740 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393741 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263742 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3743 EXPECT_EQ(
3744 kDefaultMaxSockets - 1,
3745 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3746 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433747 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263748 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3749 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483750 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033751
Matt Menke9fa17d52019-03-25 19:12:263752 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033753
Matt Menkef09e64c2019-04-23 22:16:283754 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3755 kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033756
Matt Menke9fa17d52019-03-25 19:12:263757 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3758 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483759 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033760}
3761
3762TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3763 CreatePool(4, 4);
3764 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3765
3766 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523767 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203768 EXPECT_EQ(
3769 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283770 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3771 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503772 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3773 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013774 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033775 handle1.Reset();
3776
Matt Menke9fa17d52019-03-25 19:12:263777 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3778 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3779 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3780 TestGroupId("a")));
3781 EXPECT_EQ(0u,
3782 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393783 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033784
Matt Menkef09e64c2019-04-23 22:16:283785 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3786 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033787
Matt Menke9fa17d52019-03-25 19:12:263788 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3789 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3790 TestGroupId("a")));
3791 EXPECT_EQ(1u,
3792 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393793 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033794}
3795
3796TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3797 CreatePool(4, 4);
3798 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3799
3800 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523801 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203802 EXPECT_EQ(
3803 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283804 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3805 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503806 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3807 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013808 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033809
Matt Menke9fa17d52019-03-25 19:12:263810 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3811 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3812 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3813 TestGroupId("a")));
3814 EXPECT_EQ(0u,
3815 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393816 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263817 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033818
Matt Menkef09e64c2019-04-23 22:16:283819 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3820 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033821
Matt Menke9fa17d52019-03-25 19:12:263822 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3823 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3824 TestGroupId("a")));
3825 EXPECT_EQ(1u,
3826 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393827 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263828 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033829}
3830
3831TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3832 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3833 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3834
Matt Menkef09e64c2019-04-23 22:16:283835 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3836 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033837
Matt Menke9fa17d52019-03-25 19:12:263838 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3839 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3840 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3841 TestGroupId("a")));
3842 EXPECT_EQ(0u,
3843 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433844 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393845 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033846
Matt Menkef09e64c2019-04-23 22:16:283847 pool_->RequestSockets(TestGroupId("b"), params_, base::nullopt,
3848 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033849
Matt Menke9fa17d52019-03-25 19:12:263850 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3851 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3852 TestGroupId("b")));
3853 EXPECT_EQ(0u,
3854 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433855 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393856 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033857}
3858
[email protected]3c819f522010-12-02 02:03:123859TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3860 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3861 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3862
Matt Menkef09e64c2019-04-23 22:16:283863 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3864 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123865
Matt Menke9fa17d52019-03-25 19:12:263866 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523867
3868 connect_job_factory_->set_job_type(
3869 TestConnectJob::kMockAdditionalErrorStateJob);
Matt Menkef09e64c2019-04-23 22:16:283870 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt,
3871 kDefaultMaxSocketsPerGroup, NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523872
Matt Menke9fa17d52019-03-25 19:12:263873 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123874}
3875
[email protected]8159a1c2012-06-07 00:00:103876TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033877 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433878 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033879
Matt Menkef09e64c2019-04-23 22:16:283880 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3881 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033882
Matt Menke9fa17d52019-03-25 19:12:263883 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3884 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3885 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3886 TestGroupId("a")));
3887 EXPECT_EQ(2u,
3888 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3889 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393890 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033891
Matt Menkef09e64c2019-04-23 22:16:283892 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3893 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263894 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3895 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3896 TestGroupId("a")));
3897 EXPECT_EQ(2u,
3898 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3899 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393900 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033901
3902 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523903 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203904 EXPECT_EQ(
3905 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283906 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3907 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503908 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3909 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433910
3911 client_socket_factory_.SignalJob(0);
3912 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3913
Matt Menke9fa17d52019-03-25 19:12:263914 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3915 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3916 TestGroupId("a")));
3917 EXPECT_EQ(1u,
3918 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3919 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393920 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033921
3922 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523923 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433924 EXPECT_EQ(
3925 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:283926 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
3927 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503928 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3929 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433930 client_socket_factory_.SignalJob(0);
3931 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033932
Matt Menke9fa17d52019-03-25 19:12:263933 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3934 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3935 TestGroupId("a")));
3936 EXPECT_EQ(0u,
3937 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3938 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393939 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103940
[email protected]2c2bef152010-10-13 00:55:033941 handle1.Reset();
3942 handle2.Reset();
3943
Matt Menke9fa17d52019-03-25 19:12:263944 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3945 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3946 TestGroupId("a")));
3947 EXPECT_EQ(0u,
3948 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3949 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393950 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033951
Matt Menkef09e64c2019-04-23 22:16:283952 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3953 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263954 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3955 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3956 TestGroupId("a")));
3957 EXPECT_EQ(0u,
3958 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3959 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393960 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033961}
3962
3963TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3964 CreatePool(4, 4);
3965 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3966
Matt Menkef09e64c2019-04-23 22:16:283967 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3968 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033969
Matt Menke9fa17d52019-03-25 19:12:263970 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3971 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3972 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3973 TestGroupId("a")));
3974 EXPECT_EQ(1u,
3975 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393976 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033977
Matt Menkef09e64c2019-04-23 22:16:283978 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
3979 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263980 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3981 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3982 TestGroupId("a")));
3983 EXPECT_EQ(2u,
3984 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393985 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033986
Matt Menkef09e64c2019-04-23 22:16:283987 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 3,
3988 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263989 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3990 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3991 TestGroupId("a")));
3992 EXPECT_EQ(3u,
3993 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393994 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033995
Matt Menkef09e64c2019-04-23 22:16:283996 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
3997 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263998 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3999 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4000 TestGroupId("a")));
4001 EXPECT_EQ(3u,
4002 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394003 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034004}
4005
4006TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
4007 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434008 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:034009
Matt Menkef09e64c2019-04-23 22:16:284010 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4011 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:034012
Matt Menke9fa17d52019-03-25 19:12:264013 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4014 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4015 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4016 TestGroupId("a")));
4017 EXPECT_EQ(1u,
4018 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394019 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034020
4021 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524022 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204023 EXPECT_EQ(
4024 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284025 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4026 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504027 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4028 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:034029
Matt Menke9fa17d52019-03-25 19:12:264030 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4031 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4032 TestGroupId("a")));
4033 EXPECT_EQ(0u,
4034 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394035 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034036
Lily Chenecebf932018-11-02 17:15:434037 client_socket_factory_.SignalJobs();
4038 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4039
Matt Menke9fa17d52019-03-25 19:12:264040 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4041 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4042 TestGroupId("a")));
4043 EXPECT_EQ(0u,
4044 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394045 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264046 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034047
[email protected]0dc88b32014-03-26 20:12:284048 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:484049 // starts, it has a connect start time.
4050 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:034051 handle1.Reset();
4052
Matt Menkec6b3edf72019-03-19 17:00:394053 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:034054}
4055
[email protected]034df0f32013-01-07 23:17:484056// Checks that fully connected preconnect jobs have no connect times, and are
4057// marked as reused.
4058TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
4059 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4060 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkef09e64c2019-04-23 22:16:284061 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4062 NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:484063
Matt Menke9fa17d52019-03-25 19:12:264064 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4065 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4066 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4067 TestGroupId("a")));
4068 EXPECT_EQ(0u,
4069 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394070 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484071
4072 ClientSocketHandle handle;
4073 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394074 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:284075 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4076 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394077 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4078 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:484079
4080 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:394081 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:484082
4083 TestLoadTimingInfoConnectedReused(handle);
4084 handle.Reset();
4085 TestLoadTimingInfoNotConnected(handle);
4086}
4087
[email protected]dcbe168a2010-12-02 03:14:464088// http://crbug.com/64940 regression test.
4089TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
4090 const int kMaxTotalSockets = 3;
4091 const int kMaxSocketsPerGroup = 2;
4092 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:434093 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:464094
Matt Menkef6edce752019-03-19 17:21:564095 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:464096 // CloseOneIdleSocket() will try to close "a"'s idle socket.
4097
4098 // Set up one idle socket in "a".
4099 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:524100 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204101 EXPECT_EQ(
4102 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284103 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4104 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504105 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4106 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:264107 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4108 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4109 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4110 TestGroupId("a")));
4111 EXPECT_EQ(0u,
4112 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394113 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464114
Lily Chenecebf932018-11-02 17:15:434115 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014116 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264117 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4118 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4119 TestGroupId("a")));
4120 EXPECT_EQ(0u,
4121 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4122 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434123
[email protected]dcbe168a2010-12-02 03:14:464124 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394125 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:464126
4127 // Set up two active sockets in "b".
4128 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:524129 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:204130 EXPECT_EQ(
4131 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284132 handle1.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
4133 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504134 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4135 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:204136 EXPECT_EQ(
4137 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284138 handle2.Init(TestGroupId("b"), params_, base::nullopt, DEFAULT_PRIORITY,
4139 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504140 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4141 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:464142
Matt Menke9fa17d52019-03-25 19:12:264143 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
4144 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4145 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4146 TestGroupId("b")));
4147 EXPECT_EQ(0u,
4148 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394149 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:434150
4151 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:014152 ASSERT_THAT(callback1.WaitForResult(), IsOk());
4153 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394154 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264155 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4156 TestGroupId("b")));
4157 EXPECT_EQ(0u,
4158 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
4159 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464160
4161 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
4162 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
4163 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
4164 // sockets for "a", and "b" should still have 2 active sockets.
4165
Matt Menkef09e64c2019-04-23 22:16:284166 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
4167 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264168 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4169 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4170 TestGroupId("a")));
4171 EXPECT_EQ(0u,
4172 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394173 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264174 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4175 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4176 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4177 TestGroupId("b")));
4178 EXPECT_EQ(0u,
4179 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394180 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264181 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464182
4183 // Now release the 2 active sockets for "b". This will give us 1 idle socket
4184 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
4185 // "a" should result in closing 1 for "b".
4186 handle1.Reset();
4187 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394188 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264189 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464190
Matt Menkef09e64c2019-04-23 22:16:284191 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 2,
4192 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264193 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4194 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4195 TestGroupId("a")));
4196 EXPECT_EQ(1u,
4197 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394198 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264199 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
4200 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
4201 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4202 TestGroupId("b")));
4203 EXPECT_EQ(0u,
4204 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:394205 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:264206 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:464207}
4208
[email protected]b7b8be42011-07-12 12:46:414209TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264210 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4211 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074212
4213 // Make the ConnectJob hang until it times out, shorten the timeout.
4214 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4215 connect_job_factory_->set_timeout_duration(
4216 base::TimeDelta::FromMilliseconds(500));
Matt Menkef09e64c2019-04-23 22:16:284217 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4218 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264219 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4220 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4221 TestGroupId("a")));
4222 EXPECT_EQ(1u,
4223 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394224 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074225
[email protected]b7b8be42011-07-12 12:46:414226 // Verify the backup timer doesn't create a backup job, by making
4227 // the backup job a pending job instead of a waiting job, so it
4228 // *would* complete if it were created.
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594229 base::RunLoop loop;
[email protected]a9fc8fc2011-05-10 02:41:074230 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:454231 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Lukasz Krakowiak855292082020-06-19 12:43:584232 FROM_HERE, loop.QuitClosure(), base::TimeDelta::FromSeconds(1));
Lukasz Krakowiak28dcf9d62020-06-04 09:46:594233 loop.Run();
Matt Menke9fa17d52019-03-25 19:12:264234 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074235}
4236
[email protected]b7b8be42011-07-12 12:46:414237TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:264238 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
4239 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:074240
4241 // Make the ConnectJob hang forever.
4242 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Matt Menkef09e64c2019-04-23 22:16:284243 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4244 NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:264245 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4246 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4247 TestGroupId("a")));
4248 EXPECT_EQ(1u,
4249 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394250 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:284251 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:074252
4253 // Make the backup job be a pending job, so it completes normally.
4254 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4255 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:524256 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504257 EXPECT_EQ(
4258 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284259 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4260 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4261 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4262 pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:414263 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:264264 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4265 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4266 TestGroupId("a")));
4267 EXPECT_EQ(0u,
4268 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394269 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264270 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014271 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074272
4273 // The hung connect job should still be there, but everything else should be
4274 // complete.
Matt Menke9fa17d52019-03-25 19:12:264275 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4276 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4277 TestGroupId("a")));
4278 EXPECT_EQ(1u,
4279 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394280 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264281 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074282}
4283
[email protected]0dc88b32014-03-26 20:12:284284// Tests that a preconnect that starts out with unread data can still be used.
4285// http://crbug.com/334467
4286TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4287 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4288 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4289
Matt Menkef09e64c2019-04-23 22:16:284290 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4291 NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284292
Matt Menke9fa17d52019-03-25 19:12:264293 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4294 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4295 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4296 TestGroupId("a")));
4297 EXPECT_EQ(0u,
4298 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394299 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284300
4301 // Fail future jobs to be sure that handle receives the preconnected socket
4302 // rather than closing it and making a new one.
4303 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4304 ClientSocketHandle handle;
4305 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394306 EXPECT_EQ(OK, handle.Init(
Matt Menkef09e64c2019-04-23 22:16:284307 TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4308 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menkec6b3edf72019-03-19 17:00:394309 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4310 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284311
Matt Menke9fa17d52019-03-25 19:12:264312 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4313 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4314 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4315 TestGroupId("a")));
4316 EXPECT_EQ(0u,
4317 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394318 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264319 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284320
4321 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354322 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284323
4324 TestLoadTimingInfoConnectedReused(handle);
4325 handle.Reset();
4326
4327 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394328 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284329}
4330
Lily Chenecebf932018-11-02 17:15:434331TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4332 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4333 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4334
4335 ClientSocketHandle handle1;
4336 TestCompletionCallback callback1;
4337 EXPECT_EQ(
4338 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284339 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4340 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504341 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4342 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434343
Matt Menke9fa17d52019-03-25 19:12:264344 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4345 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4346 TestGroupId("a")));
4347 EXPECT_EQ(0u,
4348 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394349 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434350
Matt Menkec6b3edf72019-03-19 17:00:394351 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4352 &handle1));
Lily Chenecebf932018-11-02 17:15:434353}
4354
4355TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4356 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4357 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4358
4359 ClientSocketHandle handle1;
4360 TestCompletionCallback callback1;
4361 EXPECT_EQ(
4362 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284363 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4364 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504365 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4366 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434367
Matt Menke9fa17d52019-03-25 19:12:264368 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4369 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4370 TestGroupId("a")));
4371 EXPECT_EQ(0u,
4372 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394373 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434374
4375 ClientSocketHandle handle2;
4376 TestCompletionCallback callback2;
4377 EXPECT_EQ(
4378 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284379 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4380 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504381 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4382 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434383
Matt Menke9fa17d52019-03-25 19:12:264384 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4385 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4386 TestGroupId("a")));
4387 EXPECT_EQ(0u,
4388 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394389 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434390
Matt Menkec6b3edf72019-03-19 17:00:394391 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4392 &handle1));
4393 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4394 &handle2));
Lily Chenecebf932018-11-02 17:15:434395
4396 // One job completes. The other request should still have its job.
4397 client_socket_factory_.SignalJob(0);
4398 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4399
Matt Menke9fa17d52019-03-25 19:12:264400 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4401 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4402 TestGroupId("a")));
4403 EXPECT_EQ(0u,
4404 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4405 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394406 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434407
Matt Menkec6b3edf72019-03-19 17:00:394408 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4409 &handle2));
Lily Chenecebf932018-11-02 17:15:434410}
4411
4412TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4413 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4414 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4415
Matt Menkef09e64c2019-04-23 22:16:284416 pool_->RequestSockets(TestGroupId("a"), params_, base::nullopt, 1,
4417 NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434418
Matt Menke9fa17d52019-03-25 19:12:264419 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4420 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4421 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4422 TestGroupId("a")));
4423 EXPECT_EQ(1u,
4424 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394425 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434426
4427 ClientSocketHandle handle1;
4428 TestCompletionCallback callback1;
4429 EXPECT_EQ(
4430 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284431 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4432 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504433 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4434 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434435
Matt Menke9fa17d52019-03-25 19:12:264436 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4437 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4438 TestGroupId("a")));
4439 EXPECT_EQ(0u,
4440 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394441 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434442
Matt Menkec6b3edf72019-03-19 17:00:394443 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4444 &handle1));
Lily Chenecebf932018-11-02 17:15:434445}
4446
4447TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4448 CreatePool(kDefaultMaxSockets, 1);
4449 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4450
4451 ClientSocketHandle handle1;
4452 TestCompletionCallback callback1;
4453 EXPECT_EQ(
4454 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284455 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4456 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504457 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4458 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434459
Matt Menke9fa17d52019-03-25 19:12:264460 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4461 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4462 TestGroupId("a")));
4463 EXPECT_EQ(0u,
4464 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394465 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434466
Matt Menkec6b3edf72019-03-19 17:00:394467 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4468 &handle1));
Lily Chenecebf932018-11-02 17:15:434469
4470 // Insert a higher priority request
4471 ClientSocketHandle handle2;
4472 TestCompletionCallback callback2;
4473 EXPECT_EQ(
4474 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284475 handle2.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4476 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504477 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4478 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434479
Matt Menke9fa17d52019-03-25 19:12:264480 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4481 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4482 TestGroupId("a")));
4483 EXPECT_EQ(0u,
4484 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394485 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434486
4487 // The highest priority request should steal the job from the default priority
4488 // request.
Matt Menkec6b3edf72019-03-19 17:00:394489 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4490 &handle2));
4491 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4492 &handle1));
Lily Chenecebf932018-11-02 17:15:434493}
4494
4495TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4496 CreatePool(3, 3);
4497 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4498
4499 ClientSocketHandle handle_lowest;
4500 TestCompletionCallback callback_lowest;
Matt Menkef09e64c2019-04-23 22:16:284501 EXPECT_EQ(
4502 ERR_IO_PENDING,
4503 handle_lowest.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
4504 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4505 callback_lowest.callback(),
4506 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4507 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434508
Matt Menke9fa17d52019-03-25 19:12:264509 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4510 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4511 TestGroupId("a")));
4512 EXPECT_EQ(0u,
4513 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394514 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434515
4516 ClientSocketHandle handle_highest;
4517 TestCompletionCallback callback_highest;
Matt Menkef09e64c2019-04-23 22:16:284518 EXPECT_EQ(
4519 ERR_IO_PENDING,
4520 handle_highest.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4521 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4522 callback_highest.callback(),
4523 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4524 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434525
Matt Menke9fa17d52019-03-25 19:12:264526 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4527 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4528 TestGroupId("a")));
4529 EXPECT_EQ(0u,
4530 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394531 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434532
4533 ClientSocketHandle handle_low;
4534 TestCompletionCallback callback_low;
4535 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284536 handle_low.Init(
4537 TestGroupId("a"), params_, base::nullopt, LOW, SocketTag(),
4538 ClientSocketPool::RespectLimits::ENABLED,
4539 callback_low.callback(), ClientSocketPool::ProxyAuthCallback(),
4540 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434541
Matt Menke9fa17d52019-03-25 19:12:264542 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4543 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4544 TestGroupId("a")));
4545 EXPECT_EQ(0u,
4546 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394547 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434548
4549 ClientSocketHandle handle_lowest2;
4550 TestCompletionCallback callback_lowest2;
Matt Menkef09e64c2019-04-23 22:16:284551 EXPECT_EQ(
4552 ERR_IO_PENDING,
4553 handle_lowest2.Init(TestGroupId("a"), params_, base::nullopt, LOWEST,
4554 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4555 callback_lowest2.callback(),
4556 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4557 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434558
Matt Menke9fa17d52019-03-25 19:12:264559 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4560 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4561 TestGroupId("a")));
4562 EXPECT_EQ(0u,
4563 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394564 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434565
4566 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394567 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4568 &handle_highest));
4569 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4570 &handle_low));
4571 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4572 &handle_lowest));
4573 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4574 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434575
4576 // Add another request with medium priority. It should steal the job from the
4577 // lowest priority request with a job.
4578 ClientSocketHandle handle_medium;
4579 TestCompletionCallback callback_medium;
Matt Menkef09e64c2019-04-23 22:16:284580 EXPECT_EQ(
4581 ERR_IO_PENDING,
4582 handle_medium.Init(TestGroupId("a"), params_, base::nullopt, MEDIUM,
4583 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4584 callback_medium.callback(),
4585 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4586 NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434587
Matt Menke9fa17d52019-03-25 19:12:264588 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4589 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4590 TestGroupId("a")));
4591 EXPECT_EQ(0u,
4592 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394593 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4594 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4595 &handle_highest));
4596 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4597 &handle_medium));
4598 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4599 &handle_low));
4600 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4601 &handle_lowest));
4602 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4603 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434604}
4605
4606TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4607 CreatePool(kDefaultMaxSockets, 1);
4608 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4609
4610 ClientSocketHandle handle1;
4611 TestCompletionCallback callback1;
4612 EXPECT_EQ(
4613 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284614 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4615 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504616 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4617 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434618
Matt Menke9fa17d52019-03-25 19:12:264619 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4620 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4621 TestGroupId("a")));
4622 EXPECT_EQ(0u,
4623 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394624 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434625
4626 ClientSocketHandle handle2;
4627 TestCompletionCallback callback2;
4628 EXPECT_EQ(
4629 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284630 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4631 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504632 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4633 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434634
Matt Menke9fa17d52019-03-25 19:12:264635 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4636 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4637 TestGroupId("a")));
4638 EXPECT_EQ(0u,
4639 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394640 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434641
4642 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394643 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4644 &handle1));
4645 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4646 &handle2));
Lily Chenecebf932018-11-02 17:15:434647
4648 // Reprioritizing the second request places it above the first, and it steals
4649 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394650 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4651 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4652 &handle2));
4653 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4654 &handle1));
Lily Chenecebf932018-11-02 17:15:434655}
4656
4657TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4658 CreatePool(kDefaultMaxSockets, 1);
4659 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4660
4661 ClientSocketHandle handle1;
4662 TestCompletionCallback callback1;
4663 EXPECT_EQ(
4664 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284665 handle1.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4666 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504667 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4668 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434669
Matt Menke9fa17d52019-03-25 19:12:264670 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4671 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4672 TestGroupId("a")));
4673 EXPECT_EQ(0u,
4674 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394675 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434676
Matt Menkec6b3edf72019-03-19 17:00:394677 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4678 &handle1));
Lily Chenecebf932018-11-02 17:15:434679
4680 ClientSocketHandle handle2;
4681 TestCompletionCallback callback2;
4682 EXPECT_EQ(
4683 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284684 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4685 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504686 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4687 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434688
Matt Menke9fa17d52019-03-25 19:12:264689 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4690 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4691 TestGroupId("a")));
4692 EXPECT_EQ(0u,
4693 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394694 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434695
4696 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394697 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4698 &handle1));
4699 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4700 &handle2));
Lily Chenecebf932018-11-02 17:15:434701
4702 // The second request should get a job upon cancelling the first request.
4703 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264704 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4705 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4706 TestGroupId("a")));
4707 EXPECT_EQ(0u,
4708 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394709 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434710
Matt Menkec6b3edf72019-03-19 17:00:394711 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4712 &handle2));
Lily Chenecebf932018-11-02 17:15:434713}
4714
4715TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4716 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4717 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4718
4719 ClientSocketHandle handle1;
4720 TestCompletionCallback callback1;
4721 EXPECT_EQ(
4722 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284723 handle1.Init(TestGroupId("a"), params_, base::nullopt, HIGHEST,
4724 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504725 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4726 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434727
Matt Menke9fa17d52019-03-25 19:12:264728 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4729 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4730 TestGroupId("a")));
4731 EXPECT_EQ(0u,
4732 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394733 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434734
4735 ClientSocketHandle handle2;
4736 TestCompletionCallback callback2;
4737 EXPECT_EQ(
4738 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284739 handle2.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4740 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504741 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4742 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434743
Matt Menke9fa17d52019-03-25 19:12:264744 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4745 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4746 TestGroupId("a")));
4747 EXPECT_EQ(0u,
4748 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394749 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434750
Matt Menkec6b3edf72019-03-19 17:00:394751 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4752 &handle1));
4753 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4754 &handle2));
Lily Chenecebf932018-11-02 17:15:434755
4756 // The lower-priority job completes first. The higher-priority request should
4757 // get the socket, and the lower-priority request should get the remaining
4758 // job.
4759 client_socket_factory_.SignalJob(1);
4760 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264761 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4762 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4763 TestGroupId("a")));
4764 EXPECT_EQ(0u,
4765 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4766 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394767 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434768 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394769 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4770 &handle2));
Lily Chenecebf932018-11-02 17:15:434771}
4772
[email protected]043b68c82013-08-22 23:41:524773class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204774 public:
Matt Menke9fa17d52019-03-25 19:12:264775 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394776 const ClientSocketPool::GroupId& group_id)
4777 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524778 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204779 }
4780
Daniel Cheng4496d0822018-04-26 21:52:154781 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204782
Matt Menke9fa17d52019-03-25 19:12:264783 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504784 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034785 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:284786 base::nullopt, DEFAULT_PRIORITY, SocketTag(),
4787 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4788 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204789 }
4790
Matt Menke9fa17d52019-03-25 19:12:264791 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504792 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034793 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
Matt Menkef09e64c2019-04-23 22:16:284794 base::nullopt, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504795 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4796 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204797 }
4798
4799 bool ReleaseOneConnection() {
4800 if (!handle_.is_initialized() || !can_release_connection_) {
4801 return false;
4802 }
4803 handle_.socket()->Disconnect();
4804 handle_.Reset();
4805 return true;
4806 }
4807
4808 void set_can_release_connection(bool can_release_connection) {
4809 can_release_connection_ = can_release_connection;
4810 }
4811
4812 MOCK_METHOD0(CloseOneIdleConnection, bool());
4813
4814 private:
Matt Menke9fa17d52019-03-25 19:12:264815 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204816 ClientSocketHandle handle_;
4817 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394818 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204819 bool can_release_connection_;
4820};
4821
[email protected]58e562f2013-04-22 17:32:204822// Tests the basic case of closing an idle socket in a higher layered pool when
4823// a new request is issued and the lower layer pool is stalled.
4824TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4825 CreatePool(1, 1);
4826 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4827
Matt Menkec6b3edf72019-03-19 17:00:394828 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014829 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204830 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4831 .WillOnce(Invoke(&mock_layered_pool,
4832 &MockLayeredPool::ReleaseOneConnection));
4833 ClientSocketHandle handle;
4834 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504835 EXPECT_EQ(
4836 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284837 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4838 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4839 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4840 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014841 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204842}
4843
Matt Menke833678642019-03-05 22:05:514844// Tests the case that trying to close an idle socket in a higher layered pool
4845// fails.
4846TEST_F(ClientSocketPoolBaseTest,
4847 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4848 CreatePool(1, 1);
4849 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4850
Matt Menkec6b3edf72019-03-19 17:00:394851 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514852 mock_layered_pool.set_can_release_connection(false);
4853 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4854 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4855 .WillOnce(Invoke(&mock_layered_pool,
4856 &MockLayeredPool::ReleaseOneConnection));
4857 ClientSocketHandle handle;
4858 TestCompletionCallback callback;
4859 EXPECT_EQ(
4860 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:284861 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
4862 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4863 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4864 pool_.get(), NetLogWithSource()));
Matt Menke833678642019-03-05 22:05:514865 base::RunLoop().RunUntilIdle();
4866 EXPECT_FALSE(callback.have_result());
4867}
4868
[email protected]58e562f2013-04-22 17:32:204869// Same as above, but the idle socket is in the same group as the stalled
4870// socket, and closes the only other request in its group when closing requests
4871// in higher layered pools. This generally shouldn't happen, but it may be
4872// possible if a higher level pool issues a request and the request is
4873// subsequently cancelled. Even if it's not possible, best not to crash.
4874TEST_F(ClientSocketPoolBaseTest,
4875 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4876 CreatePool(2, 2);
4877 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4878
4879 // Need a socket in another group for the pool to be stalled (If a group
4880 // has the maximum number of connections already, it's not stalled).
4881 ClientSocketHandle handle1;
4882 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284883 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4884 DEFAULT_PRIORITY, SocketTag(),
4885 ClientSocketPool::RespectLimits::ENABLED,
4886 callback1.callback(),
4887 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4888 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204889
Matt Menkec6b3edf72019-03-19 17:00:394890 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014891 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204892 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4893 .WillOnce(Invoke(&mock_layered_pool,
4894 &MockLayeredPool::ReleaseOneConnection));
4895 ClientSocketHandle handle;
4896 TestCompletionCallback callback2;
Matt Menkef09e64c2019-04-23 22:16:284897 EXPECT_EQ(ERR_IO_PENDING,
4898 handle.Init(
4899 TestGroupId("group2"), params_, base::nullopt, DEFAULT_PRIORITY,
4900 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4901 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4902 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014903 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204904}
4905
4906// Tests the case when an idle socket can be closed when a new request is
4907// issued, and the new request belongs to a group that was previously stalled.
4908TEST_F(ClientSocketPoolBaseTest,
4909 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4910 CreatePool(2, 2);
4911 std::list<TestConnectJob::JobType> job_types;
4912 job_types.push_back(TestConnectJob::kMockJob);
4913 job_types.push_back(TestConnectJob::kMockJob);
4914 job_types.push_back(TestConnectJob::kMockJob);
4915 job_types.push_back(TestConnectJob::kMockJob);
4916 connect_job_factory_->set_job_types(&job_types);
4917
4918 ClientSocketHandle handle1;
4919 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284920 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4921 DEFAULT_PRIORITY, SocketTag(),
4922 ClientSocketPool::RespectLimits::ENABLED,
4923 callback1.callback(),
4924 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4925 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204926
Matt Menkec6b3edf72019-03-19 17:00:394927 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014928 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204929 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4930 .WillRepeatedly(Invoke(&mock_layered_pool,
4931 &MockLayeredPool::ReleaseOneConnection));
4932 mock_layered_pool.set_can_release_connection(false);
4933
4934 // The third request is made when the socket pool is in a stalled state.
4935 ClientSocketHandle handle3;
4936 TestCompletionCallback callback3;
Matt Menkef09e64c2019-04-23 22:16:284937 EXPECT_EQ(ERR_IO_PENDING,
4938 handle3.Init(
4939 TestGroupId("group3"), params_, base::nullopt, DEFAULT_PRIORITY,
4940 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4941 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4942 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204943
4944 base::RunLoop().RunUntilIdle();
4945 EXPECT_FALSE(callback3.have_result());
4946
4947 // The fourth request is made when the pool is no longer stalled. The third
4948 // request should be serviced first, since it was issued first and has the
4949 // same priority.
4950 mock_layered_pool.set_can_release_connection(true);
4951 ClientSocketHandle handle4;
4952 TestCompletionCallback callback4;
Matt Menkef09e64c2019-04-23 22:16:284953 EXPECT_EQ(ERR_IO_PENDING,
4954 handle4.Init(
4955 TestGroupId("group3"), params_, base::nullopt, DEFAULT_PRIORITY,
4956 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4957 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4958 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014959 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204960 EXPECT_FALSE(callback4.have_result());
4961
4962 // Closing a handle should free up another socket slot.
4963 handle1.Reset();
robpercival214763f2016-07-01 23:27:014964 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204965}
4966
4967// Tests the case when an idle socket can be closed when a new request is
4968// issued, and the new request belongs to a group that was previously stalled.
4969//
4970// The two differences from the above test are that the stalled requests are not
4971// in the same group as the layered pool's request, and the the fourth request
4972// has a higher priority than the third one, so gets a socket first.
4973TEST_F(ClientSocketPoolBaseTest,
4974 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4975 CreatePool(2, 2);
4976 std::list<TestConnectJob::JobType> job_types;
4977 job_types.push_back(TestConnectJob::kMockJob);
4978 job_types.push_back(TestConnectJob::kMockJob);
4979 job_types.push_back(TestConnectJob::kMockJob);
4980 job_types.push_back(TestConnectJob::kMockJob);
4981 connect_job_factory_->set_job_types(&job_types);
4982
4983 ClientSocketHandle handle1;
4984 TestCompletionCallback callback1;
Matt Menkef09e64c2019-04-23 22:16:284985 EXPECT_EQ(OK, handle1.Init(TestGroupId("group1"), params_, base::nullopt,
4986 DEFAULT_PRIORITY, SocketTag(),
4987 ClientSocketPool::RespectLimits::ENABLED,
4988 callback1.callback(),
4989 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4990 NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204991
Matt Menkec6b3edf72019-03-19 17:00:394992 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014993 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204994 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4995 .WillRepeatedly(Invoke(&mock_layered_pool,
4996 &MockLayeredPool::ReleaseOneConnection));
4997 mock_layered_pool.set_can_release_connection(false);
4998
4999 // The third request is made when the socket pool is in a stalled state.
5000 ClientSocketHandle handle3;
5001 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:205002 EXPECT_EQ(
5003 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285004 handle3.Init(TestGroupId("group3"), params_, base::nullopt, MEDIUM,
5005 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505006 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
5007 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:205008
5009 base::RunLoop().RunUntilIdle();
5010 EXPECT_FALSE(callback3.have_result());
5011
5012 // The fourth request is made when the pool is no longer stalled. This
5013 // request has a higher priority than the third request, so is serviced first.
5014 mock_layered_pool.set_can_release_connection(true);
5015 ClientSocketHandle handle4;
5016 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:205017 EXPECT_EQ(
5018 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285019 handle4.Init(TestGroupId("group3"), params_, base::nullopt, HIGHEST,
5020 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:505021 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
5022 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015023 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205024 EXPECT_FALSE(callback3.have_result());
5025
5026 // Closing a handle should free up another socket slot.
5027 handle1.Reset();
robpercival214763f2016-07-01 23:27:015028 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205029}
5030
5031TEST_F(ClientSocketPoolBaseTest,
5032 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
5033 CreatePool(1, 1);
5034 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5035
Matt Menkec6b3edf72019-03-19 17:00:395036 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:015037 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:205038 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
5039 .WillRepeatedly(Invoke(&mock_layered_pool1,
5040 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:395041 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:015042 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
5043 IsOk());
[email protected]58e562f2013-04-22 17:32:205044 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
5045 .WillRepeatedly(Invoke(&mock_layered_pool2,
5046 &MockLayeredPool::ReleaseOneConnection));
5047 ClientSocketHandle handle;
5048 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:505049 EXPECT_EQ(
5050 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285051 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
5052 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5053 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5054 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:015055 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:205056}
5057
[email protected]b021ece62013-06-11 11:06:335058// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:155059// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
5060// socket instead of a request with the same priority that was issued earlier,
5061// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:335062TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:335063 CreatePool(1, 1);
5064
5065 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395066 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5067 TestGroupId("a"), MAXIMUM_PRIORITY,
5068 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265069 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335070
5071 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5072
mmenked3641e12016-01-28 16:06:155073 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395074 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155075 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265076 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335077
mmenked3641e12016-01-28 16:06:155078 // Issue a request that ignores the limits, so a new ConnectJob is
5079 // created.
5080 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395081 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155082 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265083 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335084
robpercival214763f2016-07-01 23:27:015085 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335086 EXPECT_FALSE(request(1)->have_result());
5087}
5088
[email protected]c55fabd2013-11-04 23:26:565089// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:155090// issued for a request with RespectLimits::DISABLED is not cancelled when a
5091// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:565092TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:565093 CreatePool(1, 1);
5094
5095 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:395096 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
5097 TestGroupId("a"), MAXIMUM_PRIORITY,
5098 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265099 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565100
5101 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5102
mmenked3641e12016-01-28 16:06:155103 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395104 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155105 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:265106 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:565107
mmenked3641e12016-01-28 16:06:155108 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
5109 // created.
5110 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:395111 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:155112 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:265113 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335114
mmenked3641e12016-01-28 16:06:155115 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:335116 // should not be cancelled.
5117 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:265118 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:335119
robpercival214763f2016-07-01 23:27:015120 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:335121 EXPECT_FALSE(request(1)->have_result());
5122}
5123
Matt Menkeb57663b32019-03-01 17:17:105124TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
5125 CreatePool(1, 1);
5126
5127 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5128
5129 ClientSocketHandle handle;
5130 TestCompletionCallback callback;
5131 EXPECT_EQ(
5132 ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285133 handle.Init(TestGroupId("a"), params_, base::nullopt, DEFAULT_PRIORITY,
5134 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5135 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5136 pool_.get(), NetLogWithSource()));
Matt Menkeb57663b32019-03-01 17:17:105137
Matt Menke9fa17d52019-03-25 19:12:265138 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105139
5140 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
5141 EXPECT_FALSE(handle.is_initialized());
5142 EXPECT_FALSE(handle.socket());
5143
5144 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:265145 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105146}
5147
5148class TestAuthHelper {
5149 public:
5150 TestAuthHelper() = default;
5151 ~TestAuthHelper() = default;
5152
Matt Menkec6b3edf72019-03-19 17:00:395153 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:195154 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:265155 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:395156 RequestPriority priority = DEFAULT_PRIORITY,
5157 ClientSocketPool::RespectLimits respect_limits =
5158 ClientSocketPool::RespectLimits::ENABLED,
5159 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:105160 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkef09e64c2019-04-23 22:16:285161 handle_.Init(group_id_in, params, base::nullopt, priority,
5162 SocketTag(), respect_limits, callback_.callback(),
Matt Menkeb57663b32019-03-01 17:17:105163 base::BindRepeating(&TestAuthHelper::AuthCallback,
5164 base::Unretained(this)),
5165 pool, NetLogWithSource()));
5166 }
5167
5168 void WaitForAuth() {
5169 run_loop_ = std::make_unique<base::RunLoop>();
5170 run_loop_->Run();
5171 run_loop_.reset();
5172 }
5173
5174 void WaitForAuthAndRestartSync() {
5175 restart_sync_ = true;
5176 WaitForAuth();
5177 restart_sync_ = false;
5178 }
5179
5180 void WaitForAuthAndResetHandleSync() {
5181 reset_handle_sync_ = true;
5182 WaitForAuth();
5183 reset_handle_sync_ = false;
5184 }
5185
5186 void RestartWithAuth() {
5187 DCHECK(restart_with_auth_callback_);
5188 std::move(restart_with_auth_callback_).Run();
5189 }
5190
5191 int WaitForResult() {
5192 int result = callback_.WaitForResult();
5193 // There shouldn't be any callback waiting to be invoked once the request is
5194 // complete.
5195 EXPECT_FALSE(restart_with_auth_callback_);
5196 // The socket should only be initialized on success.
5197 EXPECT_EQ(result == OK, handle_.is_initialized());
5198 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
5199 return result;
5200 }
5201
5202 ClientSocketHandle* handle() { return &handle_; }
5203 int auth_count() const { return auth_count_; }
5204 int have_result() const { return callback_.have_result(); }
5205
5206 private:
5207 void AuthCallback(const HttpResponseInfo& response,
5208 HttpAuthController* auth_controller,
5209 base::OnceClosure restart_with_auth_callback) {
5210 EXPECT_FALSE(restart_with_auth_callback_);
5211 EXPECT_TRUE(restart_with_auth_callback);
5212
5213 // Once there's a result, this method shouldn't be invoked again.
5214 EXPECT_FALSE(callback_.have_result());
5215
5216 ++auth_count_;
5217 run_loop_->Quit();
5218 if (restart_sync_) {
5219 std::move(restart_with_auth_callback).Run();
5220 return;
5221 }
5222
5223 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
5224
5225 if (reset_handle_sync_) {
5226 handle_.Reset();
5227 return;
5228 }
5229 }
5230
5231 std::unique_ptr<base::RunLoop> run_loop_;
5232 base::OnceClosure restart_with_auth_callback_;
5233
5234 bool restart_sync_ = false;
5235 bool reset_handle_sync_ = false;
5236
5237 ClientSocketHandle handle_;
5238 int auth_count_ = 0;
5239 TestCompletionCallback callback_;
5240
5241 DISALLOW_COPY_AND_ASSIGN(TestAuthHelper);
5242};
5243
5244TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
5245 CreatePool(1, 1);
5246 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5247
5248 TestAuthHelper auth_helper;
5249 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265250 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015251 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395252 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105253
5254 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265255 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015256 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395257 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105258
5259 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265260 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015261 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395262 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105263
5264 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5265 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265266 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5267 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395268 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105269 EXPECT_EQ(0, pool_->IdleSocketCount());
5270}
5271
5272TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
5273 CreatePool(1, 1);
5274 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5275
5276 TestAuthHelper auth_helper;
5277 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265278 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015279 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395280 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105281
5282 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265283 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015284 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395285 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105286
5287 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5288 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265289 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5290 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395291 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105292 EXPECT_EQ(0, pool_->IdleSocketCount());
5293}
5294
5295TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5296 CreatePool(1, 1);
5297 connect_job_factory_->set_job_type(
5298 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5299
5300 TestAuthHelper auth_helper;
5301 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265302 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105303
5304 auth_helper.WaitForAuth();
5305 auth_helper.RestartWithAuth();
5306 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5307
5308 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265309 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105310 EXPECT_EQ(0, pool_->IdleSocketCount());
5311}
5312
5313TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5314 CreatePool(1, 1);
5315 connect_job_factory_->set_job_type(
5316 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5317
5318 TestAuthHelper auth_helper;
5319 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265320 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105321
5322 auth_helper.WaitForAuthAndRestartSync();
5323 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5324
5325 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265326 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105327 EXPECT_EQ(0, pool_->IdleSocketCount());
5328}
5329
5330TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5331 CreatePool(1, 1);
5332 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5333
5334 TestAuthHelper auth_helper;
5335 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265336 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105337
5338 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265339 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105340
5341 auth_helper.handle()->Reset();
5342
5343 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265344 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105345 EXPECT_EQ(0, pool_->IdleSocketCount());
5346 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5347 EXPECT_FALSE(auth_helper.handle()->socket());
5348}
5349
5350TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5351 CreatePool(1, 1);
5352 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5353
5354 TestAuthHelper auth_helper;
5355 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265356 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105357
5358 auth_helper.WaitForAuthAndResetHandleSync();
5359 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265360 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105361 EXPECT_EQ(0, pool_->IdleSocketCount());
5362 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5363 EXPECT_FALSE(auth_helper.handle()->socket());
5364}
5365
5366TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5367 CreatePool(1, 1);
5368 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5369
5370 TestAuthHelper auth_helper;
5371 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265372 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105373
5374 auth_helper.WaitForAuth();
5375
Matt Menke433de6d2020-03-04 00:24:115376 pool_->FlushWithError(ERR_FAILED, "Network changed");
Matt Menkeb57663b32019-03-01 17:17:105377 base::RunLoop().RunUntilIdle();
5378
5379 // When flushing the socket pool, bound sockets should delay returning the
5380 // error until completion.
5381 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265382 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105383 EXPECT_EQ(0, pool_->IdleSocketCount());
5384
5385 auth_helper.RestartWithAuth();
5386 // The callback should be called asynchronously.
5387 EXPECT_FALSE(auth_helper.have_result());
5388
5389 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265390 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105391 EXPECT_EQ(0, pool_->IdleSocketCount());
5392}
5393
5394TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5395 CreatePool(1, 1);
5396 connect_job_factory_->set_job_type(
5397 TestConnectJob::kMockAuthChallengeTwiceJob);
5398
5399 TestAuthHelper auth_helper;
5400 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265401 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015402 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395403 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105404
5405 auth_helper.WaitForAuth();
5406 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265407 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105408 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015409 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395410 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105411
5412 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265413 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015414 EXPECT_EQ(2, auth_helper.auth_count());
5415 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395416 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015417
Matt Menkeb57663b32019-03-01 17:17:105418 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265419 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105420 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015421 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395422 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105423
5424 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5425 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265426 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5427 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395428 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105429 EXPECT_EQ(0, pool_->IdleSocketCount());
5430}
5431
5432TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5433 CreatePool(1, 1);
5434 connect_job_factory_->set_job_type(
5435 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5436
5437 TestAuthHelper auth_helper;
5438 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265439 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105440
5441 auth_helper.WaitForAuth();
5442 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265443 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105444 EXPECT_EQ(1, auth_helper.auth_count());
5445
5446 auth_helper.WaitForAuth();
5447 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265448 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105449 EXPECT_EQ(2, auth_helper.auth_count());
5450
5451 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5452 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265453 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105454 EXPECT_EQ(0, pool_->IdleSocketCount());
5455}
5456
5457// Makes sure that when a bound request is destroyed, a new ConnectJob is
5458// created, if needed.
5459TEST_F(ClientSocketPoolBaseTest,
5460 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5461 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5462 connect_job_factory_->set_job_type(
5463 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5464
5465 // First request creates a ConnectJob.
5466 TestAuthHelper auth_helper1;
5467 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265468 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105469
5470 // A second request come in, but no new ConnectJob is needed, since the limit
5471 // has been reached.
5472 TestAuthHelper auth_helper2;
5473 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265474 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105475
5476 // Run until the auth callback for the first request is invoked.
5477 auth_helper1.WaitForAuth();
5478 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265479 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5480 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395481 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105482
5483 // Make connect jobs succeed, then cancel the first request, which should
5484 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5485 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5486 auth_helper1.handle()->Reset();
5487 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265488 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105489
5490 // The second ConnectJob should succeed.
5491 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5492 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265493 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105494}
5495
5496// Makes sure that when a bound request is destroyed, a new ConnectJob is
5497// created for another group, if needed.
5498TEST_F(ClientSocketPoolBaseTest,
5499 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5500 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5501 connect_job_factory_->set_job_type(
5502 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5503
5504 // First request creates a ConnectJob.
5505 TestAuthHelper auth_helper1;
5506 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265507 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105508
5509 // A second request come in, but no new ConnectJob is needed, since the limit
5510 // has been reached.
5511 TestAuthHelper auth_helper2;
5512 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395513 ClientSocketPool::RespectLimits::ENABLED,
5514 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265515 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5516 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105517
5518 // Run until the auth callback for the first request is invoked.
5519 auth_helper1.WaitForAuth();
5520 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265521 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5522 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395523 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265524 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5525 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395526 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105527
5528 // Make connect jobs succeed, then cancel the first request, which should
5529 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5530 // other group.
5531 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5532 auth_helper1.handle()->Reset();
5533 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265534 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5535 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105536
5537 // The second ConnectJob should succeed.
5538 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5539 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265540 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5541 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105542}
5543
5544// Test that once an auth challenge is bound, that's the request that gets all
5545// subsequent calls and the socket itself.
5546TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5547 CreatePool(1, 1);
5548 connect_job_factory_->set_job_type(
5549 TestConnectJob::kMockAuthChallengeTwiceJob);
5550
5551 // First request creates a ConnectJob.
5552 TestAuthHelper auth_helper1;
5553 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265554 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105555
5556 // A second, higher priority request is made.
5557 TestAuthHelper auth_helper2;
5558 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265559 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105560
5561 // Run until the auth callback for the second request is invoked.
5562 auth_helper2.WaitForAuth();
5563 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265564 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5565 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395566 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105567
5568 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5569 // ConnectJob.
5570 TestAuthHelper auth_helper3;
5571 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265572 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105573
5574 // Start a higher job that ignores limits, creating a hanging socket. It
5575 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5576 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5577 TestAuthHelper auth_helper4;
5578 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5579 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265580 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105581
5582 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5583 // again.
5584 auth_helper2.RestartWithAuth();
5585 auth_helper2.WaitForAuth();
5586 EXPECT_EQ(0, auth_helper1.auth_count());
5587 EXPECT_FALSE(auth_helper1.have_result());
5588 EXPECT_EQ(2, auth_helper2.auth_count());
5589 EXPECT_FALSE(auth_helper2.have_result());
5590 EXPECT_EQ(0, auth_helper3.auth_count());
5591 EXPECT_FALSE(auth_helper3.have_result());
5592 EXPECT_EQ(0, auth_helper4.auth_count());
5593 EXPECT_FALSE(auth_helper4.have_result());
5594
5595 // Advance auth again, and |auth_helper2| should get the socket.
5596 auth_helper2.RestartWithAuth();
5597 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5598 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5599 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265600 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5601 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105602 EXPECT_EQ(0, auth_helper1.auth_count());
5603 EXPECT_FALSE(auth_helper1.have_result());
5604 EXPECT_EQ(0, auth_helper3.auth_count());
5605 EXPECT_FALSE(auth_helper3.have_result());
5606 EXPECT_EQ(0, auth_helper4.auth_count());
5607 EXPECT_FALSE(auth_helper4.have_result());
5608
5609 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5610 // socket request should be able to claim it.
5611 auth_helper2.handle()->Reset();
5612 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5613 EXPECT_EQ(0, auth_helper1.auth_count());
5614 EXPECT_FALSE(auth_helper1.have_result());
5615 EXPECT_EQ(0, auth_helper3.auth_count());
5616 EXPECT_FALSE(auth_helper3.have_result());
5617 EXPECT_EQ(0, auth_helper4.auth_count());
5618}
5619
David Benjaminbac8dff2019-08-07 01:30:415620enum class RefreshType {
5621 kServer,
5622 kProxy,
5623};
5624
5625// Common base class to test RefreshGroup() when called from either
5626// OnSSLConfigForServerChanged() matching a specific group or the pool's proxy.
5627//
5628// Tests which test behavior specific to one or the other case should use
5629// ClientSocketPoolBaseTest directly. In particular, there is no "other group"
5630// when the pool's proxy matches.
5631class ClientSocketPoolBaseRefreshTest
5632 : public ClientSocketPoolBaseTest,
5633 public testing::WithParamInterface<RefreshType> {
5634 public:
5635 void CreatePoolForRefresh(int max_sockets,
5636 int max_sockets_per_group,
5637 bool enable_backup_connect_jobs = false) {
5638 switch (GetParam()) {
5639 case RefreshType::kServer:
5640 CreatePool(max_sockets, max_sockets_per_group,
5641 enable_backup_connect_jobs);
5642 break;
5643 case RefreshType::kProxy:
5644 CreatePoolWithIdleTimeouts(
5645 max_sockets, max_sockets_per_group, kUnusedIdleSocketTimeout,
5646 ClientSocketPool::used_idle_socket_timeout(),
5647 enable_backup_connect_jobs,
5648 ProxyServer::FromPacString("HTTPS myproxy:70"));
5649 break;
5650 }
5651 }
5652
5653 static ClientSocketPool::GroupId GetGroupId() {
5654 return TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5655 }
5656
David Benjamin6dd7e882019-10-10 02:35:235657 static ClientSocketPool::GroupId GetGroupIdInPartition() {
5658 // Note this GroupId will match GetGroupId() unless
5659 // kPartitionConnectionsByNetworkIsolationKey is enabled.
Matt Menke4807a9a2020-11-21 00:14:415660 const SchemefulSite kSite(GURL("https://b/"));
5661 const NetworkIsolationKey kNetworkIsolationKey(kSite, kSite);
David Benjamin6dd7e882019-10-10 02:35:235662 return TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5663 PrivacyMode::PRIVACY_MODE_DISABLED,
5664 kNetworkIsolationKey);
5665 }
5666
David Benjaminbac8dff2019-08-07 01:30:415667 void OnSSLConfigForServerChanged() {
5668 switch (GetParam()) {
5669 case RefreshType::kServer:
5670 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5671 break;
5672 case RefreshType::kProxy:
5673 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5674 break;
5675 }
5676 }
5677};
5678
5679INSTANTIATE_TEST_SUITE_P(RefreshType,
5680 ClientSocketPoolBaseRefreshTest,
5681 ::testing::Values(RefreshType::kServer,
5682 RefreshType::kProxy));
5683
5684TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupCreatesNewConnectJobs) {
5685 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5686 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245687
5688 // First job will be waiting until it gets aborted.
5689 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5690
5691 ClientSocketHandle handle;
5692 TestCompletionCallback callback;
5693 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285694 handle.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5695 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5696 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5697 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245698 IsError(ERR_IO_PENDING));
5699
5700 // Switch connect job types, so creating a new ConnectJob will result in
5701 // success.
5702 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5703
David Benjaminbac8dff2019-08-07 01:30:415704 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245705 EXPECT_EQ(OK, callback.WaitForResult());
5706 ASSERT_TRUE(handle.socket());
5707 EXPECT_EQ(0, pool_->IdleSocketCount());
5708 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5709 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5710 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5711 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5712}
5713
David Benjaminbac8dff2019-08-07 01:30:415714TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupClosesIdleConnectJobs) {
David Benjamin6dd7e882019-10-10 02:35:235715 base::test::ScopedFeatureList feature_list;
5716 feature_list.InitAndEnableFeature(
5717 features::kPartitionConnectionsByNetworkIsolationKey);
5718
David Benjaminbac8dff2019-08-07 01:30:415719 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5720 const ClientSocketPool::GroupId kGroupId = GetGroupId();
David Benjamin6dd7e882019-10-10 02:35:235721 const ClientSocketPool::GroupId kGroupIdInPartition = GetGroupIdInPartition();
Matt Menkebf3c767d2019-04-15 23:28:245722
Matt Menkef09e64c2019-04-23 22:16:285723 pool_->RequestSockets(kGroupId, params_, base::nullopt, 2,
5724 NetLogWithSource());
David Benjamin6dd7e882019-10-10 02:35:235725 pool_->RequestSockets(kGroupIdInPartition, params_, base::nullopt, 2,
5726 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245727 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235728 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdInPartition));
5729 EXPECT_EQ(4, pool_->IdleSocketCount());
Matt Menkebf3c767d2019-04-15 23:28:245730 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235731 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245732
David Benjaminbac8dff2019-08-07 01:30:415733 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245734 EXPECT_EQ(0, pool_->IdleSocketCount());
5735 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
David Benjamin6dd7e882019-10-10 02:35:235736 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdInPartition));
Matt Menkebf3c767d2019-04-15 23:28:245737}
5738
5739TEST_F(ClientSocketPoolBaseTest,
5740 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5741 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415742 const ClientSocketPool::GroupId kGroupId =
5743 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5744 const ClientSocketPool::GroupId kOtherGroupId =
5745 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
Matt Menkebf3c767d2019-04-15 23:28:245746
Matt Menkef09e64c2019-04-23 22:16:285747 pool_->RequestSockets(kOtherGroupId, params_, base::nullopt, 2,
5748 NetLogWithSource());
Matt Menkebf3c767d2019-04-15 23:28:245749 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5750 EXPECT_EQ(2, pool_->IdleSocketCount());
5751 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5752
David Benjaminbac8dff2019-08-07 01:30:415753 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245754 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5755 EXPECT_EQ(2, pool_->IdleSocketCount());
5756 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5757}
5758
David Benjaminbac8dff2019-08-07 01:30:415759TEST_P(ClientSocketPoolBaseRefreshTest, RefreshGroupPreventsSocketReuse) {
5760 CreatePoolForRefresh(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5761 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245762
5763 ClientSocketHandle handle;
5764 TestCompletionCallback callback;
5765 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285766 handle.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5767 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5768 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5769 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245770 IsOk());
5771 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5772 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5773
David Benjaminbac8dff2019-08-07 01:30:415774 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245775
5776 handle.Reset();
5777 EXPECT_EQ(0, pool_->IdleSocketCount());
5778 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5779}
5780
5781TEST_F(ClientSocketPoolBaseTest,
5782 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5783 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
David Benjaminbac8dff2019-08-07 01:30:415784 const ClientSocketPool::GroupId kGroupId =
5785 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5786 const ClientSocketPool::GroupId kOtherGroupId =
5787 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
Matt Menkebf3c767d2019-04-15 23:28:245788
5789 ClientSocketHandle handle;
5790 TestCompletionCallback callback;
5791 EXPECT_THAT(
Matt Menkef09e64c2019-04-23 22:16:285792 handle.Init(kOtherGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5793 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5794 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5795 pool_.get(), NetLogWithSource()),
Matt Menkebf3c767d2019-04-15 23:28:245796 IsOk());
5797 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5798 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5799
David Benjaminbac8dff2019-08-07 01:30:415800 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
Matt Menkebf3c767d2019-04-15 23:28:245801
5802 handle.Reset();
5803 EXPECT_EQ(1, pool_->IdleSocketCount());
5804 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5805 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5806}
5807
David Benjaminbac8dff2019-08-07 01:30:415808TEST_P(ClientSocketPoolBaseRefreshTest,
5809 RefreshGroupReplacesBoundConnectJobOnConnect) {
5810 CreatePoolForRefresh(1, 1);
5811 const ClientSocketPool::GroupId kGroupId = GetGroupId();
Matt Menkebf3c767d2019-04-15 23:28:245812 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5813
5814 TestAuthHelper auth_helper;
5815 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5816 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5817 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5818
5819 auth_helper.WaitForAuth();
5820
5821 // This should update the generation, but not cancel the old ConnectJob - it's
5822 // not safe to do anything while waiting on the original ConnectJob.
David Benjaminbac8dff2019-08-07 01:30:415823 OnSSLConfigForServerChanged();
Matt Menkebf3c767d2019-04-15 23:28:245824
5825 // Providing auth credentials and restarting the request with them will cause
5826 // the ConnectJob to complete successfully, but the result will be discarded
5827 // because of the generation mismatch.
5828 auth_helper.RestartWithAuth();
5829
5830 // Despite using ConnectJobs that simulate a single challenge, a second
5831 // challenge will be seen, due to using a new ConnectJob.
5832 auth_helper.WaitForAuth();
5833 auth_helper.RestartWithAuth();
5834
5835 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5836 EXPECT_TRUE(auth_helper.handle()->socket());
5837 EXPECT_EQ(2, auth_helper.auth_count());
5838
5839 // When released, the socket will be returned to the socket pool, and
5840 // available for reuse.
5841 auth_helper.handle()->Reset();
5842 EXPECT_EQ(1, pool_->IdleSocketCount());
5843 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5844 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5845}
5846
David Benjaminbac8dff2019-08-07 01:30:415847TEST_F(ClientSocketPoolBaseTest, RefreshProxyRefreshesAllGroups) {
5848 CreatePoolWithIdleTimeouts(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
5849 kUnusedIdleSocketTimeout,
5850 ClientSocketPool::used_idle_socket_timeout(),
5851 false /* no backup connect jobs */,
5852 ProxyServer::FromPacString("HTTPS myproxy:70"));
5853
5854 const ClientSocketPool::GroupId kGroupId1 =
5855 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl);
5856 const ClientSocketPool::GroupId kGroupId2 =
5857 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
5858 const ClientSocketPool::GroupId kGroupId3 =
5859 TestGroupId("c", 443, ClientSocketPool::SocketType::kSsl);
5860
5861 // Make three sockets in three different groups. The third socket is released
5862 // to the pool as idle.
5863 ClientSocketHandle handle1, handle2, handle3;
5864 TestCompletionCallback callback;
5865 EXPECT_THAT(
5866 handle1.Init(kGroupId1, params_, base::nullopt, DEFAULT_PRIORITY,
5867 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5868 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5869 pool_.get(), NetLogWithSource()),
5870 IsOk());
5871 EXPECT_THAT(
5872 handle2.Init(kGroupId2, params_, base::nullopt, DEFAULT_PRIORITY,
5873 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5874 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5875 pool_.get(), NetLogWithSource()),
5876 IsOk());
5877 EXPECT_THAT(
5878 handle3.Init(kGroupId3, params_, base::nullopt, DEFAULT_PRIORITY,
5879 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5880 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5881 pool_.get(), NetLogWithSource()),
5882 IsOk());
5883 handle3.Reset();
5884 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5885 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5886 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5887 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5888 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5889 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5890
5891 // Changes to some other proxy do not affect the pool. The idle socket remains
5892 // alive and closing |handle2| makes the socket available for the pool.
5893 pool_->OnSSLConfigForServerChanged(HostPortPair("someotherproxy", 70));
5894
5895 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5896 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5897 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5898 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId2));
5899 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId3));
5900 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId3));
5901
5902 handle2.Reset();
5903 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId2));
5904 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId2));
5905
5906 // Changes to the matching proxy refreshes all groups.
5907 pool_->OnSSLConfigForServerChanged(HostPortPair("myproxy", 70));
5908
5909 // Idle sockets are closed.
5910 EXPECT_EQ(0, pool_->IdleSocketCount());
5911 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId2));
5912 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId3));
5913
5914 // The active socket, however, continues to be active.
5915 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId1));
5916 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId1));
5917
5918 // Closing it does not make it available for the pool.
5919 handle1.Reset();
5920 EXPECT_EQ(0, pool_->IdleSocketCount());
5921 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId1));
5922}
5923
5924TEST_F(ClientSocketPoolBaseTest, RefreshBothPrivacyAndNormalSockets) {
5925 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5926
5927 const ClientSocketPool::GroupId kGroupId =
5928 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5929 PrivacyMode::PRIVACY_MODE_DISABLED);
5930 const ClientSocketPool::GroupId kGroupIdPrivacy =
5931 TestGroupId("a", 443, ClientSocketPool::SocketType::kSsl,
5932 PrivacyMode::PRIVACY_MODE_ENABLED);
5933 const ClientSocketPool::GroupId kOtherGroupId =
5934 TestGroupId("b", 443, ClientSocketPool::SocketType::kSsl);
5935
5936 // Make a socket in each groups.
5937 ClientSocketHandle handle1, handle2, handle3;
5938 TestCompletionCallback callback;
5939 EXPECT_THAT(
5940 handle1.Init(kGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5941 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5942 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5943 pool_.get(), NetLogWithSource()),
5944 IsOk());
5945 EXPECT_THAT(
5946 handle2.Init(kGroupIdPrivacy, params_, base::nullopt, DEFAULT_PRIORITY,
5947 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5948 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5949 pool_.get(), NetLogWithSource()),
5950 IsOk());
5951 EXPECT_THAT(
5952 handle3.Init(kOtherGroupId, params_, base::nullopt, DEFAULT_PRIORITY,
5953 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
5954 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
5955 pool_.get(), NetLogWithSource()),
5956 IsOk());
5957 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5958 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5959 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5960 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5961 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5962 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5963
5964 pool_->OnSSLConfigForServerChanged(HostPortPair("a", 443));
5965
5966 // Active sockets continue to be active.
5967 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5968 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5969 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5970 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupIdPrivacy));
5971 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5972 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5973
5974 // Closing them leaves kOtherGroupId alone, but kGroupId and kGroupIdPrivacy
5975 // are unusable.
5976 handle1.Reset();
5977 handle2.Reset();
5978 handle3.Reset();
5979 EXPECT_EQ(1, pool_->IdleSocketCount());
5980 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5981 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupIdPrivacy));
5982 EXPECT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5983 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5984}
5985
[email protected]f6d1d6eb2009-06-24 20:16:095986} // namespace
5987
5988} // namespace net