blob: efb74e2dca0f72271cadd395121ee503f5a0ba3e [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"
12#include "base/bind_helpers.h"
[email protected]2041cf342010-02-19 03:15:5913#include "base/callback.h"
skyostil4891b25b2015-06-11 11:43:4514#include "base/location.h"
mmenke33d24423d2015-05-19 19:41:0915#include "base/logging.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"
Alexander Timin4f9c35c2018-11-01 20:15:2018#include "base/message_loop/message_loop.h"
[email protected]034df0f32013-01-07 23:17:4819#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4520#include "base/single_thread_task_runner.h"
Avi Drissman4365a4782018-12-28 19:26:2421#include "base/stl_util.h"
[email protected]fc9be5802013-06-11 10:56:5122#include "base/strings/string_number_conversions.h"
[email protected]18b577412013-07-18 04:19:1523#include "base/strings/stringprintf.h"
[email protected]f214f8792011-01-01 02:17:0824#include "base/threading/platform_thread.h"
gabf767595f2016-05-11 18:50:3525#include "base/threading/thread_task_runner_handle.h"
[email protected]f3a1c642011-07-12 19:15:0326#include "base/values.h"
[email protected]034df0f32013-01-07 23:17:4827#include "net/base/load_timing_info.h"
[email protected]b258e0792013-01-12 07:11:5928#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0629#include "net/base/net_errors.h"
Matt Menkebdf777802019-04-22 19:38:5930#include "net/base/privacy_mode.h"
Matt Menkeaafff542019-04-22 22:09:3631#include "net/base/proxy_server.h"
[email protected]ac790b42009-12-02 04:31:3132#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0933#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3534#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5135#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0736#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0037#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1938#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0039#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5640#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4641#include "net/log/test_net_log_entry.h"
42#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0943#include "net/socket/client_socket_factory.h"
44#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2645#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2846#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5447#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1748#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4449#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1050#include "net/socket/stream_socket.h"
Matt Menke9fa17d52019-03-25 19:12:2651#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5152#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0153#include "net/test/gtest_util.h"
Bence Béky98447b12018-05-08 03:14:0154#include "net/test/test_with_scoped_task_environment.h"
Ramin Halavati0a08cc82018-02-06 07:46:3855#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4856#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0957#include "testing/gtest/include/gtest/gtest.h"
58
robpercival214763f2016-07-01 23:27:0159using net::test::IsError;
60using net::test::IsOk;
61
[email protected]51fdc7c2012-04-10 19:19:4862using ::testing::Invoke;
63using ::testing::Return;
64
[email protected]f6d1d6eb2009-06-24 20:16:0965namespace net {
66
67namespace {
68
[email protected]211d21722009-07-22 15:48:5369const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2070const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5971constexpr base::TimeDelta kUnusedIdleSocketTimeout =
72 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0173
Matt Menkebdf777802019-04-22 19:38:5974ClientSocketPool::GroupId TestGroupId(
75 const std::string& host,
76 int port = 80,
77 ClientSocketPool::SocketType socket_type =
78 ClientSocketPool::SocketType::kHttp,
79 PrivacyMode privacy_mode = PrivacyMode::PRIVACY_MODE_DISABLED) {
Matt Menkec6b3edf72019-03-19 17:00:3980 return ClientSocketPool::GroupId(HostPortPair(host, port), socket_type,
81 privacy_mode);
82}
83
[email protected]034df0f32013-01-07 23:17:4884// Make sure |handle| sets load times correctly when it has been assigned a
85// reused socket.
86void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
87 LoadTimingInfo load_timing_info;
88 // Only pass true in as |is_reused|, as in general, HttpStream types should
89 // have stricter concepts of reuse than socket pools.
90 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
91
92 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1993 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4894
[email protected]b258e0792013-01-12 07:11:5995 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
96 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4897}
98
99// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33100// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48101// of a connection where |is_reused| is false may consider the connection
102// reused.
103void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
104 EXPECT_FALSE(handle.is_reused());
105
106 LoadTimingInfo load_timing_info;
107 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
108
109 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19110 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48111
[email protected]b258e0792013-01-12 07:11:59112 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
113 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
114 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48115
116 TestLoadTimingInfoConnectedReused(handle);
117}
118
119// Make sure |handle| sets load times correctly, in the case that it does not
120// currently have a socket.
121void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
122 // Should only be set to true once a socket is assigned, if at all.
123 EXPECT_FALSE(handle.is_reused());
124
125 LoadTimingInfo load_timing_info;
126 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
127
128 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19129 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48130
[email protected]b258e0792013-01-12 07:11:59131 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
132 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48133}
134
[email protected]3268023f2011-05-05 00:08:10135class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09136 public:
[email protected]034df0f32013-01-07 23:17:48137 explicit MockClientSocket(net::NetLog* net_log)
138 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28139 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20140 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30141 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09142
[email protected]0dc88b32014-03-26 20:12:28143 // Sets whether the socket has unread data. If true, the next call to Read()
144 // will return 1 byte and IsConnectedAndIdle() will return false.
145 void set_has_unread_data(bool has_unread_data) {
146 has_unread_data_ = has_unread_data;
147 }
148
[email protected]3f55aa12011-12-07 02:03:33149 // Socket implementation.
dchengb03027d2014-10-21 12:00:20150 int Read(IOBuffer* /* buf */,
151 int len,
Brad Lassey3a814172018-04-26 03:30:21152 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28153 if (has_unread_data_ && len > 0) {
154 has_unread_data_ = false;
155 was_used_to_convey_data_ = true;
156 return 1;
157 }
[email protected]e86df8dc2013-03-30 13:18:28158 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33159 }
[email protected]ab838892009-06-30 18:49:05160
[email protected]a2b2cfc2017-12-06 09:06:08161 int Write(
162 IOBuffer* /* buf */,
163 int len,
Brad Lassey3a814172018-04-26 03:30:21164 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08165 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01166 was_used_to_convey_data_ = true;
167 return len;
[email protected]ab838892009-06-30 18:49:05168 }
Avi Drissman13fc8932015-12-20 04:40:46169 int SetReceiveBufferSize(int32_t size) override { return OK; }
170 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05171
[email protected]dbf036f2011-12-06 23:33:24172 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21173 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24174 connected_ = true;
175 return OK;
176 }
[email protected]f6d1d6eb2009-06-24 20:16:09177
dchengb03027d2014-10-21 12:00:20178 void Disconnect() override { connected_ = false; }
179 bool IsConnected() const override { return connected_; }
180 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28181 return connected_ && !has_unread_data_;
182 }
[email protected]0b7648c2009-07-06 20:14:01183
dchengb03027d2014-10-21 12:00:20184 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16185 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09186 }
[email protected]f6d1d6eb2009-06-24 20:16:09187
dchengb03027d2014-10-21 12:00:20188 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35189 return ERR_UNEXPECTED;
190 }
191
tfarina428341112016-09-22 13:38:20192 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02193
dchengb03027d2014-10-21 12:00:20194 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37195 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20196 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
197 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03198 void GetConnectionAttempts(ConnectionAttempts* out) const override {
199 out->clear();
200 }
201 void ClearConnectionAttempts() override {}
202 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49203 int64_t GetTotalReceivedBytes() const override {
204 NOTIMPLEMENTED();
205 return 0;
206 }
Paul Jensen0f49dec2017-12-12 23:39:58207 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45208
[email protected]f6d1d6eb2009-06-24 20:16:09209 private:
210 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28211 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20212 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01213 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09214
[email protected]ab838892009-06-30 18:49:05215 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09216};
217
[email protected]5fc08e32009-07-15 17:09:57218class TestConnectJob;
219
[email protected]f6d1d6eb2009-06-24 20:16:09220class MockClientSocketFactory : public ClientSocketFactory {
221 public:
[email protected]ab838892009-06-30 18:49:05222 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09223
danakj655b66c2016-04-16 00:51:38224 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04225 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41226 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19227 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41228 NOTREACHED();
danakj655b66c2016-04-16 00:51:38229 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41230 }
231
Helen Lid5bb9222018-04-12 15:33:09232 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07233 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38234 std::unique_ptr<
235 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07236 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19237 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09238 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09239 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09240 }
241
danakj655b66c2016-04-16 00:51:38242 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
Matt Menke841fc412019-03-05 23:20:12243 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27244 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21245 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13246 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09247 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38248 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09249 }
Matt Menkefd956922019-02-04 23:44:03250
Matt Menke52cd95a2019-02-08 06:16:27251 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
252 std::unique_ptr<StreamSocket> stream_socket,
253 const std::string& user_agent,
254 const HostPortPair& endpoint,
255 const ProxyServer& proxy_server,
256 HttpAuthController* http_auth_controller,
257 bool tunnel,
258 bool using_spdy,
259 NextProto negotiated_protocol,
260 ProxyDelegate* proxy_delegate,
261 bool is_https_proxy,
262 const NetworkTrafficAnnotationTag& traffic_annotation) override {
263 NOTIMPLEMENTED();
264 return nullptr;
265 }
266
[email protected]5fc08e32009-07-15 17:09:57267 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55268
[email protected]5fc08e32009-07-15 17:09:57269 void SignalJobs();
270
[email protected]03b7c8c2013-07-20 04:38:55271 void SignalJob(size_t job);
272
273 void SetJobLoadState(size_t job, LoadState load_state);
274
Matt Menke141b87f22019-01-30 02:43:03275 // Sets the HasConnectionEstablished value of the specified job to true,
276 // without invoking the callback.
277 void SetJobHasEstablishedConnection(size_t job);
278
[email protected]f6d1d6eb2009-06-24 20:16:09279 int allocation_count() const { return allocation_count_; }
280
[email protected]f6d1d6eb2009-06-24 20:16:09281 private:
282 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57283 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09284};
285
[email protected]ab838892009-06-30 18:49:05286class TestConnectJob : public ConnectJob {
287 public:
288 enum JobType {
289 kMockJob,
290 kMockFailingJob,
291 kMockPendingJob,
292 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57293 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10294
295 // Certificate errors return a socket in addition to an error code.
296 kMockCertErrorJob,
297 kMockPendingCertErrorJob,
298
[email protected]e60e47a2010-07-14 03:37:18299 kMockAdditionalErrorStateJob,
300 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28301 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10302
303 kMockAuthChallengeOnceJob,
304 kMockAuthChallengeTwiceJob,
305 kMockAuthChallengeOnceFailingJob,
306 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05307 };
308
[email protected]994d4932010-07-12 17:55:13309 // The kMockPendingJob uses a slight delay before allowing the connect
310 // to complete.
311 static const int kPendingConnectDelay = 2;
312
[email protected]ab838892009-06-30 18:49:05313 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40314 RequestPriority request_priority,
315 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34316 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43317 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05318 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43319 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40320 : ConnectJob(request_priority,
321 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38322 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43323 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38324 delegate,
325 nullptr /* net_log */,
326 NetLogSourceType::TRANSPORT_CONNECT_JOB,
327 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58328 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05329 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18330 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03331 has_established_connection_(false),
[email protected]d5492c52013-11-10 20:44:39332 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15333 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05334
[email protected]974ebd62009-08-03 23:14:34335 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13336 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34337 }
338
[email protected]03b7c8c2013-07-20 04:38:55339 void set_load_state(LoadState load_state) { load_state_ = load_state; }
340
Matt Menke141b87f22019-01-30 02:43:03341 void set_has_established_connection() {
342 DCHECK(!has_established_connection_);
343 has_established_connection_ = true;
344 }
345
[email protected]03b7c8c2013-07-20 04:38:55346 // From ConnectJob:
347
dchengb03027d2014-10-21 12:00:20348 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21349
Matt Menke141b87f22019-01-30 02:43:03350 bool HasEstablishedConnection() const override {
351 return has_established_connection_;
352 }
353
Matt Menke6f84d1f12019-04-11 19:26:47354 bool IsSSLError() const override { return store_additional_error_state_; }
355
356 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
357 if (store_additional_error_state_)
358 return base::MakeRefCounted<SSLCertRequestInfo>();
359 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18360 }
361
[email protected]974ebd62009-08-03 23:14:34362 private:
[email protected]03b7c8c2013-07-20 04:38:55363 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05364
dchengb03027d2014-10-21 12:00:20365 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05366 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35367 client_socket_factory_->CreateTransportClientSocket(
368 ignored, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05369 switch (job_type_) {
370 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13371 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10372 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05373 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13374 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10375 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05376 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57377 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47378
379 // Depending on execution timings, posting a delayed task can result
380 // in the task getting executed the at the earliest possible
381 // opportunity or only after returning once from the message loop and
382 // then a second call into the message loop. In order to make behavior
383 // more deterministic, we change the default delay to 2ms. This should
384 // always require us to wait for the second call into the message loop.
385 //
386 // N.B. The correct fix for this and similar timing problems is to
387 // abstract time for the purpose of unittests. Unfortunately, we have
388 // a lot of third-party components that directly call the various
389 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45390 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05391 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49392 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
393 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10394 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53395 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05396 return ERR_IO_PENDING;
397 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57398 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45399 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05400 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49401 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
402 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10403 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53404 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05405 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57406 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55407 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57408 client_socket_factory_->WaitForSignal(this);
409 waiting_success_ = true;
410 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10411 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13412 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10413 true /* cert_error */);
414 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13415 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45416 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13417 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49418 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
419 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10420 true /* async */, true /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53421 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13422 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18423 case kMockAdditionalErrorStateJob:
424 store_additional_error_state_ = true;
425 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10426 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18427 case kMockPendingAdditionalErrorStateJob:
428 set_load_state(LOAD_STATE_CONNECTING);
429 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45430 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18431 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49432 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
433 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10434 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53435 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18436 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28437 case kMockUnreadDataJob: {
438 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10439 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28440 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
441 return ret;
442 }
Matt Menkeb57663b32019-03-01 17:17:10443 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01444 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10445 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
446 return ERR_IO_PENDING;
447 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01448 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10449 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
450 return ERR_IO_PENDING;
451 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01452 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10453 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
454 return ERR_IO_PENDING;
455 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01456 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10457 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
458 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05459 default:
460 NOTREACHED();
danakj655b66c2016-04-16 00:51:38461 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05462 return ERR_FAILED;
463 }
464 }
465
Lily Chen02ef29a2018-11-30 16:31:43466 void ChangePriorityInternal(RequestPriority priority) override {}
467
Matt Menkeb57663b32019-03-01 17:17:10468 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13469 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03470 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05471 if (succeed) {
Matt Menkeb57663b32019-03-01 17:17:10472 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
Bence Békybdbb0e72018-08-07 21:42:59473 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10474 } else if (cert_error) {
475 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
476 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40477 } else {
[email protected]e772db3f2010-07-12 18:11:13478 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38479 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05480 }
[email protected]2ab05b52009-07-01 23:57:58481
482 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30483 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05484 return result;
485 }
486
Matt Menkeb57663b32019-03-01 17:17:10487 void DoAdvanceAuthChallenge(int remaining_challenges,
488 bool succeed_after_last_challenge) {
489 base::ThreadTaskRunnerHandle::Get()->PostTask(
490 FROM_HERE,
491 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
492 weak_factory_.GetWeakPtr(), remaining_challenges,
493 succeed_after_last_challenge));
494 }
495
496 void InvokeNextProxyAuthCallback(int remaining_challenges,
497 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01498 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10499 if (remaining_challenges == 0) {
500 DoConnect(succeed_after_last_challenge, true /* was_async */,
501 false /* cert_error */);
502 return;
503 }
504
505 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
506 // The auth tests here are just focused on ConnectJob bookkeeping.
507 HttpResponseInfo info;
508 NotifyDelegateOfProxyAuth(
509 info, nullptr /* http_auth_controller */,
510 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
511 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
512 succeed_after_last_challenge));
513 }
514
[email protected]5fc08e32009-07-15 17:09:57515 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05516 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57517 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21518 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03519 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18520 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05521
[email protected]d5492c52013-11-10 20:44:39522 base::WeakPtrFactory<TestConnectJob> weak_factory_;
523
[email protected]ab838892009-06-30 18:49:05524 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
525};
526
[email protected]d80a4322009-08-14 07:07:49527class TestConnectJobFactory
Matt Menke16f5c2e52019-03-25 21:50:40528 : public TransportClientSocketPool::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05529 public:
[email protected]034df0f32013-01-07 23:17:48530 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
531 NetLog* net_log)
Matt Menkea6f99ad2019-03-08 02:26:43532 : common_connect_job_params_(
533 nullptr /* client_socket_factory */,
534 nullptr /* host_resolver */,
Matt Menkeb88837e2019-03-20 11:50:40535 nullptr /* http_auth_cache */,
536 nullptr /* http_auth_handler_factory */,
537 nullptr /* spdy_session_pool */,
Matt Menkeb5fb42b2019-03-22 17:26:13538 nullptr /* quic_supported_versions */,
Matt Menkeb88837e2019-03-20 11:50:40539 nullptr /* quic_stream_factory */,
Matt Menkea6f99ad2019-03-08 02:26:43540 nullptr /* proxy_delegate */,
Matt Menked732ea42019-03-08 12:05:00541 nullptr /* http_user_agent_settings */,
Matt Menkea6f99ad2019-03-08 02:26:43542 SSLClientSocketContext(),
543 SSLClientSocketContext(),
544 nullptr /* socket_performance_watcher_factory */,
545 nullptr /* network_quality_estimator */,
546 net_log,
547 nullptr /* websocket_endpoint_lock_manager */),
548 job_type_(TestConnectJob::kMockJob),
Raul Tambre94493c652019-03-11 17:18:35549 job_types_(nullptr),
Matt Menkea6f99ad2019-03-08 02:26:43550 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05551
Chris Watkins7a41d3552017-12-01 02:13:27552 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05553
554 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
555
[email protected]51fdc7c2012-04-10 19:19:48556 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
557 job_types_ = job_types;
558 CHECK(!job_types_->empty());
559 }
560
[email protected]974ebd62009-08-03 23:14:34561 void set_timeout_duration(base::TimeDelta timeout_duration) {
562 timeout_duration_ = timeout_duration;
563 }
564
[email protected]3f55aa12011-12-07 02:03:33565 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55566
danakj655b66c2016-04-16 00:51:38567 std::unique_ptr<ConnectJob> NewConnectJob(
Matt Menkeaafff542019-04-22 22:09:36568 ClientSocketPool::GroupId group_id,
569 scoped_refptr<ClientSocketPool::SocketParams> socket_params,
Matt Menke16f5c2e52019-03-25 21:50:40570 RequestPriority request_priority,
571 SocketTag socket_tag,
mostynbba063d6032014-10-09 11:01:13572 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48573 EXPECT_TRUE(!job_types_ || !job_types_->empty());
574 TestConnectJob::JobType job_type = job_type_;
575 if (job_types_ && !job_types_->empty()) {
576 job_type = job_types_->front();
577 job_types_->pop_front();
578 }
Matt Menkea6f99ad2019-03-08 02:26:43579 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40580 job_type, request_priority, socket_tag, timeout_duration_,
581 &common_connect_job_params_, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05582 }
583
584 private:
Matt Menkea6f99ad2019-03-08 02:26:43585 const CommonConnectJobParams common_connect_job_params_;
[email protected]ab838892009-06-30 18:49:05586 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48587 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34588 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57589 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05590
591 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
592};
593
[email protected]a937a06d2009-08-19 21:19:24594} // namespace
595
[email protected]a937a06d2009-08-19 21:19:24596namespace {
597
[email protected]5fc08e32009-07-15 17:09:57598void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26599 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57600 (*it)->Signal();
601 }
602 waiting_jobs_.clear();
603}
604
[email protected]03b7c8c2013-07-20 04:38:55605void MockClientSocketFactory::SignalJob(size_t job) {
606 ASSERT_LT(job, waiting_jobs_.size());
607 waiting_jobs_[job]->Signal();
608 waiting_jobs_.erase(waiting_jobs_.begin() + job);
609}
610
611void MockClientSocketFactory::SetJobLoadState(size_t job,
612 LoadState load_state) {
613 ASSERT_LT(job, waiting_jobs_.size());
614 waiting_jobs_[job]->set_load_state(load_state);
615}
616
Matt Menke141b87f22019-01-30 02:43:03617void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
618 ASSERT_LT(job, waiting_jobs_.size());
619 waiting_jobs_[job]->set_has_established_connection();
620}
621
Bence Béky98447b12018-05-08 03:14:01622class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09623 protected:
Alex Clarke0def2092018-12-10 12:01:45624 ClientSocketPoolBaseTest()
625 : TestWithScopedTaskEnvironment(
626 base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
Matt Menke870e19ab2019-04-23 16:23:03627 params_(ClientSocketPool::SocketParams::CreateForHttpForTesting()) {
[email protected]636b8252011-04-08 19:56:54628 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40629 TransportClientSocketPool::connect_backup_jobs_enabled();
630 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54631 }
[email protected]2431756e2010-09-29 20:26:13632
dcheng67be2b1f2014-10-27 21:47:29633 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40634 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54635 connect_backup_jobs_enabled_);
636 }
[email protected]c9d6a1d2009-07-14 16:15:20637
Matt Menke9fa17d52019-03-25 19:12:26638 void CreatePool(int max_sockets,
639 int max_sockets_per_group,
640 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59641 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
642 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26643 ClientSocketPool::used_idle_socket_timeout(),
644 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16645 }
646
Matt Menke9fa17d52019-03-25 19:12:26647 void CreatePoolWithIdleTimeouts(int max_sockets,
648 int max_sockets_per_group,
649 base::TimeDelta unused_idle_socket_timeout,
650 base::TimeDelta used_idle_socket_timeout,
651 bool enable_backup_connect_jobs = false) {
[email protected]c9d6a1d2009-07-14 16:15:20652 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26653 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
654 std::make_unique<TestConnectJobFactory>(&client_socket_factory_,
655 &net_log_);
656 connect_job_factory_ = connect_job_factory.get();
657 pool_ = TransportClientSocketPool::CreateForTesting(
658 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
659 used_idle_socket_timeout, std::move(connect_job_factory),
660 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20661 }
[email protected]f6d1d6eb2009-06-24 20:16:09662
mmenked3641e12016-01-28 16:06:15663 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39664 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33665 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15666 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39667 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15668 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33669 }
670
Matt Menkec6b3edf72019-03-19 17:00:39671 int StartRequest(const ClientSocketPool::GroupId& group_id,
672 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15673 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39674 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09675 }
676
[email protected]2431756e2010-09-29 20:26:13677 int GetOrderOfRequest(size_t index) const {
678 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09679 }
680
[email protected]2431756e2010-09-29 20:26:13681 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
682 return test_base_.ReleaseOneConnection(keep_alive);
683 }
684
685 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
686 test_base_.ReleaseAllConnections(keep_alive);
687 }
688
689 TestSocketRequest* request(int i) { return test_base_.request(i); }
690 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38691 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42692 return test_base_.requests();
693 }
rdsmith29dbad12017-02-17 02:22:18694 // Only counts the requests that get sockets asynchronously;
695 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13696 size_t completion_count() const { return test_base_.completion_count(); }
697
vishal.b62985ca92015-04-17 08:45:51698 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54699 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09700 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04701 TestConnectJobFactory* connect_job_factory_;
Matt Menke9fa17d52019-03-25 19:12:26702 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19703 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26704 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13705 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09706};
707
[email protected]5fc08e32009-07-15 17:09:57708TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53709 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20710
[email protected]6ecf2b92011-12-15 01:14:52711 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06712 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51713 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48714 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53715
Matt Menkec6b3edf72019-03-19 17:00:39716 EXPECT_EQ(
717 OK, handle.Init(
718 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
719 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
720 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09721 EXPECT_TRUE(handle.is_initialized());
722 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48723 TestLoadTimingInfoConnectedNotReused(handle);
724
[email protected]f6d1d6eb2009-06-24 20:16:09725 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48726 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30727
mmenke43758e62015-05-04 21:09:46728 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40729 log.GetEntries(&entries);
730
Matt Menke9fa17d52019-03-25 19:12:26731 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53732 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26733 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00734 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26735 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
736 EXPECT_TRUE(LogContainsEvent(
737 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
738 NetLogEventPhase::NONE));
739 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00740 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
741 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26742 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09743}
744
[email protected]ab838892009-06-30 18:49:05745TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53746 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20747
[email protected]ab838892009-06-30 18:49:05748 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51749 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53750
[email protected]2431756e2010-09-29 20:26:13751 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52752 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18753 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13754 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51755 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50756 EXPECT_EQ(
757 ERR_CONNECTION_FAILED,
Matt Menkec6b3edf72019-03-19 17:00:39758 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:50759 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
760 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
761 log.bound()));
[email protected]2431756e2010-09-29 20:26:13762 EXPECT_FALSE(handle.socket());
763 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51764 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48765 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30766
mmenke43758e62015-05-04 21:09:46767 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40768 log.GetEntries(&entries);
769
Matt Menke9fa17d52019-03-25 19:12:26770 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17771 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26772 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00773 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26774 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
775 EXPECT_TRUE(LogContainsEvent(
776 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
777 NetLogEventPhase::NONE));
778 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09779}
780
Matt Menkef6edce752019-03-19 17:21:56781// Make sure different groups do not share sockets.
782TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
783 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
784
785 const HostPortPair kHostPortPairs[] = {
786 {"a", 80},
787 {"a", 443},
788 {"b", 80},
789 };
790
791 const ClientSocketPool::SocketType kSocketTypes[] = {
792 ClientSocketPool::SocketType::kHttp,
793 ClientSocketPool::SocketType::kSsl,
794 ClientSocketPool::SocketType::kSslVersionInterferenceProbe,
795 ClientSocketPool::SocketType::kFtp,
796 };
797
Matt Menkebdf777802019-04-22 19:38:59798 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
799 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56800
801 int total_idle_sockets = 0;
802
803 // Walk through each GroupId, making sure that requesting a socket for one
804 // group does not return a previously connected socket for another group.
805 for (const auto& host_port_pair : kHostPortPairs) {
806 SCOPED_TRACE(host_port_pair.ToString());
807 for (const auto& socket_type : kSocketTypes) {
808 SCOPED_TRACE(static_cast<int>(socket_type));
809 for (const auto& privacy_mode : kPrivacyModes) {
810 SCOPED_TRACE(privacy_mode);
811
812 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
813
814 ClientSocketPool::GroupId group_id(host_port_pair, socket_type,
815 privacy_mode);
816
Matt Menke9fa17d52019-03-25 19:12:26817 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56818
819 TestCompletionCallback callback;
820 ClientSocketHandle handle;
821
822 // Since the group is empty, requesting a socket should not complete
823 // synchronously.
824 EXPECT_THAT(
825 handle.Init(group_id, params_, DEFAULT_PRIORITY, SocketTag(),
826 ClientSocketPool::RespectLimits::ENABLED,
827 callback.callback(),
828 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
829 NetLogWithSource()),
830 IsError(ERR_IO_PENDING));
Matt Menke9fa17d52019-03-25 19:12:26831 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56832 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
833
834 EXPECT_THAT(callback.WaitForResult(), IsOk());
835 EXPECT_TRUE(handle.socket());
Matt Menke9fa17d52019-03-25 19:12:26836 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56837 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
838
839 // Return socket to pool.
840 handle.Reset();
841 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
842
843 // Requesting a socket again should return the same socket as before, so
844 // should complete synchronously.
845 EXPECT_THAT(
846 handle.Init(group_id, params_, DEFAULT_PRIORITY, SocketTag(),
847 ClientSocketPool::RespectLimits::ENABLED,
848 callback.callback(),
849 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
850 NetLogWithSource()),
851 IsOk());
852 EXPECT_TRUE(handle.socket());
853 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
854
855 // Return socket to pool again.
856 handle.Reset();
857 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
858
859 ++total_idle_sockets;
860 }
861 }
862 }
863}
864
[email protected]211d21722009-07-22 15:48:53865TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
866 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
867
[email protected]9e743cd2010-03-16 07:03:53868 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30869
Matt Menkec6b3edf72019-03-19 17:00:39870 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
871 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
872 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
873 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53874
[email protected]2431756e2010-09-29 20:26:13875 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53876 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13877 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53878
Matt Menkec6b3edf72019-03-19 17:00:39879 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
880 IsError(ERR_IO_PENDING));
881 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
882 IsError(ERR_IO_PENDING));
883 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
884 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53885
[email protected]2431756e2010-09-29 20:26:13886 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53887
[email protected]2431756e2010-09-29 20:26:13888 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53889 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13890 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53891
892 EXPECT_EQ(1, GetOrderOfRequest(1));
893 EXPECT_EQ(2, GetOrderOfRequest(2));
894 EXPECT_EQ(3, GetOrderOfRequest(3));
895 EXPECT_EQ(4, GetOrderOfRequest(4));
896 EXPECT_EQ(5, GetOrderOfRequest(5));
897 EXPECT_EQ(6, GetOrderOfRequest(6));
898 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17899
900 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13901 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53902}
903
904TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
905 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
906
[email protected]9e743cd2010-03-16 07:03:53907 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30908
[email protected]211d21722009-07-22 15:48:53909 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39910 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
911 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
912 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
913 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53914
[email protected]2431756e2010-09-29 20:26:13915 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53916 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13917 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53918
919 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:39920 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
921 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53922
[email protected]2431756e2010-09-29 20:26:13923 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53924
[email protected]2431756e2010-09-29 20:26:13925 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53926 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13927 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53928
929 EXPECT_EQ(1, GetOrderOfRequest(1));
930 EXPECT_EQ(2, GetOrderOfRequest(2));
931 EXPECT_EQ(3, GetOrderOfRequest(3));
932 EXPECT_EQ(4, GetOrderOfRequest(4));
933 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17934
935 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13936 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53937}
938
939TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
940 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
941
Matt Menkec6b3edf72019-03-19 17:00:39942 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
943 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
944 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
945 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53946
[email protected]2431756e2010-09-29 20:26:13947 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53948 client_socket_factory_.allocation_count());
949
Matt Menkec6b3edf72019-03-19 17:00:39950 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
951 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
952 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53953
[email protected]2431756e2010-09-29 20:26:13954 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53955
[email protected]2431756e2010-09-29 20:26:13956 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53957
958 // First 4 requests don't have to wait, and finish in order.
959 EXPECT_EQ(1, GetOrderOfRequest(1));
960 EXPECT_EQ(2, GetOrderOfRequest(2));
961 EXPECT_EQ(3, GetOrderOfRequest(3));
962 EXPECT_EQ(4, GetOrderOfRequest(4));
963
Matt Menkec6b3edf72019-03-19 17:00:39964 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
965 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53966 EXPECT_EQ(7, GetOrderOfRequest(5));
967 EXPECT_EQ(6, GetOrderOfRequest(6));
968 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17969
970 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13971 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53972}
973
rdsmith29dbad12017-02-17 02:22:18974// Test reprioritizing a request before completion doesn't interfere with
975// its completion.
976TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
977 CreatePool(kDefaultMaxSockets, 1);
978
Matt Menkec6b3edf72019-03-19 17:00:39979 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
980 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:18981 EXPECT_TRUE(request(0)->handle()->socket());
982 EXPECT_FALSE(request(1)->handle()->socket());
983
Lily Chenecebf932018-11-02 17:15:43984 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:18985
986 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
987
988 EXPECT_TRUE(request(1)->handle()->socket());
989}
990
991// Reprioritize a request up past another one and make sure that changes the
992// completion order.
993TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
994 CreatePool(kDefaultMaxSockets, 1);
995
Matt Menkec6b3edf72019-03-19 17:00:39996 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
997 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
998 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:18999 EXPECT_TRUE(request(0)->handle()->socket());
1000 EXPECT_FALSE(request(1)->handle()->socket());
1001 EXPECT_FALSE(request(2)->handle()->socket());
1002
1003 request(2)->handle()->SetPriority(HIGHEST);
1004
1005 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1006
1007 EXPECT_EQ(1, GetOrderOfRequest(1));
1008 EXPECT_EQ(3, GetOrderOfRequest(2));
1009 EXPECT_EQ(2, GetOrderOfRequest(3));
1010}
1011
1012// Reprioritize a request without changing relative priorities and check
1013// that the order doesn't change.
1014TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1015 CreatePool(kDefaultMaxSockets, 1);
1016
Matt Menkec6b3edf72019-03-19 17:00:391017 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1018 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1019 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181020 EXPECT_TRUE(request(0)->handle()->socket());
1021 EXPECT_FALSE(request(1)->handle()->socket());
1022 EXPECT_FALSE(request(2)->handle()->socket());
1023
1024 request(2)->handle()->SetPriority(MEDIUM);
1025
1026 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1027
1028 EXPECT_EQ(1, GetOrderOfRequest(1));
1029 EXPECT_EQ(2, GetOrderOfRequest(2));
1030 EXPECT_EQ(3, GetOrderOfRequest(3));
1031}
1032
1033// Reprioritize a request past down another one and make sure that changes the
1034// completion order.
1035TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1036 CreatePool(kDefaultMaxSockets, 1);
1037
Matt Menkec6b3edf72019-03-19 17:00:391038 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1039 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1040 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181041 EXPECT_TRUE(request(0)->handle()->socket());
1042 EXPECT_FALSE(request(1)->handle()->socket());
1043 EXPECT_FALSE(request(2)->handle()->socket());
1044
1045 request(1)->handle()->SetPriority(LOW);
1046
1047 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1048
1049 EXPECT_EQ(1, GetOrderOfRequest(1));
1050 EXPECT_EQ(3, GetOrderOfRequest(2));
1051 EXPECT_EQ(2, GetOrderOfRequest(3));
1052}
1053
1054// Reprioritize a request to the same level as another and confirm it is
1055// put after the old request.
1056TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1057 CreatePool(kDefaultMaxSockets, 1);
1058
Matt Menkec6b3edf72019-03-19 17:00:391059 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1060 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1061 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181062 EXPECT_TRUE(request(0)->handle()->socket());
1063 EXPECT_FALSE(request(1)->handle()->socket());
1064 EXPECT_FALSE(request(2)->handle()->socket());
1065
1066 request(1)->handle()->SetPriority(MEDIUM);
1067
1068 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1069
1070 EXPECT_EQ(1, GetOrderOfRequest(1));
1071 EXPECT_EQ(3, GetOrderOfRequest(2));
1072 EXPECT_EQ(2, GetOrderOfRequest(3));
1073}
1074
[email protected]211d21722009-07-22 15:48:531075TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1076 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1077
Matt Menkec6b3edf72019-03-19 17:00:391078 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1079 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1080 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1081 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531082
[email protected]2431756e2010-09-29 20:26:131083 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531084 client_socket_factory_.allocation_count());
1085
Matt Menkec6b3edf72019-03-19 17:00:391086 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1087 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1088 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531089
[email protected]2431756e2010-09-29 20:26:131090 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531091
[email protected]2431756e2010-09-29 20:26:131092 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531093 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131094 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531095
1096 // First 4 requests don't have to wait, and finish in order.
1097 EXPECT_EQ(1, GetOrderOfRequest(1));
1098 EXPECT_EQ(2, GetOrderOfRequest(2));
1099 EXPECT_EQ(3, GetOrderOfRequest(3));
1100 EXPECT_EQ(4, GetOrderOfRequest(4));
1101
1102 // Request ("b", 7) has the highest priority, but we can't make new socket for
1103 // group "b", because it has reached the per-group limit. Then we make
1104 // socket for ("c", 6), because it has higher priority than ("a", 4),
1105 // and we still can't make a socket for group "b".
1106 EXPECT_EQ(5, GetOrderOfRequest(5));
1107 EXPECT_EQ(6, GetOrderOfRequest(6));
1108 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171109
1110 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131111 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531112}
1113
1114// Make sure that we count connecting sockets against the total limit.
1115TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1116 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1117
Matt Menkec6b3edf72019-03-19 17:00:391118 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1119 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1120 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531121
1122 // Create one asynchronous request.
1123 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391124 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1125 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531126
[email protected]6b175382009-10-13 06:47:471127 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1128 // actually become pending until 2ms after they have been created. In order
1129 // to flush all tasks, we need to wait so that we know there are no
1130 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451131 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471132
[email protected]211d21722009-07-22 15:48:531133 // The next synchronous request should wait for its turn.
1134 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391135 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1136 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531137
[email protected]2431756e2010-09-29 20:26:131138 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531139
[email protected]2431756e2010-09-29 20:26:131140 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531141 client_socket_factory_.allocation_count());
1142
1143 EXPECT_EQ(1, GetOrderOfRequest(1));
1144 EXPECT_EQ(2, GetOrderOfRequest(2));
1145 EXPECT_EQ(3, GetOrderOfRequest(3));
1146 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171147 EXPECT_EQ(5, GetOrderOfRequest(5));
1148
1149 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131150 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531151}
1152
[email protected]6427fe22010-04-16 22:27:411153TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1154 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1155 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1156
Matt Menkec6b3edf72019-03-19 17:00:391157 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1158 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1159 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1160 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411161
1162 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1163
1164 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1165
Matt Menkec6b3edf72019-03-19 17:00:391166 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1167 IsError(ERR_IO_PENDING));
1168 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1169 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411170
1171 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1172
[email protected]2431756e2010-09-29 20:26:131173 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411174 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131175 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411176 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131177 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1178 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411179 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1180}
1181
[email protected]d7027bb2010-05-10 18:58:541182TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1183 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1184 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1185
1186 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521187 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501188 EXPECT_EQ(
1189 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391190 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501191 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1192 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1193 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541194
1195 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241196 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521197 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501198 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391199 handles[i].Init(
1200 TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
1201 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1202 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1203 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541204 }
1205
1206 // One will be stalled, cancel all the handles now.
1207 // This should hit the OnAvailableSocketSlot() code where we previously had
1208 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241209 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541210 handles[i].Reset();
1211}
1212
[email protected]eb5a99382010-07-11 03:18:261213TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541214 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1215 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1216
[email protected]eb5a99382010-07-11 03:18:261217 {
1218 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521219 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261220 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:391221 EXPECT_EQ(OK, handles[i].Init(TestGroupId(base::NumberToString(i)),
1222 params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541223 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501224 callbacks[i].callback(),
1225 ClientSocketPool::ProxyAuthCallback(),
1226 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261227 }
1228
1229 // Force a stalled group.
1230 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521231 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201232 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391233 stalled_handle.Init(
1234 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1235 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1236 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1237 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261238
1239 // Cancel the stalled request.
1240 stalled_handle.Reset();
1241
1242 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1243 EXPECT_EQ(0, pool_->IdleSocketCount());
1244
1245 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541246 }
1247
[email protected]43a21b82010-06-10 21:30:541248 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1249 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261250}
[email protected]43a21b82010-06-10 21:30:541251
[email protected]eb5a99382010-07-11 03:18:261252TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1253 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1254 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1255
1256 {
1257 ClientSocketHandle handles[kDefaultMaxSockets];
1258 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521259 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201260 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391261 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
1262 DEFAULT_PRIORITY, SocketTag(),
1263 ClientSocketPool::RespectLimits::ENABLED,
1264 callback.callback(),
1265 ClientSocketPool::ProxyAuthCallback(),
1266 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261267 }
1268
1269 // Force a stalled group.
1270 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1271 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521272 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201273 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391274 stalled_handle.Init(
1275 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1276 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1277 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1278 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261279
1280 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261281 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1282 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1283 TestGroupId("foo")));
1284 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1285 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261286
1287 // Cancel the stalled request.
1288 handles[0].Reset();
1289
[email protected]eb5a99382010-07-11 03:18:261290 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261291 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1292 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1293 TestGroupId("foo")));
1294 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1295 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261296
1297 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011298 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261299
1300 EXPECT_EQ(kDefaultMaxSockets + 1,
1301 client_socket_factory_.allocation_count());
1302 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261303 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1304 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1305 TestGroupId("foo")));
1306 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1307 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261308
1309 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541310 }
1311
[email protected]eb5a99382010-07-11 03:18:261312 EXPECT_EQ(1, pool_->IdleSocketCount());
1313}
[email protected]43a21b82010-06-10 21:30:541314
[email protected]eb5a99382010-07-11 03:18:261315TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1316 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1317 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541318
[email protected]eb5a99382010-07-11 03:18:261319 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521320 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261321 {
[email protected]51fdc7c2012-04-10 19:19:481322 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261323 ClientSocketHandle handles[kDefaultMaxSockets];
1324 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521325 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391326 EXPECT_EQ(
1327 OK, handles[i].Init(TestGroupId(base::StringPrintf("Take 2: %d", i)),
1328 params_, DEFAULT_PRIORITY, SocketTag(),
1329 ClientSocketPool::RespectLimits::ENABLED,
1330 callback.callback(),
1331 ClientSocketPool::ProxyAuthCallback(),
1332 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261333 }
1334
1335 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1336 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481337 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261338
1339 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201340 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391341 stalled_handle.Init(
1342 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1343 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1344 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1345 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481346 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261347
1348 // Dropping out of scope will close all handles and return them to idle.
1349 }
[email protected]43a21b82010-06-10 21:30:541350
1351 // But if we wait for it, the released idle sockets will be closed in
1352 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011353 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261354
1355 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1356 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541357}
1358
1359// Regression test for http://crbug.com/40952.
1360TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261361 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1362 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541363 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1364
1365 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1366 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521367 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391368 EXPECT_EQ(OK, handle.Init(TestGroupId(base::NumberToString(i)), params_,
1369 DEFAULT_PRIORITY, SocketTag(),
1370 ClientSocketPool::RespectLimits::ENABLED,
1371 callback.callback(),
1372 ClientSocketPool::ProxyAuthCallback(),
1373 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541374 }
1375
1376 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281377 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541378
1379 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1380 // reuse a socket.
1381 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1382 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521383 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541384
1385 // "0" is special here, since it should be the first entry in the sorted map,
1386 // which is the one which we would close an idle socket for. We shouldn't
1387 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391388 EXPECT_EQ(OK, handle.Init(
1389 TestGroupId("0"), params_, DEFAULT_PRIORITY, SocketTag(),
1390 ClientSocketPool::RespectLimits::ENABLED,
1391 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1392 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541393
1394 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1395 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1396}
1397
[email protected]ab838892009-06-30 18:49:051398TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531399 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091400
Matt Menkec6b3edf72019-03-19 17:00:391401 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1402 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1403 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1404 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1405 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1406 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1407 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1408 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091409
[email protected]2431756e2010-09-29 20:26:131410 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201411 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1412 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131413 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1414 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091415
[email protected]c9d6a1d2009-07-14 16:15:201416 EXPECT_EQ(1, GetOrderOfRequest(1));
1417 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031418 EXPECT_EQ(8, GetOrderOfRequest(3));
1419 EXPECT_EQ(6, GetOrderOfRequest(4));
1420 EXPECT_EQ(4, GetOrderOfRequest(5));
1421 EXPECT_EQ(3, GetOrderOfRequest(6));
1422 EXPECT_EQ(5, GetOrderOfRequest(7));
1423 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171424
1425 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131426 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091427}
1428
[email protected]ab838892009-06-30 18:49:051429TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531430 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091431
Matt Menkec6b3edf72019-03-19 17:00:391432 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1433 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1434 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1435 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1436 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1437 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1438 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091439
[email protected]2431756e2010-09-29 20:26:131440 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091441
[email protected]2431756e2010-09-29 20:26:131442 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011443 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201444
[email protected]2431756e2010-09-29 20:26:131445 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201446 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131447 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1448 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091449}
1450
1451// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051452// The pending connect job will be cancelled and should not call back into
1453// ClientSocketPoolBase.
1454TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531455 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201456
[email protected]ab838892009-06-30 18:49:051457 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131458 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521459 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501460 EXPECT_EQ(
1461 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391462 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501463 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1464 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1465 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131466 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091467}
1468
[email protected]ab838892009-06-30 18:49:051469TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531470 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201471
[email protected]ab838892009-06-30 18:49:051472 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061473 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521474 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091475
Matt Menke28ac03e2019-02-25 22:25:501476 EXPECT_EQ(
1477 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391478 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501479 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1480 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1481 NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091482
1483 handle.Reset();
1484
[email protected]6ecf2b92011-12-15 01:14:521485 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501486 EXPECT_EQ(
1487 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391488 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501489 ClientSocketPool::RespectLimits::ENABLED,
1490 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1491 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091492
robpercival214763f2016-07-01 23:27:011493 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091494 EXPECT_FALSE(callback.have_result());
1495
1496 handle.Reset();
1497}
1498
[email protected]ab838892009-06-30 18:49:051499TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531500 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091501
Matt Menkec6b3edf72019-03-19 17:00:391502 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1503 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1504 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1505 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1506 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1507 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1508 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091509
1510 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201511 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131512 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1513 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091514
[email protected]2431756e2010-09-29 20:26:131515 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091516
[email protected]c9d6a1d2009-07-14 16:15:201517 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1518 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131519 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1520 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091521
[email protected]c9d6a1d2009-07-14 16:15:201522 EXPECT_EQ(1, GetOrderOfRequest(1));
1523 EXPECT_EQ(2, GetOrderOfRequest(2));
1524 EXPECT_EQ(5, GetOrderOfRequest(3));
1525 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131526 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1527 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201528 EXPECT_EQ(4, GetOrderOfRequest(6));
1529 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171530
1531 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131532 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091533}
1534
mmenke33d24423d2015-05-19 19:41:091535// Function to be used as a callback on socket request completion. It first
1536// disconnects the successfully connected socket from the first request, and
1537// then reuses the ClientSocketHandle to request another socket.
1538//
1539// |nested_callback| is called with the result of the second socket request.
1540void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261541 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091542 TestConnectJobFactory* test_connect_job_factory,
1543 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411544 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091545 int first_request_result) {
robpercival214763f2016-07-01 23:27:011546 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091547
1548 test_connect_job_factory->set_job_type(next_job_type);
1549
1550 // Don't allow reuse of the socket. Disconnect it and then release it.
1551 if (handle->socket())
1552 handle->socket()->Disconnect();
1553 handle->Reset();
1554
mmenke33d24423d2015-05-19 19:41:091555 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501556 int rv = handle->Init(
Matt Menke870e19ab2019-04-23 16:23:031557 TestGroupId("a"),
1558 ClientSocketPool::SocketParams::CreateForHttpForTesting(), LOWEST,
1559 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1560 nested_callback->callback(), ClientSocketPool::ProxyAuthCallback(), pool,
1561 NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091562 if (rv != ERR_IO_PENDING) {
1563 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411564 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091565 } else {
1566 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521567 }
mmenke33d24423d2015-05-19 19:41:091568}
[email protected]f6d1d6eb2009-06-24 20:16:091569
mmenke33d24423d2015-05-19 19:41:091570// Tests the case where a second socket is requested in a completion callback,
1571// and the second socket connects asynchronously. Reuses the same
1572// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581573TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531574 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201575
[email protected]0b7648c2009-07-06 20:14:011576 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061577 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091578 TestCompletionCallback second_result_callback;
1579 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391580 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541581 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501582 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1583 connect_job_factory_, TestConnectJob::kMockPendingJob,
1584 &second_result_callback),
1585 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011586 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091587
robpercival214763f2016-07-01 23:27:011588 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581589}
[email protected]f6d1d6eb2009-06-24 20:16:091590
mmenke33d24423d2015-05-19 19:41:091591// Tests the case where a second socket is requested in a completion callback,
1592// and the second socket connects synchronously. Reuses the same
1593// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581594TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531595 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201596
[email protected]0b7648c2009-07-06 20:14:011597 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061598 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091599 TestCompletionCallback second_result_callback;
1600 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391601 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541602 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501603 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1604 connect_job_factory_, TestConnectJob::kMockPendingJob,
1605 &second_result_callback),
1606 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011607 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581608
robpercival214763f2016-07-01 23:27:011609 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091610}
1611
1612// Make sure that pending requests get serviced after active requests get
1613// cancelled.
[email protected]ab838892009-06-30 18:49:051614TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531615 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201616
[email protected]0b7648c2009-07-06 20:14:011617 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091618
Matt Menkec6b3edf72019-03-19 17:00:391619 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1620 IsError(ERR_IO_PENDING));
1621 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1622 IsError(ERR_IO_PENDING));
1623 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1624 IsError(ERR_IO_PENDING));
1625 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1626 IsError(ERR_IO_PENDING));
1627 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1628 IsError(ERR_IO_PENDING));
1629 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1630 IsError(ERR_IO_PENDING));
1631 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1632 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091633
[email protected]c9d6a1d2009-07-14 16:15:201634 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1635 // Let's cancel them.
1636 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131637 ASSERT_FALSE(request(i)->handle()->is_initialized());
1638 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091639 }
1640
[email protected]f6d1d6eb2009-06-24 20:16:091641 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131642 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011643 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131644 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091645 }
1646
[email protected]2431756e2010-09-29 20:26:131647 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1648 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091649}
1650
1651// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051652TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531653 const size_t kMaxSockets = 5;
1654 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201655
[email protected]0b7648c2009-07-06 20:14:011656 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091657
[email protected]211d21722009-07-22 15:48:531658 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1659 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091660
1661 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531662 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391663 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1664 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091665
[email protected]211d21722009-07-22 15:48:531666 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011667 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091668}
1669
mmenke9d72fe42017-05-18 22:36:071670// Make sure that pending requests that complete synchronously get serviced
1671// after active requests fail. See https://crbug.com/723748
1672TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1673 const size_t kNumberOfRequests = 10;
1674 const size_t kMaxSockets = 1;
1675 CreatePool(kMaxSockets, kMaxSockets);
1676
1677 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1678
Matt Menkec6b3edf72019-03-19 17:00:391679 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1680 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071681
1682 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1683
1684 // Queue up all the other requests
1685 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391686 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1687 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071688
1689 // Make sure all requests fail, instead of hanging.
1690 for (size_t i = 0; i < kNumberOfRequests; ++i)
1691 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1692}
1693
[email protected]5fc08e32009-07-15 17:09:571694TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531695 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571696
1697 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1698
[email protected]2431756e2010-09-29 20:26:131699 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521700 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501701 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391702 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501703 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1704 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011705 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571706
1707 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131708 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571709
Matt Menkec6b3edf72019-03-19 17:00:391710 rv = handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151711 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501712 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1713 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011714 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1715 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571716
[email protected]2431756e2010-09-29 20:26:131717 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481718 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571719 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1720}
1721
xunjieli26619e72016-11-23 19:39:551722TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551723 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1724 ClientSocketHandle handle;
1725 TestCompletionCallback callback;
1726 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501727 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391728 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501729 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1730 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551731 EXPECT_THAT(rv, IsOk());
1732 handle.Reset();
1733 EXPECT_EQ(1, pool_->IdleSocketCount());
1734 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551735}
1736
xunjieli92feb332017-03-03 17:19:231737TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231738 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1739 TestCompletionCallback callback;
1740 BoundTestNetLog log;
1741 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501742 int rv = handle1.Init(
Matt Menkec6b3edf72019-03-19 17:00:391743 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501744 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1745 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231746 EXPECT_THAT(rv, IsOk());
1747 ClientSocketHandle handle2;
Matt Menkec6b3edf72019-03-19 17:00:391748 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231749 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501750 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1751 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231752 ClientSocketHandle handle3;
Matt Menkec6b3edf72019-03-19 17:00:391753 rv = handle3.Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231754 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501755 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1756 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231757 EXPECT_THAT(rv, IsOk());
1758 handle1.Reset();
1759 handle2.Reset();
1760 handle3.Reset();
1761 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:391762 pool_->CloseIdleSocketsInGroup(TestGroupId("a"));
xunjieli92feb332017-03-03 17:19:231763 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231764}
1765
xunjieli26619e72016-11-23 19:39:551766TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551767 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1768 ClientSocketHandle handle;
1769 TestCompletionCallback callback;
1770 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501771 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391772 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501773 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1774 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551775 EXPECT_THAT(rv, IsOk());
1776 StreamSocket* socket = handle.socket();
1777 handle.Reset();
1778 EXPECT_EQ(1, pool_->IdleSocketCount());
1779
1780 // Disconnect socket now to make the socket unusable.
1781 socket->Disconnect();
1782 ClientSocketHandle handle2;
Matt Menkec6b3edf72019-03-19 17:00:391783 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551784 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501785 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1786 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551787 EXPECT_THAT(rv, IsOk());
1788 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551789}
1790
[email protected]2b7523d2009-07-29 20:29:231791// Regression test for http://crbug.com/17985.
1792TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1793 const int kMaxSockets = 3;
1794 const int kMaxSocketsPerGroup = 2;
1795 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1796
[email protected]ac790b42009-12-02 04:31:311797 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231798
Matt Menkec6b3edf72019-03-19 17:00:391799 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1800 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231801
1802 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:391803 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1804 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231805
1806 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:391807 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231808
1809 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:391810 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1811 IsError(ERR_IO_PENDING));
1812 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1813 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231814
Matt Menkec6b3edf72019-03-19 17:00:391815 // Release the first two sockets from TestGroupId("a"). Because this is a
1816 // keepalive, the first release will unblock the pending request for
1817 // TestGroupId("a"). The second release will unblock a request for "c",
1818 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:131819 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1820 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231821
1822 // Closing idle sockets should not get us into trouble, but in the bug
1823 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:391824 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]43a21b82010-06-10 21:30:541825 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261826
[email protected]2da659e2013-05-23 20:51:341827 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281828 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231829}
1830
[email protected]4d3b05d2010-01-27 21:27:291831TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531832 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571833
1834 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131835 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521836 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511837 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501838 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391839 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501840 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1841 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011842 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:391843 EXPECT_EQ(LOAD_STATE_CONNECTING,
1844 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:481845 TestLoadTimingInfoNotConnected(handle);
1846
robpercival214763f2016-07-01 23:27:011847 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131848 EXPECT_TRUE(handle.is_initialized());
1849 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481850 TestLoadTimingInfoConnectedNotReused(handle);
1851
[email protected]2431756e2010-09-29 20:26:131852 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481853 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301854
mmenke43758e62015-05-04 21:09:461855 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401856 log.GetEntries(&entries);
1857
Matt Menke9fa17d52019-03-25 19:12:261858 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:171859 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:261860 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:001861 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:261862 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
1863 EXPECT_TRUE(LogContainsEvent(
1864 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1865 NetLogEventPhase::NONE));
1866 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:001867 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1868 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:261869 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571870}
1871
[email protected]4d3b05d2010-01-27 21:27:291872TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571873 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531874 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571875
1876 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131877 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521878 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511879 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181880 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131881 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:511882 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:501883 EXPECT_EQ(
1884 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391885 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501886 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1887 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1888 log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:391889 EXPECT_EQ(LOAD_STATE_CONNECTING,
1890 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:011891 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131892 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:511893 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:301894
mmenke43758e62015-05-04 21:09:461895 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401896 log.GetEntries(&entries);
1897
Matt Menke9fa17d52019-03-25 19:12:261898 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:171899 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:261900 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:001901 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:261902 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
1903 EXPECT_TRUE(LogContainsEvent(
1904 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1905 NetLogEventPhase::NONE));
1906 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571907}
1908
mmenke6be122f2015-03-09 22:22:471909// Check that an async ConnectJob failure does not result in creation of a new
1910// ConnectJob when there's another pending request also waiting on its own
1911// ConnectJob. See http://crbug.com/463960.
1912TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1913 CreatePool(2, 2);
1914 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1915
Matt Menkec6b3edf72019-03-19 17:00:391916 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1917 IsError(ERR_IO_PENDING));
1918 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1919 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471920
robpercival214763f2016-07-01 23:27:011921 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1922 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471923
1924 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1925}
1926
[email protected]4d3b05d2010-01-27 21:27:291927TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101928 // TODO(eroman): Add back the log expectations! Removed them because the
1929 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531930 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571931
1932 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131933 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521934 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131935 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521936 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571937
Matt Menke28ac03e2019-02-25 22:25:501938 EXPECT_EQ(
1939 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391940 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501941 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1942 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1943 NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511944 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201945 EXPECT_EQ(
1946 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391947 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201948 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501949 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1950 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571951
[email protected]2431756e2010-09-29 20:26:131952 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571953
[email protected]fd7b7c92009-08-20 19:38:301954
1955 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301956
robpercival214763f2016-07-01 23:27:011957 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131958 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301959
1960 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531961 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571962}
1963
[email protected]4d3b05d2010-01-27 21:27:291964TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341965 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1966
[email protected]17a0c6c2009-08-04 00:07:041967 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1968
Matt Menkec6b3edf72019-03-19 17:00:391969 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1970 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1971 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1972 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341973
Raul Tambre8335a6d2019-02-21 16:57:431974 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261975 static_cast<int>(
1976 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:131977 (*requests())[2]->handle()->Reset();
1978 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431979 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261980 static_cast<int>(
1981 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:341982
[email protected]2431756e2010-09-29 20:26:131983 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431984 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261985 static_cast<int>(
1986 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:341987
[email protected]2431756e2010-09-29 20:26:131988 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431989 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261990 static_cast<int>(
1991 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:341992}
1993
[email protected]5fc08e32009-07-15 17:09:571994// When requests and ConnectJobs are not coupled, the request will get serviced
1995// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291996TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531997 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571998
1999 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322000 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572001
[email protected]2431756e2010-09-29 20:26:132002 std::vector<TestSocketRequest*> request_order;
2003 size_t completion_count; // unused
2004 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502005 int rv = req1.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392006 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502007 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2008 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012009 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2010 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572011
2012 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2013 // without a job.
2014 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2015
[email protected]2431756e2010-09-29 20:26:132016 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502017 rv = req2.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392018 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502019 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2020 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012021 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132022 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502023 rv = req3.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392024 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502025 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2026 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012027 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572028
2029 // Both Requests 2 and 3 are pending. We release socket 1 which should
2030 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332031 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342032 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282033 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332034 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012035 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332036 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572037
2038 // Signal job 2, which should service request 3.
2039
2040 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012041 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572042
Raul Tambre8335a6d2019-02-21 16:57:432043 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132044 EXPECT_EQ(&req1, request_order[0]);
2045 EXPECT_EQ(&req2, request_order[1]);
2046 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392047 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572048}
2049
2050// The requests are not coupled to the jobs. So, the requests should finish in
2051// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292052TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532053 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572054 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322055 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572056
[email protected]2431756e2010-09-29 20:26:132057 std::vector<TestSocketRequest*> request_order;
2058 size_t completion_count; // unused
2059 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502060 int rv = req1.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392061 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502062 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2063 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012064 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572065
[email protected]2431756e2010-09-29 20:26:132066 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502067 rv = req2.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392068 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502069 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2070 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012071 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572072
2073 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322074 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572075
[email protected]2431756e2010-09-29 20:26:132076 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502077 rv = req3.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392078 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502079 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2080 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012081 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572082
robpercival214763f2016-07-01 23:27:012083 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2084 EXPECT_THAT(req2.WaitForResult(), IsOk());
2085 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572086
Raul Tambre8335a6d2019-02-21 16:57:432087 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132088 EXPECT_EQ(&req1, request_order[0]);
2089 EXPECT_EQ(&req2, request_order[1]);
2090 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572091}
2092
[email protected]03b7c8c2013-07-20 04:38:552093// Test GetLoadState in the case there's only one socket request.
2094TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532095 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552096 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572097
[email protected]2431756e2010-09-29 20:26:132098 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522099 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502100 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392101 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502102 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2103 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012104 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552105 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572106
[email protected]03b7c8c2013-07-20 04:38:552107 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2108 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2109
2110 // No point in completing the connection, since ClientSocketHandles only
2111 // expect the LoadState to be checked while connecting.
2112}
2113
2114// Test GetLoadState in the case there are two socket requests.
2115TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2116 CreatePool(2, 2);
2117 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2118
2119 ClientSocketHandle handle;
2120 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502121 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392122 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502123 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2124 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012125 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002126 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2127
2128 ClientSocketHandle handle2;
2129 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392130 rv = handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152131 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502132 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2133 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012134 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002135 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2136
Matt Menke4b69f932019-03-04 16:20:012137 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002138 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2139 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2140
Matt Menke4b69f932019-03-04 16:20:012141 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002142 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2143
Matt Menke4b69f932019-03-04 16:20:012144 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002145 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002146 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012147
2148 // Update the state of the second job.
2149 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2150
2151 // Only the state of the second request should have changed.
2152 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2153 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2154
2155 // Second job connects and the first request gets the socket. The
2156 // second handle switches to the state of the remaining ConnectJob.
2157 client_socket_factory_.SignalJob(1);
2158 EXPECT_THAT(callback.WaitForResult(), IsOk());
2159 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552160}
2161
2162// Test GetLoadState in the case the per-group limit is reached.
2163TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2164 CreatePool(2, 1);
2165 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2166
2167 ClientSocketHandle handle;
2168 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502169 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392170 TestGroupId("a"), params_, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502171 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2172 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012173 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552174 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2175
2176 // Request another socket from the same pool, buth with a higher priority.
2177 // The first request should now be stalled at the socket group limit.
2178 ClientSocketHandle handle2;
2179 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392180 rv = handle2.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152181 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502182 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2183 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012184 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552185 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2186 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2187
2188 // The first handle should remain stalled as the other socket goes through
2189 // the connect process.
2190
2191 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2192 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2193 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2194
2195 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012196 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552197 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2198
2199 // Closing the second socket should cause the stalled handle to finally get a
2200 // ConnectJob.
2201 handle2.socket()->Disconnect();
2202 handle2.Reset();
2203 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2204}
2205
2206// Test GetLoadState in the case the per-pool limit is reached.
2207TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2208 CreatePool(2, 2);
2209 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2210
2211 ClientSocketHandle handle;
2212 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502213 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392214 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502215 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2216 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012217 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552218
2219 // Request for socket from another pool.
2220 ClientSocketHandle handle2;
2221 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392222 rv = handle2.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152223 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502224 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2225 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012226 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552227
2228 // Request another socket from the first pool. Request should stall at the
2229 // socket pool limit.
2230 ClientSocketHandle handle3;
2231 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392232 rv = handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152233 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502234 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2235 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012236 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552237
2238 // The third handle should remain stalled as the other sockets in its group
2239 // goes through the connect process.
2240
2241 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2242 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2243
2244 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2245 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2246 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2247
2248 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012249 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552250 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2251
2252 // Closing a socket should allow the stalled handle to finally get a new
2253 // ConnectJob.
2254 handle.socket()->Disconnect();
2255 handle.Reset();
2256 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572257}
2258
Matt Menkeb57663b32019-03-01 17:17:102259TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132260 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102261 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132262
[email protected]2431756e2010-09-29 20:26:132263 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522264 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502265 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102266 ERR_CERT_COMMON_NAME_INVALID,
Matt Menkec6b3edf72019-03-19 17:00:392267 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502268 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2269 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2270 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132271 EXPECT_TRUE(handle.is_initialized());
2272 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132273}
2274
Matt Menkeb57663b32019-03-01 17:17:102275TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132276 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2277
Matt Menkeb57663b32019-03-01 17:17:102278 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132279 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522280 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502281 EXPECT_EQ(
2282 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392283 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502284 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2285 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2286 NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392287 EXPECT_EQ(LOAD_STATE_CONNECTING,
2288 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102289 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132290 EXPECT_TRUE(handle.is_initialized());
2291 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132292}
2293
[email protected]e60e47a2010-07-14 03:37:182294TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2295 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2296 connect_job_factory_->set_job_type(
2297 TestConnectJob::kMockAdditionalErrorStateJob);
2298
[email protected]2431756e2010-09-29 20:26:132299 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522300 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502301 EXPECT_EQ(
2302 ERR_CONNECTION_FAILED,
Matt Menkec6b3edf72019-03-19 17:00:392303 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502304 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2305 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2306 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132307 EXPECT_FALSE(handle.is_initialized());
2308 EXPECT_FALSE(handle.socket());
2309 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512310 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182311}
2312
2313TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2314 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2315
2316 connect_job_factory_->set_job_type(
2317 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132318 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522319 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502320 EXPECT_EQ(
2321 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392322 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502323 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2324 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2325 NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392326 EXPECT_EQ(LOAD_STATE_CONNECTING,
2327 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012328 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132329 EXPECT_FALSE(handle.is_initialized());
2330 EXPECT_FALSE(handle.socket());
2331 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512332 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182333}
2334
martijn003cd612016-05-19 22:24:382335// Make sure we can reuse sockets.
2336TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412337 CreatePoolWithIdleTimeouts(
2338 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032339 base::TimeDelta(), // Time out unused sockets immediately.
2340 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2341
2342 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2343
2344 ClientSocketHandle handle;
2345 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502346 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392347 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502348 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2349 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012350 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392351 EXPECT_EQ(LOAD_STATE_CONNECTING,
2352 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012353 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032354
2355 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352356 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382357 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482358 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032359 handle.Reset();
2360
2361 // Should now have one idle socket.
2362 ASSERT_EQ(1, pool_->IdleSocketCount());
2363
2364 // Request a new socket. This should reuse the old socket and complete
2365 // synchronously.
vishal.b62985ca92015-04-17 08:45:512366 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502367 rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392368 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502369 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2370 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012371 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032372 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482373 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032374
Matt Menke9fa17d52019-03-25 19:12:262375 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392376 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262377 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032378
mmenke43758e62015-05-04 21:09:462379 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032380 log.GetEntries(&entries);
Matt Menke9fa17d52019-03-25 19:12:262381 EXPECT_TRUE(LogContainsEvent(
2382 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2383 NetLogEventPhase::NONE));
2384 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032385 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262386 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032387}
2388
martijn003cd612016-05-19 22:24:382389// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172390TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032391 CreatePoolWithIdleTimeouts(
2392 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2393 base::TimeDelta(), // Time out unused sockets immediately
2394 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412395
2396 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2397
2398 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2399
2400 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522401 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502402 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392403 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502404 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2405 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012406 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392407 EXPECT_EQ(LOAD_STATE_CONNECTING,
2408 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412409
2410 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522411 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392412 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152413 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502414 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2415 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012416 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392417 EXPECT_EQ(LOAD_STATE_CONNECTING,
2418 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412419
2420 // Cancel one of the requests. Wait for the other, which will get the first
2421 // job. Release the socket. Run the loop again to make sure the second
2422 // socket is sitting idle and the first one is released (since ReleaseSocket()
2423 // just posts a DoReleaseSocket() task).
2424
2425 handle.Reset();
robpercival214763f2016-07-01 23:27:012426 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412427 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352428 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382429 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412430 handle2.Reset();
2431
[email protected]e7b1c6d2c2012-05-05 00:54:032432 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2433 // actually become pending until 2ms after they have been created. In order
2434 // to flush all tasks, we need to wait so that we know there are no
2435 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452436 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412437
[email protected]e7b1c6d2c2012-05-05 00:54:032438 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412439 ASSERT_EQ(2, pool_->IdleSocketCount());
2440
2441 // Request a new socket. This should cleanup the unused and timed out ones.
2442 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512443 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522444 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392445 rv = handle.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152446 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502447 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2448 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012449 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2450 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412451 EXPECT_FALSE(handle.is_reused());
2452
[email protected]e7b1c6d2c2012-05-05 00:54:032453 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262454 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392455 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262456 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412457
mmenke43758e62015-05-04 21:09:462458 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412459 log.GetEntries(&entries);
2460 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002461 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412462}
2463
[email protected]2041cf342010-02-19 03:15:592464// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162465// because of multiple releasing disconnected sockets.
2466TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2467 CreatePoolWithIdleTimeouts(
2468 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2469 base::TimeDelta(), // Time out unused sockets immediately.
2470 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2471
2472 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2473
2474 // Startup 4 connect jobs. Two of them will be pending.
2475
[email protected]2431756e2010-09-29 20:26:132476 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522477 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502478 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392479 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502480 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2481 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012482 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162483
[email protected]2431756e2010-09-29 20:26:132484 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522485 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392486 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152487 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502488 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2489 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012490 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162491
[email protected]2431756e2010-09-29 20:26:132492 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522493 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392494 rv = handle3.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152495 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502496 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2497 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012498 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162499
[email protected]2431756e2010-09-29 20:26:132500 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522501 TestCompletionCallback callback4;
Matt Menkec6b3edf72019-03-19 17:00:392502 rv = handle4.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152503 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502504 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2505 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012506 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162507
2508 // Release two disconnected sockets.
2509
[email protected]2431756e2010-09-29 20:26:132510 handle.socket()->Disconnect();
2511 handle.Reset();
2512 handle2.socket()->Disconnect();
2513 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162514
robpercival214763f2016-07-01 23:27:012515 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132516 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012517 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132518 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162519}
2520
[email protected]d7027bb2010-05-10 18:58:542521// Regression test for http://crbug.com/42267.
2522// When DoReleaseSocket() is processed for one socket, it is blocked because the
2523// other stalled groups all have releasing sockets, so no progress can be made.
2524TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2525 CreatePoolWithIdleTimeouts(
2526 4 /* socket limit */, 4 /* socket limit per group */,
2527 base::TimeDelta(), // Time out unused sockets immediately.
2528 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2529
2530 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2531
2532 // Max out the socket limit with 2 per group.
2533
[email protected]2431756e2010-09-29 20:26:132534 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522535 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132536 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522537 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542538
2539 for (int i = 0; i < 2; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:392540 EXPECT_EQ(
2541 OK, handle_a[i].Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
2542 ClientSocketPool::RespectLimits::ENABLED,
2543 callback_a[i].callback(),
2544 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2545 NetLogWithSource()));
2546 EXPECT_EQ(
2547 OK, handle_b[i].Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
2548 ClientSocketPool::RespectLimits::ENABLED,
2549 callback_b[i].callback(),
2550 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2551 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542552 }
[email protected]b89f7e42010-05-20 20:37:002553
[email protected]d7027bb2010-05-10 18:58:542554 // Make 4 pending requests, 2 per group.
2555
2556 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202557 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392558 handle_a[i].Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202559 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502560 callback_a[i].callback(),
2561 ClientSocketPool::ProxyAuthCallback(),
2562 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:202563 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392564 handle_b[i].Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202565 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502566 callback_b[i].callback(),
2567 ClientSocketPool::ProxyAuthCallback(),
2568 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542569 }
2570
2571 // Release b's socket first. The order is important, because in
2572 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2573 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2574 // first, which has a releasing socket, so it refuses to start up another
2575 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132576 handle_b[0].socket()->Disconnect();
2577 handle_b[0].Reset();
2578 handle_a[0].socket()->Disconnect();
2579 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542580
2581 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282582 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542583
[email protected]2431756e2010-09-29 20:26:132584 handle_b[1].socket()->Disconnect();
2585 handle_b[1].Reset();
2586 handle_a[1].socket()->Disconnect();
2587 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542588
2589 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012590 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2591 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542592 }
2593}
2594
[email protected]fd4fe0b2010-02-08 23:02:152595TEST_F(ClientSocketPoolBaseTest,
2596 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2597 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2598
2599 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2600
Matt Menkec6b3edf72019-03-19 17:00:392601 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2602 IsError(ERR_IO_PENDING));
2603 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2604 IsError(ERR_IO_PENDING));
2605 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2606 IsError(ERR_IO_PENDING));
2607 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2608 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152609
robpercival214763f2016-07-01 23:27:012610 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2611 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132612 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152613
2614 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132615 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012616 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152617
[email protected]2431756e2010-09-29 20:26:132618 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012619 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132620 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152621
2622 EXPECT_EQ(1, GetOrderOfRequest(1));
2623 EXPECT_EQ(2, GetOrderOfRequest(2));
2624 EXPECT_EQ(3, GetOrderOfRequest(3));
2625 EXPECT_EQ(4, GetOrderOfRequest(4));
2626
2627 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132628 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152629}
2630
[email protected]6ecf2b92011-12-15 01:14:522631class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042632 public:
Matt Menke9fa17d52019-03-25 19:12:262633 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132634 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182635 bool reset_releasing_handle)
2636 : pool_(pool),
2637 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042638 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522639
Chris Watkins7a41d3552017-12-01 02:13:272640 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042641
2642 ClientSocketHandle* handle() { return &handle_; }
2643
Bence Béky8ddc2492018-06-13 01:02:042644 CompletionOnceCallback callback() {
2645 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2646 base::Unretained(this));
2647 }
[email protected]4f1e4982010-03-02 18:31:042648
2649 private:
[email protected]6ecf2b92011-12-15 01:14:522650 void OnComplete(int result) {
2651 SetResult(result);
2652 if (reset_releasing_handle_)
2653 handle_.Reset();
2654
Matt Menkec6b3edf72019-03-19 17:00:392655 EXPECT_EQ(
2656 expected_result_,
Matt Menke870e19ab2019-04-23 16:23:032657 handle2_.Init(
2658 TestGroupId("a"),
2659 ClientSocketPool::SocketParams::CreateForHttpForTesting(),
2660 DEFAULT_PRIORITY, SocketTag(),
2661 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2662 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522663 }
2664
Matt Menke9fa17d52019-03-25 19:12:262665 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182666 int expected_result_;
2667 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042668 ClientSocketHandle handle_;
2669 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042670};
2671
[email protected]e60e47a2010-07-14 03:37:182672
2673TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2674 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2675
Matt Menkec6b3edf72019-03-19 17:00:392676 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2677 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2678 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182679
[email protected]2431756e2010-09-29 20:26:132680 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182681 client_socket_factory_.allocation_count());
2682
2683 connect_job_factory_->set_job_type(
2684 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2685 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202686 EXPECT_EQ(
2687 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392688 req.handle()->Init(TestGroupId("a"), params_, DEFAULT_PRIORITY,
2689 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502690 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2691 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182692 // The next job should complete synchronously
2693 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2694
robpercival214763f2016-07-01 23:27:012695 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182696 EXPECT_FALSE(req.handle()->is_initialized());
2697 EXPECT_FALSE(req.handle()->socket());
2698 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512699 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182700}
2701
[email protected]b6501d3d2010-06-03 23:53:342702// http://crbug.com/44724 regression test.
2703// We start releasing the pool when we flush on network change. When that
2704// happens, the only active references are in the ClientSocketHandles. When a
2705// ConnectJob completes and calls back into the last ClientSocketHandle, that
2706// callback can release the last reference and delete the pool. After the
2707// callback finishes, we go back to the stack frame within the now-deleted pool.
2708// Executing any code that refers to members of the now-deleted pool can cause
2709// crashes.
2710TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2711 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2712 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2713
2714 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522715 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502716 EXPECT_EQ(
2717 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392718 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502719 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2720 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2721 NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342722
[email protected]7af985a2012-12-14 22:40:422723 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342724
2725 // We'll call back into this now.
2726 callback.WaitForResult();
2727}
2728
[email protected]a7e38572010-06-07 18:22:242729TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2730 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2731 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2732
2733 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522734 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502735 EXPECT_EQ(
2736 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392737 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502738 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2739 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2740 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012741 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242742 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2743
[email protected]7af985a2012-12-14 22:40:422744 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242745
2746 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282747 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242748
Matt Menke28ac03e2019-02-25 22:25:502749 EXPECT_EQ(
2750 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392751 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502752 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2753 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2754 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012755 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242756 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2757}
2758
[email protected]6ecf2b92011-12-15 01:14:522759class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142760 public:
Matt Menke9fa17d52019-03-25 19:12:262761 ConnectWithinCallback(
2762 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:192763 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:262764 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:392765 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142766
Chris Watkins7a41d3552017-12-01 02:13:272767 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142768
2769 int WaitForNestedResult() {
2770 return nested_callback_.WaitForResult();
2771 }
2772
Bence Béky8ddc2492018-06-13 01:02:042773 CompletionOnceCallback callback() {
2774 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2775 base::Unretained(this));
2776 }
[email protected]6ecf2b92011-12-15 01:14:522777
[email protected]06f92462010-08-31 19:24:142778 private:
[email protected]6ecf2b92011-12-15 01:14:522779 void OnComplete(int result) {
2780 SetResult(result);
Matt Menke28ac03e2019-02-25 22:25:502781 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392782 handle_.Init(group_id_, params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502783 ClientSocketPool::RespectLimits::ENABLED,
2784 nested_callback_.callback(),
2785 ClientSocketPool::ProxyAuthCallback(), pool_,
2786 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522787 }
2788
Matt Menkec6b3edf72019-03-19 17:00:392789 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:192790 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:262791 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142792 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522793 TestCompletionCallback nested_callback_;
2794
2795 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142796};
2797
2798TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2799 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2800
2801 // First job will be waiting until it gets aborted.
2802 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2803
2804 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:392805 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:502806 EXPECT_EQ(
2807 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392808 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502809 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2810 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2811 NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142812
2813 // Second job will be started during the first callback, and will
2814 // asynchronously complete with OK.
2815 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422816 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012817 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2818 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142819}
2820
Matt Menke141b87f22019-01-30 02:43:032821TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:262822 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2823 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:032824
2825 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2826 ClientSocketHandle handle;
2827 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502828 EXPECT_EQ(
2829 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392830 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502831 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2832 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2833 NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:032834 // The backup timer fires but doesn't start a new ConnectJob while resolving
2835 // the hostname.
2836 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2837 FastForwardBy(base::TimeDelta::FromMilliseconds(
2838 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2839 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2840
2841 // Once the ConnectJob has finished resolving the hostname, the backup timer
2842 // will create a ConnectJob when it fires.
2843 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2844 FastForwardBy(base::TimeDelta::FromMilliseconds(
2845 ClientSocketPool::kMaxConnectRetryIntervalMs));
2846 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2847}
2848
2849// Test that no backup socket is created when a ConnectJob connects before it
2850// completes.
2851TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:262852 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2853 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:032854
2855 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2856 ClientSocketHandle handle;
2857 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502858 EXPECT_EQ(
2859 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392860 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502861 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2862 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2863 NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:032864 // The backup timer fires but doesn't start a new ConnectJob while resolving
2865 // the hostname.
2866 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2867 FastForwardBy(base::TimeDelta::FromMilliseconds(
2868 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2869 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2870
2871 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2872 client_socket_factory_.SetJobHasEstablishedConnection(0);
2873 FastForwardBy(base::TimeDelta::FromMilliseconds(
2874 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2875 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2876}
2877
[email protected]25eea382010-07-10 23:55:262878// Cancel a pending socket request while we're at max sockets,
2879// and verify that the backup socket firing doesn't cause a crash.
2880TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2881 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:262882 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2883 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:262884
[email protected]4baaf9d2010-08-31 15:15:442885 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2886 // timer.
[email protected]25eea382010-07-10 23:55:262887 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2888 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522889 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502890 EXPECT_EQ(
2891 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392892 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502893 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2894 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2895 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262896
2897 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2898 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2899 ClientSocketHandle handles[kDefaultMaxSockets];
2900 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522901 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:392902 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY,
2903 SocketTag(),
tfarina428341112016-09-22 13:38:202904 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502905 callback.callback(),
2906 ClientSocketPool::ProxyAuthCallback(),
2907 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262908 }
2909
fdoray5eeb7642016-06-22 16:11:282910 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262911
2912 // Cancel the pending request.
2913 handle.Reset();
2914
2915 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452916 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002917 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262918
[email protected]25eea382010-07-10 23:55:262919 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2920}
2921
[email protected]3f00be82010-09-27 19:50:022922TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:262923 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2924 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:442925
2926 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2927 // timer.
2928 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2929 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522930 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502931 EXPECT_EQ(
2932 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392933 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502934 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2935 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2936 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:262937 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
2938 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
2939 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
2940 TestGroupId("bar")));
2941 EXPECT_EQ(
2942 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:442943
2944 // Cancel the socket request. This should cancel the backup timer. Wait for
2945 // the backup time to see if it indeed got canceled.
2946 handle.Reset();
2947 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452948 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002949 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:262950 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
2951 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:442952}
2953
[email protected]3f00be82010-09-27 19:50:022954TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:262955 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2956 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:022957
2958 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2959 // timer.
2960 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2961 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522962 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502963 EXPECT_EQ(
2964 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392965 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502966 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2967 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2968 NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022969 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2970 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522971 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202972 EXPECT_EQ(
2973 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392974 handle2.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202975 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502976 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2977 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:262978 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
2979 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:022980
2981 // Cancel request 1 and then complete request 2. With the requests finished,
2982 // the backup timer should be cancelled.
2983 handle.Reset();
robpercival214763f2016-07-01 23:27:012984 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022985 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452986 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002987 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:022988}
2989
[email protected]eb5a99382010-07-11 03:18:262990// Test delayed socket binding for the case where we have two connects,
2991// and while one is waiting on a connect, the other frees up.
2992// The socket waiting on a connect should switch immediately to the freed
2993// up socket.
2994TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2995 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2996 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2997
2998 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522999 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503000 EXPECT_EQ(
3001 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393002 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503003 ClientSocketPool::RespectLimits::ENABLED,
3004 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3005 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013006 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263007
3008 // No idle sockets, no pending jobs.
3009 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263010 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263011
3012 // Create a second socket to the same host, but this one will wait.
3013 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3014 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503015 EXPECT_EQ(
3016 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393017 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503018 ClientSocketPool::RespectLimits::ENABLED,
3019 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3020 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263021 // No idle sockets, and one connecting job.
3022 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263023 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263024
3025 // Return the first handle to the pool. This will initiate the delayed
3026 // binding.
3027 handle1.Reset();
3028
fdoray5eeb7642016-06-22 16:11:283029 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263030
3031 // Still no idle sockets, still one pending connect job.
3032 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263033 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263034
3035 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013036 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263037
3038 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263039 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263040
3041 // Finally, signal the waiting Connect.
3042 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263043 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263044
fdoray5eeb7642016-06-22 16:11:283045 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263046}
3047
3048// Test delayed socket binding when a group is at capacity and one
3049// of the group's sockets frees up.
3050TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3051 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3052 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3053
3054 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523055 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503056 EXPECT_EQ(
3057 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393058 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503059 ClientSocketPool::RespectLimits::ENABLED,
3060 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3061 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013062 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263063
3064 // No idle sockets, no pending jobs.
3065 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263066 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263067
3068 // Create a second socket to the same host, but this one will wait.
3069 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3070 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503071 EXPECT_EQ(
3072 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393073 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503074 ClientSocketPool::RespectLimits::ENABLED,
3075 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3076 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263077 // No idle sockets, and one connecting job.
3078 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263079 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263080
3081 // Return the first handle to the pool. This will initiate the delayed
3082 // binding.
3083 handle1.Reset();
3084
fdoray5eeb7642016-06-22 16:11:283085 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263086
3087 // Still no idle sockets, still one pending connect job.
3088 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263089 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263090
3091 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013092 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263093
3094 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263095 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263096
3097 // Finally, signal the waiting Connect.
3098 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263099 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263100
fdoray5eeb7642016-06-22 16:11:283101 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263102}
3103
3104// Test out the case where we have one socket connected, one
3105// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513106// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263107// should complete, by taking the first socket's idle socket.
3108TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3109 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3110 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3111
3112 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523113 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503114 EXPECT_EQ(
3115 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393116 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503117 ClientSocketPool::RespectLimits::ENABLED,
3118 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3119 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013120 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263121
3122 // No idle sockets, no pending jobs.
3123 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263124 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263125
3126 // Create a second socket to the same host, but this one will wait.
3127 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3128 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503129 EXPECT_EQ(
3130 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393131 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503132 ClientSocketPool::RespectLimits::ENABLED,
3133 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3134 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263135 // No idle sockets, and one connecting job.
3136 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263137 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263138
3139 // Return the first handle to the pool. This will initiate the delayed
3140 // binding.
3141 handle1.Reset();
3142
fdoray5eeb7642016-06-22 16:11:283143 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263144
3145 // Still no idle sockets, still one pending connect job.
3146 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263147 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263148
3149 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013150 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263151
3152 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263153 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263154
3155 // Finally, signal the waiting Connect.
3156 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263157 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263158
fdoray5eeb7642016-06-22 16:11:283159 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263160}
3161
[email protected]2abfe90a2010-08-25 17:49:513162// Cover the case where on an available socket slot, we have one pending
3163// request that completes synchronously, thereby making the Group empty.
3164TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3165 const int kUnlimitedSockets = 100;
3166 const int kOneSocketPerGroup = 1;
3167 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3168
3169 // Make the first request asynchronous fail.
3170 // This will free up a socket slot later.
3171 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3172
3173 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523174 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203175 EXPECT_EQ(
3176 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393177 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203178 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503179 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3180 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263181 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513182
3183 // Make the second request synchronously fail. This should make the Group
3184 // empty.
3185 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3186 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523187 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513188 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3189 // when created.
tfarina428341112016-09-22 13:38:203190 EXPECT_EQ(
3191 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393192 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203193 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503194 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3195 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513196
Matt Menke9fa17d52019-03-25 19:12:263197 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513198
robpercival214763f2016-07-01 23:27:013199 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3200 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263201 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513202}
3203
[email protected]e1b54dc2010-10-06 21:27:223204TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3205 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3206
3207 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3208
3209 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523210 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203211 EXPECT_EQ(
3212 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393213 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203214 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503215 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3216 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223217
3218 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523219 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203220 EXPECT_EQ(
3221 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393222 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203223 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503224 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3225 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223226 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523227 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203228 EXPECT_EQ(
3229 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393230 handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203231 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503232 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3233 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223234
robpercival214763f2016-07-01 23:27:013235 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3236 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3237 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223238
3239 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353240 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383241 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353242 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383243 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223244
3245 handle1.Reset();
3246 handle2.Reset();
3247 handle3.Reset();
3248
Matt Menkec6b3edf72019-03-19 17:00:393249 EXPECT_EQ(OK, handle1.Init(
3250 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3251 ClientSocketPool::RespectLimits::ENABLED,
3252 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3253 pool_.get(), NetLogWithSource()));
3254 EXPECT_EQ(OK, handle2.Init(
3255 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3256 ClientSocketPool::RespectLimits::ENABLED,
3257 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3258 pool_.get(), NetLogWithSource()));
3259 EXPECT_EQ(OK, handle3.Init(
3260 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3261 ClientSocketPool::RespectLimits::ENABLED,
3262 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3263 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223264
3265 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3266 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3267 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3268}
3269
[email protected]2c2bef152010-10-13 00:55:033270TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3271 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3272 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3273
Matt Menkebd12b7e2019-03-25 21:12:033274 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033275
Matt Menke9fa17d52019-03-25 19:12:263276 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3277 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3278 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3279 TestGroupId("a")));
3280 EXPECT_EQ(2u,
3281 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393282 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033283
3284 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523285 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203286 EXPECT_EQ(
3287 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393288 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203289 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503290 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3291 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033292
3293 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523294 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203295 EXPECT_EQ(
3296 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393297 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203298 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503299 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3300 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033301
Matt Menke9fa17d52019-03-25 19:12:263302 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3303 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3304 TestGroupId("a")));
3305 EXPECT_EQ(0u,
3306 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393307 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033308
robpercival214763f2016-07-01 23:27:013309 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3310 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033311 handle1.Reset();
3312 handle2.Reset();
3313
Matt Menke9fa17d52019-03-25 19:12:263314 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3315 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3316 TestGroupId("a")));
3317 EXPECT_EQ(0u,
3318 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393319 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033320}
3321
3322TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3323 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3324 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3325
3326 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523327 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203328 EXPECT_EQ(
3329 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393330 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203331 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503332 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3333 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033334
Matt Menke9fa17d52019-03-25 19:12:263335 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3336 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3337 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3338 TestGroupId("a")));
3339 EXPECT_EQ(0u,
3340 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393341 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033342
Matt Menkebd12b7e2019-03-25 21:12:033343 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033344
Matt Menke9fa17d52019-03-25 19:12:263345 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3346 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3347 TestGroupId("a")));
3348 EXPECT_EQ(1u,
3349 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393350 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033351
3352 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523353 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203354 EXPECT_EQ(
3355 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393356 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203357 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503358 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3359 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033360
Matt Menke9fa17d52019-03-25 19:12:263361 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3362 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3363 TestGroupId("a")));
3364 EXPECT_EQ(0u,
3365 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393366 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033367
robpercival214763f2016-07-01 23:27:013368 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3369 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033370 handle1.Reset();
3371 handle2.Reset();
3372
Matt Menke9fa17d52019-03-25 19:12:263373 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3374 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3375 TestGroupId("a")));
3376 EXPECT_EQ(0u,
3377 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393378 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033379}
3380
3381TEST_F(ClientSocketPoolBaseTest,
3382 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3383 CreatePool(4, 4);
3384 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3385
3386 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523387 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203388 EXPECT_EQ(
3389 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393390 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203391 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503392 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3393 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033394
3395 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523396 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203397 EXPECT_EQ(
3398 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393399 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203400 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503401 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3402 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033403
3404 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523405 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203406 EXPECT_EQ(
3407 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393408 handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203409 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503410 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3411 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033412
Matt Menke9fa17d52019-03-25 19:12:263413 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3414 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3415 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3416 TestGroupId("a")));
3417 EXPECT_EQ(0u,
3418 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393419 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033420
Matt Menkebd12b7e2019-03-25 21:12:033421 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033422
Matt Menke9fa17d52019-03-25 19:12:263423 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3424 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3425 TestGroupId("a")));
3426 EXPECT_EQ(0u,
3427 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393428 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033429
robpercival214763f2016-07-01 23:27:013430 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3431 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3432 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033433 handle1.Reset();
3434 handle2.Reset();
3435 handle3.Reset();
3436
Matt Menke9fa17d52019-03-25 19:12:263437 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3438 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3439 TestGroupId("a")));
3440 EXPECT_EQ(0u,
3441 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393442 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033443}
3444
3445TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3446 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3447 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3448
Matt Menke9fa17d52019-03-25 19:12:263449 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033450
Matt Menkebd12b7e2019-03-25 21:12:033451 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393452 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033453
Matt Menke9fa17d52019-03-25 19:12:263454 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433455 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393456 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263457 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3458 EXPECT_EQ(
3459 kDefaultMaxSockets,
3460 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3461 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433462 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263463 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3464 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033465
Matt Menke9fa17d52019-03-25 19:12:263466 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033467
Matt Menkebd12b7e2019-03-25 21:12:033468 pool_->RequestSockets(TestGroupId("b"), params_, kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393469 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033470
Matt Menke9fa17d52019-03-25 19:12:263471 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033472}
3473
3474TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3475 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3476 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3477
Matt Menke9fa17d52019-03-25 19:12:263478 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033479
Matt Menkebd12b7e2019-03-25 21:12:033480 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573481 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033482
Matt Menke9fa17d52019-03-25 19:12:263483 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433484 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393485 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263486 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3487 EXPECT_EQ(
3488 kDefaultMaxSockets - 1,
3489 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3490 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433491 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263492 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3493 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483494 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033495
Matt Menke9fa17d52019-03-25 19:12:263496 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033497
Matt Menkebd12b7e2019-03-25 21:12:033498 pool_->RequestSockets(TestGroupId("b"), params_, kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393499 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033500
Matt Menke9fa17d52019-03-25 19:12:263501 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3502 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483503 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033504}
3505
3506TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3507 CreatePool(4, 4);
3508 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3509
3510 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523511 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203512 EXPECT_EQ(
3513 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393514 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203515 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503516 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3517 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013518 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033519 handle1.Reset();
3520
Matt Menke9fa17d52019-03-25 19:12:263521 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3522 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3523 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3524 TestGroupId("a")));
3525 EXPECT_EQ(0u,
3526 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393527 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033528
Matt Menkebd12b7e2019-03-25 21:12:033529 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033530
Matt Menke9fa17d52019-03-25 19:12:263531 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3532 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3533 TestGroupId("a")));
3534 EXPECT_EQ(1u,
3535 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393536 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033537}
3538
3539TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3540 CreatePool(4, 4);
3541 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3542
3543 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523544 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203545 EXPECT_EQ(
3546 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393547 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203548 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503549 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3550 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013551 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033552
Matt Menke9fa17d52019-03-25 19:12:263553 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3554 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3555 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3556 TestGroupId("a")));
3557 EXPECT_EQ(0u,
3558 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393559 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263560 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033561
Matt Menkebd12b7e2019-03-25 21:12:033562 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033563
Matt Menke9fa17d52019-03-25 19:12:263564 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3565 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3566 TestGroupId("a")));
3567 EXPECT_EQ(1u,
3568 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393569 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263570 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033571}
3572
3573TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3574 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3575 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3576
Matt Menkebd12b7e2019-03-25 21:12:033577 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573578 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033579
Matt Menke9fa17d52019-03-25 19:12:263580 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3581 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3582 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3583 TestGroupId("a")));
3584 EXPECT_EQ(0u,
3585 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433586 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393587 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033588
Matt Menkebd12b7e2019-03-25 21:12:033589 pool_->RequestSockets(TestGroupId("b"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573590 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033591
Matt Menke9fa17d52019-03-25 19:12:263592 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3593 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3594 TestGroupId("b")));
3595 EXPECT_EQ(0u,
3596 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433597 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393598 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033599}
3600
[email protected]3c819f522010-12-02 02:03:123601TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3602 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3603 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3604
Matt Menkebd12b7e2019-03-25 21:12:033605 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573606 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123607
Matt Menke9fa17d52019-03-25 19:12:263608 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523609
3610 connect_job_factory_->set_job_type(
3611 TestConnectJob::kMockAdditionalErrorStateJob);
Matt Menkebd12b7e2019-03-25 21:12:033612 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573613 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523614
Matt Menke9fa17d52019-03-25 19:12:263615 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123616}
3617
[email protected]8159a1c2012-06-07 00:00:103618TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033619 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433620 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033621
Matt Menkebd12b7e2019-03-25 21:12:033622 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033623
Matt Menke9fa17d52019-03-25 19:12:263624 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3625 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3626 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3627 TestGroupId("a")));
3628 EXPECT_EQ(2u,
3629 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3630 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393631 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033632
Matt Menkebd12b7e2019-03-25 21:12:033633 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263634 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3635 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3636 TestGroupId("a")));
3637 EXPECT_EQ(2u,
3638 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3639 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393640 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033641
3642 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523643 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203644 EXPECT_EQ(
3645 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393646 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203647 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503648 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3649 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433650
3651 client_socket_factory_.SignalJob(0);
3652 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3653
Matt Menke9fa17d52019-03-25 19:12:263654 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3655 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3656 TestGroupId("a")));
3657 EXPECT_EQ(1u,
3658 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3659 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393660 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033661
3662 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523663 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433664 EXPECT_EQ(
3665 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393666 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:433667 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503668 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3669 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433670 client_socket_factory_.SignalJob(0);
3671 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033672
Matt Menke9fa17d52019-03-25 19:12:263673 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3674 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3675 TestGroupId("a")));
3676 EXPECT_EQ(0u,
3677 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3678 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393679 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103680
[email protected]2c2bef152010-10-13 00:55:033681 handle1.Reset();
3682 handle2.Reset();
3683
Matt Menke9fa17d52019-03-25 19:12:263684 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3685 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3686 TestGroupId("a")));
3687 EXPECT_EQ(0u,
3688 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3689 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393690 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033691
Matt Menkebd12b7e2019-03-25 21:12:033692 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
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")));
3698 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393699 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033700}
3701
3702TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3703 CreatePool(4, 4);
3704 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3705
Matt Menkebd12b7e2019-03-25 21:12:033706 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033707
Matt Menke9fa17d52019-03-25 19:12:263708 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3709 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3710 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3711 TestGroupId("a")));
3712 EXPECT_EQ(1u,
3713 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393714 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033715
Matt Menkebd12b7e2019-03-25 21:12:033716 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263717 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3718 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3719 TestGroupId("a")));
3720 EXPECT_EQ(2u,
3721 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393722 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033723
Matt Menkebd12b7e2019-03-25 21:12:033724 pool_->RequestSockets(TestGroupId("a"), params_, 3, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263725 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3726 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3727 TestGroupId("a")));
3728 EXPECT_EQ(3u,
3729 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393730 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033731
Matt Menkebd12b7e2019-03-25 21:12:033732 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263733 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3734 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3735 TestGroupId("a")));
3736 EXPECT_EQ(3u,
3737 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393738 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033739}
3740
3741TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3742 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433743 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033744
Matt Menkebd12b7e2019-03-25 21:12:033745 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033746
Matt Menke9fa17d52019-03-25 19:12:263747 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3748 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3749 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3750 TestGroupId("a")));
3751 EXPECT_EQ(1u,
3752 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393753 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033754
3755 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523756 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203757 EXPECT_EQ(
3758 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393759 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203760 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503761 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3762 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033763
Matt Menke9fa17d52019-03-25 19:12:263764 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3765 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3766 TestGroupId("a")));
3767 EXPECT_EQ(0u,
3768 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393769 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033770
Lily Chenecebf932018-11-02 17:15:433771 client_socket_factory_.SignalJobs();
3772 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3773
Matt Menke9fa17d52019-03-25 19:12:263774 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3775 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3776 TestGroupId("a")));
3777 EXPECT_EQ(0u,
3778 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393779 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263780 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033781
[email protected]0dc88b32014-03-26 20:12:283782 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483783 // starts, it has a connect start time.
3784 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033785 handle1.Reset();
3786
Matt Menkec6b3edf72019-03-19 17:00:393787 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033788}
3789
[email protected]034df0f32013-01-07 23:17:483790// Checks that fully connected preconnect jobs have no connect times, and are
3791// marked as reused.
3792TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3793 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3794 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkebd12b7e2019-03-25 21:12:033795 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483796
Matt Menke9fa17d52019-03-25 19:12:263797 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3798 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3799 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3800 TestGroupId("a")));
3801 EXPECT_EQ(0u,
3802 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393803 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483804
3805 ClientSocketHandle handle;
3806 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:393807 EXPECT_EQ(OK, handle.Init(
3808 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3809 ClientSocketPool::RespectLimits::ENABLED,
3810 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3811 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483812
3813 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:393814 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483815
3816 TestLoadTimingInfoConnectedReused(handle);
3817 handle.Reset();
3818 TestLoadTimingInfoNotConnected(handle);
3819}
3820
[email protected]dcbe168a2010-12-02 03:14:463821// http://crbug.com/64940 regression test.
3822TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3823 const int kMaxTotalSockets = 3;
3824 const int kMaxSocketsPerGroup = 2;
3825 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433826 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:463827
Matt Menkef6edce752019-03-19 17:21:563828 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:463829 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3830
3831 // Set up one idle socket in "a".
3832 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523833 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203834 EXPECT_EQ(
3835 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393836 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203837 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503838 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3839 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263840 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3841 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3842 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3843 TestGroupId("a")));
3844 EXPECT_EQ(0u,
3845 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393846 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:463847
Lily Chenecebf932018-11-02 17:15:433848 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013849 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:263850 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3851 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3852 TestGroupId("a")));
3853 EXPECT_EQ(0u,
3854 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3855 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433856
[email protected]dcbe168a2010-12-02 03:14:463857 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:393858 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:463859
3860 // Set up two active sockets in "b".
3861 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523862 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203863 EXPECT_EQ(
3864 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393865 handle1.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203866 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503867 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3868 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:203869 EXPECT_EQ(
3870 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393871 handle2.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203872 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503873 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3874 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463875
Matt Menke9fa17d52019-03-25 19:12:263876 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3877 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3878 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3879 TestGroupId("b")));
3880 EXPECT_EQ(0u,
3881 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:393882 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:433883
3884 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013885 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3886 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:393887 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263888 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3889 TestGroupId("b")));
3890 EXPECT_EQ(0u,
3891 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
3892 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463893
3894 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3895 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3896 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3897 // sockets for "a", and "b" should still have 2 active sockets.
3898
Matt Menkebd12b7e2019-03-25 21:12:033899 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263900 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3901 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3902 TestGroupId("a")));
3903 EXPECT_EQ(0u,
3904 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393905 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263906 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
3907 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3908 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3909 TestGroupId("b")));
3910 EXPECT_EQ(0u,
3911 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:393912 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263913 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463914
3915 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3916 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3917 // "a" should result in closing 1 for "b".
3918 handle1.Reset();
3919 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:393920 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263921 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463922
Matt Menkebd12b7e2019-03-25 21:12:033923 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263924 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3925 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3926 TestGroupId("a")));
3927 EXPECT_EQ(1u,
3928 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393929 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263930 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
3931 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3932 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3933 TestGroupId("b")));
3934 EXPECT_EQ(0u,
3935 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:393936 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263937 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463938}
3939
[email protected]b7b8be42011-07-12 12:46:413940TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:263941 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
3942 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:073943
3944 // Make the ConnectJob hang until it times out, shorten the timeout.
3945 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3946 connect_job_factory_->set_timeout_duration(
3947 base::TimeDelta::FromMilliseconds(500));
Matt Menkebd12b7e2019-03-25 21:12:033948 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263949 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3950 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3951 TestGroupId("a")));
3952 EXPECT_EQ(1u,
3953 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393954 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:073955
[email protected]b7b8be42011-07-12 12:46:413956 // Verify the backup timer doesn't create a backup job, by making
3957 // the backup job a pending job instead of a waiting job, so it
3958 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073959 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453960 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443961 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343962 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283963 base::RunLoop().Run();
Matt Menke9fa17d52019-03-25 19:12:263964 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:073965}
3966
[email protected]b7b8be42011-07-12 12:46:413967TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:263968 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
3969 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:073970
3971 // Make the ConnectJob hang forever.
3972 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Matt Menkebd12b7e2019-03-25 21:12:033973 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263974 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3975 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3976 TestGroupId("a")));
3977 EXPECT_EQ(1u,
3978 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393979 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:283980 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073981
3982 // Make the backup job be a pending job, so it completes normally.
3983 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3984 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523985 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503986 EXPECT_EQ(
3987 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393988 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503989 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
3990 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
3991 NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413992 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:263993 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3994 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3995 TestGroupId("a")));
3996 EXPECT_EQ(0u,
3997 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393998 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263999 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014000 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074001
4002 // The hung connect job should still be there, but everything else should be
4003 // complete.
Matt Menke9fa17d52019-03-25 19:12:264004 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4005 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4006 TestGroupId("a")));
4007 EXPECT_EQ(1u,
4008 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394009 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264010 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074011}
4012
[email protected]0dc88b32014-03-26 20:12:284013// Tests that a preconnect that starts out with unread data can still be used.
4014// http://crbug.com/334467
4015TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4016 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4017 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4018
Matt Menkebd12b7e2019-03-25 21:12:034019 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284020
Matt Menke9fa17d52019-03-25 19:12:264021 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4022 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4023 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4024 TestGroupId("a")));
4025 EXPECT_EQ(0u,
4026 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394027 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284028
4029 // Fail future jobs to be sure that handle receives the preconnected socket
4030 // rather than closing it and making a new one.
4031 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4032 ClientSocketHandle handle;
4033 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394034 EXPECT_EQ(OK, handle.Init(
4035 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
4036 ClientSocketPool::RespectLimits::ENABLED,
4037 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4038 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284039
Matt Menke9fa17d52019-03-25 19:12:264040 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4041 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4042 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4043 TestGroupId("a")));
4044 EXPECT_EQ(0u,
4045 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394046 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264047 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284048
4049 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354050 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284051
4052 TestLoadTimingInfoConnectedReused(handle);
4053 handle.Reset();
4054
4055 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394056 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284057}
4058
Lily Chenecebf932018-11-02 17:15:434059TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4060 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4061 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4062
4063 ClientSocketHandle handle1;
4064 TestCompletionCallback callback1;
4065 EXPECT_EQ(
4066 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394067 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434068 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504069 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4070 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434071
Matt Menke9fa17d52019-03-25 19:12:264072 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4073 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4074 TestGroupId("a")));
4075 EXPECT_EQ(0u,
4076 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394077 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434078
Matt Menkec6b3edf72019-03-19 17:00:394079 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4080 &handle1));
Lily Chenecebf932018-11-02 17:15:434081}
4082
4083TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4084 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4085 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4086
4087 ClientSocketHandle handle1;
4088 TestCompletionCallback callback1;
4089 EXPECT_EQ(
4090 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394091 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434092 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504093 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4094 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434095
Matt Menke9fa17d52019-03-25 19:12:264096 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4097 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4098 TestGroupId("a")));
4099 EXPECT_EQ(0u,
4100 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394101 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434102
4103 ClientSocketHandle handle2;
4104 TestCompletionCallback callback2;
4105 EXPECT_EQ(
4106 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394107 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434108 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504109 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4110 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434111
Matt Menke9fa17d52019-03-25 19:12:264112 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4113 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4114 TestGroupId("a")));
4115 EXPECT_EQ(0u,
4116 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394117 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434118
Matt Menkec6b3edf72019-03-19 17:00:394119 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4120 &handle1));
4121 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4122 &handle2));
Lily Chenecebf932018-11-02 17:15:434123
4124 // One job completes. The other request should still have its job.
4125 client_socket_factory_.SignalJob(0);
4126 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4127
Matt Menke9fa17d52019-03-25 19:12:264128 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4129 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4130 TestGroupId("a")));
4131 EXPECT_EQ(0u,
4132 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4133 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394134 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434135
Matt Menkec6b3edf72019-03-19 17:00:394136 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4137 &handle2));
Lily Chenecebf932018-11-02 17:15:434138}
4139
4140TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4141 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4142 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4143
Matt Menkebd12b7e2019-03-25 21:12:034144 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434145
Matt Menke9fa17d52019-03-25 19:12:264146 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4147 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4148 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4149 TestGroupId("a")));
4150 EXPECT_EQ(1u,
4151 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394152 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434153
4154 ClientSocketHandle handle1;
4155 TestCompletionCallback callback1;
4156 EXPECT_EQ(
4157 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394158 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434159 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504160 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4161 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434162
Matt Menke9fa17d52019-03-25 19:12:264163 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4164 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4165 TestGroupId("a")));
4166 EXPECT_EQ(0u,
4167 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394168 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434169
Matt Menkec6b3edf72019-03-19 17:00:394170 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4171 &handle1));
Lily Chenecebf932018-11-02 17:15:434172}
4173
4174TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4175 CreatePool(kDefaultMaxSockets, 1);
4176 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4177
4178 ClientSocketHandle handle1;
4179 TestCompletionCallback callback1;
4180 EXPECT_EQ(
4181 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394182 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434183 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504184 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4185 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434186
Matt Menke9fa17d52019-03-25 19:12:264187 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4188 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4189 TestGroupId("a")));
4190 EXPECT_EQ(0u,
4191 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394192 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434193
Matt Menkec6b3edf72019-03-19 17:00:394194 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4195 &handle1));
Lily Chenecebf932018-11-02 17:15:434196
4197 // Insert a higher priority request
4198 ClientSocketHandle handle2;
4199 TestCompletionCallback callback2;
4200 EXPECT_EQ(
4201 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394202 handle2.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434203 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504204 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4205 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434206
Matt Menke9fa17d52019-03-25 19:12:264207 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4208 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4209 TestGroupId("a")));
4210 EXPECT_EQ(0u,
4211 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394212 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434213
4214 // The highest priority request should steal the job from the default priority
4215 // request.
Matt Menkec6b3edf72019-03-19 17:00:394216 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4217 &handle2));
4218 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4219 &handle1));
Lily Chenecebf932018-11-02 17:15:434220}
4221
4222TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4223 CreatePool(3, 3);
4224 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4225
4226 ClientSocketHandle handle_lowest;
4227 TestCompletionCallback callback_lowest;
4228 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394229 handle_lowest.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434230 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504231 callback_lowest.callback(),
4232 ClientSocketPool::ProxyAuthCallback(),
4233 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434234
Matt Menke9fa17d52019-03-25 19:12:264235 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4236 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4237 TestGroupId("a")));
4238 EXPECT_EQ(0u,
4239 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394240 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434241
4242 ClientSocketHandle handle_highest;
4243 TestCompletionCallback callback_highest;
4244 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394245 handle_highest.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434246 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504247 callback_highest.callback(),
4248 ClientSocketPool::ProxyAuthCallback(),
4249 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434250
Matt Menke9fa17d52019-03-25 19:12:264251 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4252 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4253 TestGroupId("a")));
4254 EXPECT_EQ(0u,
4255 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394256 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434257
4258 ClientSocketHandle handle_low;
4259 TestCompletionCallback callback_low;
4260 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394261 handle_low.Init(TestGroupId("a"), params_, LOW, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434262 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504263 callback_low.callback(),
4264 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
Lily Chenecebf932018-11-02 17:15:434265 NetLogWithSource()));
4266
Matt Menke9fa17d52019-03-25 19:12:264267 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4268 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4269 TestGroupId("a")));
4270 EXPECT_EQ(0u,
4271 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394272 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434273
4274 ClientSocketHandle handle_lowest2;
4275 TestCompletionCallback callback_lowest2;
4276 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394277 handle_lowest2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434278 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504279 callback_lowest2.callback(),
4280 ClientSocketPool::ProxyAuthCallback(),
4281 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434282
Matt Menke9fa17d52019-03-25 19:12:264283 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4284 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4285 TestGroupId("a")));
4286 EXPECT_EQ(0u,
4287 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394288 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434289
4290 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394291 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4292 &handle_highest));
4293 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4294 &handle_low));
4295 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4296 &handle_lowest));
4297 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4298 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434299
4300 // Add another request with medium priority. It should steal the job from the
4301 // lowest priority request with a job.
4302 ClientSocketHandle handle_medium;
4303 TestCompletionCallback callback_medium;
4304 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394305 handle_medium.Init(TestGroupId("a"), params_, MEDIUM, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434306 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504307 callback_medium.callback(),
4308 ClientSocketPool::ProxyAuthCallback(),
4309 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434310
Matt Menke9fa17d52019-03-25 19:12:264311 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4312 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4313 TestGroupId("a")));
4314 EXPECT_EQ(0u,
4315 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394316 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4317 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4318 &handle_highest));
4319 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4320 &handle_medium));
4321 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4322 &handle_low));
4323 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4324 &handle_lowest));
4325 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4326 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434327}
4328
4329TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4330 CreatePool(kDefaultMaxSockets, 1);
4331 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4332
4333 ClientSocketHandle handle1;
4334 TestCompletionCallback callback1;
4335 EXPECT_EQ(
4336 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394337 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434338 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504339 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4340 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434341
Matt Menke9fa17d52019-03-25 19:12:264342 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4343 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4344 TestGroupId("a")));
4345 EXPECT_EQ(0u,
4346 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394347 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434348
4349 ClientSocketHandle handle2;
4350 TestCompletionCallback callback2;
4351 EXPECT_EQ(
4352 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394353 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434354 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504355 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4356 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434357
Matt Menke9fa17d52019-03-25 19:12:264358 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4359 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4360 TestGroupId("a")));
4361 EXPECT_EQ(0u,
4362 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394363 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434364
4365 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394366 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4367 &handle1));
4368 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4369 &handle2));
Lily Chenecebf932018-11-02 17:15:434370
4371 // Reprioritizing the second request places it above the first, and it steals
4372 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394373 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4374 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4375 &handle2));
4376 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4377 &handle1));
Lily Chenecebf932018-11-02 17:15:434378}
4379
4380TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4381 CreatePool(kDefaultMaxSockets, 1);
4382 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4383
4384 ClientSocketHandle handle1;
4385 TestCompletionCallback callback1;
4386 EXPECT_EQ(
4387 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394388 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434389 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504390 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4391 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434392
Matt Menke9fa17d52019-03-25 19:12:264393 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4394 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4395 TestGroupId("a")));
4396 EXPECT_EQ(0u,
4397 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394398 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434399
Matt Menkec6b3edf72019-03-19 17:00:394400 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4401 &handle1));
Lily Chenecebf932018-11-02 17:15:434402
4403 ClientSocketHandle handle2;
4404 TestCompletionCallback callback2;
4405 EXPECT_EQ(
4406 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394407 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434408 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504409 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4410 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434411
Matt Menke9fa17d52019-03-25 19:12:264412 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4413 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4414 TestGroupId("a")));
4415 EXPECT_EQ(0u,
4416 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394417 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434418
4419 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394420 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4421 &handle1));
4422 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4423 &handle2));
Lily Chenecebf932018-11-02 17:15:434424
4425 // The second request should get a job upon cancelling the first request.
4426 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264427 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4428 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4429 TestGroupId("a")));
4430 EXPECT_EQ(0u,
4431 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394432 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434433
Matt Menkec6b3edf72019-03-19 17:00:394434 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4435 &handle2));
Lily Chenecebf932018-11-02 17:15:434436}
4437
4438TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4439 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4440 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4441
4442 ClientSocketHandle handle1;
4443 TestCompletionCallback callback1;
4444 EXPECT_EQ(
4445 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394446 handle1.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434447 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504448 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4449 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434450
Matt Menke9fa17d52019-03-25 19:12:264451 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4452 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4453 TestGroupId("a")));
4454 EXPECT_EQ(0u,
4455 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394456 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434457
4458 ClientSocketHandle handle2;
4459 TestCompletionCallback callback2;
4460 EXPECT_EQ(
4461 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394462 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434463 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504464 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4465 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434466
Matt Menke9fa17d52019-03-25 19:12:264467 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4468 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4469 TestGroupId("a")));
4470 EXPECT_EQ(0u,
4471 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394472 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434473
Matt Menkec6b3edf72019-03-19 17:00:394474 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4475 &handle1));
4476 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4477 &handle2));
Lily Chenecebf932018-11-02 17:15:434478
4479 // The lower-priority job completes first. The higher-priority request should
4480 // get the socket, and the lower-priority request should get the remaining
4481 // job.
4482 client_socket_factory_.SignalJob(1);
4483 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264484 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4485 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4486 TestGroupId("a")));
4487 EXPECT_EQ(0u,
4488 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4489 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394490 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434491 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394492 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4493 &handle2));
Lily Chenecebf932018-11-02 17:15:434494}
4495
[email protected]043b68c82013-08-22 23:41:524496class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204497 public:
Matt Menke9fa17d52019-03-25 19:12:264498 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394499 const ClientSocketPool::GroupId& group_id)
4500 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524501 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204502 }
4503
Daniel Cheng4496d0822018-04-26 21:52:154504 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204505
Matt Menke9fa17d52019-03-25 19:12:264506 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504507 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034508 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
4509 DEFAULT_PRIORITY, SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4510 callback_.callback(), ClientSocketPool::ProxyAuthCallback(), pool,
4511 NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204512 }
4513
Matt Menke9fa17d52019-03-25 19:12:264514 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504515 return handle_.Init(
Matt Menke870e19ab2019-04-23 16:23:034516 group_id_, ClientSocketPool::SocketParams::CreateForHttpForTesting(),
4517 MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504518 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4519 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204520 }
4521
4522 bool ReleaseOneConnection() {
4523 if (!handle_.is_initialized() || !can_release_connection_) {
4524 return false;
4525 }
4526 handle_.socket()->Disconnect();
4527 handle_.Reset();
4528 return true;
4529 }
4530
4531 void set_can_release_connection(bool can_release_connection) {
4532 can_release_connection_ = can_release_connection;
4533 }
4534
4535 MOCK_METHOD0(CloseOneIdleConnection, bool());
4536
4537 private:
Matt Menke9fa17d52019-03-25 19:12:264538 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204539 ClientSocketHandle handle_;
4540 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394541 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204542 bool can_release_connection_;
4543};
4544
[email protected]58e562f2013-04-22 17:32:204545// Tests the basic case of closing an idle socket in a higher layered pool when
4546// a new request is issued and the lower layer pool is stalled.
4547TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4548 CreatePool(1, 1);
4549 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4550
Matt Menkec6b3edf72019-03-19 17:00:394551 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014552 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204553 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4554 .WillOnce(Invoke(&mock_layered_pool,
4555 &MockLayeredPool::ReleaseOneConnection));
4556 ClientSocketHandle handle;
4557 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504558 EXPECT_EQ(
4559 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394560 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504561 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4562 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4563 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014564 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204565}
4566
Matt Menke833678642019-03-05 22:05:514567// Tests the case that trying to close an idle socket in a higher layered pool
4568// fails.
4569TEST_F(ClientSocketPoolBaseTest,
4570 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4571 CreatePool(1, 1);
4572 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4573
Matt Menkec6b3edf72019-03-19 17:00:394574 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514575 mock_layered_pool.set_can_release_connection(false);
4576 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4577 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4578 .WillOnce(Invoke(&mock_layered_pool,
4579 &MockLayeredPool::ReleaseOneConnection));
4580 ClientSocketHandle handle;
4581 TestCompletionCallback callback;
4582 EXPECT_EQ(
4583 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394584 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke833678642019-03-05 22:05:514585 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4586 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4587 NetLogWithSource()));
4588 base::RunLoop().RunUntilIdle();
4589 EXPECT_FALSE(callback.have_result());
4590}
4591
[email protected]58e562f2013-04-22 17:32:204592// Same as above, but the idle socket is in the same group as the stalled
4593// socket, and closes the only other request in its group when closing requests
4594// in higher layered pools. This generally shouldn't happen, but it may be
4595// possible if a higher level pool issues a request and the request is
4596// subsequently cancelled. Even if it's not possible, best not to crash.
4597TEST_F(ClientSocketPoolBaseTest,
4598 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4599 CreatePool(2, 2);
4600 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4601
4602 // Need a socket in another group for the pool to be stalled (If a group
4603 // has the maximum number of connections already, it's not stalled).
4604 ClientSocketHandle handle1;
4605 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394606 EXPECT_EQ(OK, handle1.Init(
4607 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4608 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4609 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4610 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204611
Matt Menkec6b3edf72019-03-19 17:00:394612 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014613 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204614 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4615 .WillOnce(Invoke(&mock_layered_pool,
4616 &MockLayeredPool::ReleaseOneConnection));
4617 ClientSocketHandle handle;
4618 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:504619 EXPECT_EQ(
4620 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394621 handle.Init(TestGroupId("group2"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504622 ClientSocketPool::RespectLimits::ENABLED,
4623 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4624 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014625 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204626}
4627
4628// Tests the case when an idle socket can be closed when a new request is
4629// issued, and the new request belongs to a group that was previously stalled.
4630TEST_F(ClientSocketPoolBaseTest,
4631 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4632 CreatePool(2, 2);
4633 std::list<TestConnectJob::JobType> job_types;
4634 job_types.push_back(TestConnectJob::kMockJob);
4635 job_types.push_back(TestConnectJob::kMockJob);
4636 job_types.push_back(TestConnectJob::kMockJob);
4637 job_types.push_back(TestConnectJob::kMockJob);
4638 connect_job_factory_->set_job_types(&job_types);
4639
4640 ClientSocketHandle handle1;
4641 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394642 EXPECT_EQ(OK, handle1.Init(
4643 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4644 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4645 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4646 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204647
Matt Menkec6b3edf72019-03-19 17:00:394648 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014649 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204650 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4651 .WillRepeatedly(Invoke(&mock_layered_pool,
4652 &MockLayeredPool::ReleaseOneConnection));
4653 mock_layered_pool.set_can_release_connection(false);
4654
4655 // The third request is made when the socket pool is in a stalled state.
4656 ClientSocketHandle handle3;
4657 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204658 EXPECT_EQ(
4659 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394660 handle3.Init(TestGroupId("group3"), params_, DEFAULT_PRIORITY,
4661 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504662 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4663 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204664
4665 base::RunLoop().RunUntilIdle();
4666 EXPECT_FALSE(callback3.have_result());
4667
4668 // The fourth request is made when the pool is no longer stalled. The third
4669 // request should be serviced first, since it was issued first and has the
4670 // same priority.
4671 mock_layered_pool.set_can_release_connection(true);
4672 ClientSocketHandle handle4;
4673 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204674 EXPECT_EQ(
4675 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394676 handle4.Init(TestGroupId("group3"), params_, DEFAULT_PRIORITY,
4677 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504678 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4679 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014680 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204681 EXPECT_FALSE(callback4.have_result());
4682
4683 // Closing a handle should free up another socket slot.
4684 handle1.Reset();
robpercival214763f2016-07-01 23:27:014685 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204686}
4687
4688// Tests the case when an idle socket can be closed when a new request is
4689// issued, and the new request belongs to a group that was previously stalled.
4690//
4691// The two differences from the above test are that the stalled requests are not
4692// in the same group as the layered pool's request, and the the fourth request
4693// has a higher priority than the third one, so gets a socket first.
4694TEST_F(ClientSocketPoolBaseTest,
4695 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4696 CreatePool(2, 2);
4697 std::list<TestConnectJob::JobType> job_types;
4698 job_types.push_back(TestConnectJob::kMockJob);
4699 job_types.push_back(TestConnectJob::kMockJob);
4700 job_types.push_back(TestConnectJob::kMockJob);
4701 job_types.push_back(TestConnectJob::kMockJob);
4702 connect_job_factory_->set_job_types(&job_types);
4703
4704 ClientSocketHandle handle1;
4705 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394706 EXPECT_EQ(OK, handle1.Init(
4707 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4708 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4709 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4710 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204711
Matt Menkec6b3edf72019-03-19 17:00:394712 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014713 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204714 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4715 .WillRepeatedly(Invoke(&mock_layered_pool,
4716 &MockLayeredPool::ReleaseOneConnection));
4717 mock_layered_pool.set_can_release_connection(false);
4718
4719 // The third request is made when the socket pool is in a stalled state.
4720 ClientSocketHandle handle3;
4721 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204722 EXPECT_EQ(
4723 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394724 handle3.Init(TestGroupId("group3"), params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:204725 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504726 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4727 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204728
4729 base::RunLoop().RunUntilIdle();
4730 EXPECT_FALSE(callback3.have_result());
4731
4732 // The fourth request is made when the pool is no longer stalled. This
4733 // request has a higher priority than the third request, so is serviced first.
4734 mock_layered_pool.set_can_release_connection(true);
4735 ClientSocketHandle handle4;
4736 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204737 EXPECT_EQ(
4738 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394739 handle4.Init(TestGroupId("group3"), params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:204740 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504741 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4742 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014743 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204744 EXPECT_FALSE(callback3.have_result());
4745
4746 // Closing a handle should free up another socket slot.
4747 handle1.Reset();
robpercival214763f2016-07-01 23:27:014748 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204749}
4750
4751TEST_F(ClientSocketPoolBaseTest,
4752 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4753 CreatePool(1, 1);
4754 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4755
Matt Menkec6b3edf72019-03-19 17:00:394756 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014757 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204758 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4759 .WillRepeatedly(Invoke(&mock_layered_pool1,
4760 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:394761 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:014762 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4763 IsOk());
[email protected]58e562f2013-04-22 17:32:204764 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4765 .WillRepeatedly(Invoke(&mock_layered_pool2,
4766 &MockLayeredPool::ReleaseOneConnection));
4767 ClientSocketHandle handle;
4768 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504769 EXPECT_EQ(
4770 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394771 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504772 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4773 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4774 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014775 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204776}
4777
[email protected]b021ece62013-06-11 11:06:334778// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154779// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4780// socket instead of a request with the same priority that was issued earlier,
4781// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334782TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334783 CreatePool(1, 1);
4784
4785 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:394786 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
4787 TestGroupId("a"), MAXIMUM_PRIORITY,
4788 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264789 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334790
4791 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4792
mmenked3641e12016-01-28 16:06:154793 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394794 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154795 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264796 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334797
mmenked3641e12016-01-28 16:06:154798 // Issue a request that ignores the limits, so a new ConnectJob is
4799 // created.
4800 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394801 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154802 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:264803 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334804
robpercival214763f2016-07-01 23:27:014805 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334806 EXPECT_FALSE(request(1)->have_result());
4807}
4808
[email protected]c55fabd2013-11-04 23:26:564809// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154810// issued for a request with RespectLimits::DISABLED is not cancelled when a
4811// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564812TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564813 CreatePool(1, 1);
4814
4815 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:394816 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
4817 TestGroupId("a"), MAXIMUM_PRIORITY,
4818 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264819 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:564820
4821 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4822
mmenked3641e12016-01-28 16:06:154823 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394824 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154825 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264826 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:564827
mmenked3641e12016-01-28 16:06:154828 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4829 // created.
4830 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394831 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154832 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:264833 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334834
mmenked3641e12016-01-28 16:06:154835 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334836 // should not be cancelled.
4837 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:264838 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334839
robpercival214763f2016-07-01 23:27:014840 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334841 EXPECT_FALSE(request(1)->have_result());
4842}
4843
Matt Menkeb57663b32019-03-01 17:17:104844TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
4845 CreatePool(1, 1);
4846
4847 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4848
4849 ClientSocketHandle handle;
4850 TestCompletionCallback callback;
4851 EXPECT_EQ(
4852 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394853 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menkeb57663b32019-03-01 17:17:104854 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4855 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4856 NetLogWithSource()));
4857
Matt Menke9fa17d52019-03-25 19:12:264858 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104859
4860 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
4861 EXPECT_FALSE(handle.is_initialized());
4862 EXPECT_FALSE(handle.socket());
4863
4864 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:264865 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104866}
4867
4868class TestAuthHelper {
4869 public:
4870 TestAuthHelper() = default;
4871 ~TestAuthHelper() = default;
4872
Matt Menkec6b3edf72019-03-19 17:00:394873 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:194874 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:264875 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394876 RequestPriority priority = DEFAULT_PRIORITY,
4877 ClientSocketPool::RespectLimits respect_limits =
4878 ClientSocketPool::RespectLimits::ENABLED,
4879 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:104880 EXPECT_EQ(ERR_IO_PENDING,
Matt Menke9fa17d52019-03-25 19:12:264881 handle_.Init(group_id_in, params, priority, SocketTag(),
Matt Menkeb57663b32019-03-01 17:17:104882 respect_limits, callback_.callback(),
4883 base::BindRepeating(&TestAuthHelper::AuthCallback,
4884 base::Unretained(this)),
4885 pool, NetLogWithSource()));
4886 }
4887
4888 void WaitForAuth() {
4889 run_loop_ = std::make_unique<base::RunLoop>();
4890 run_loop_->Run();
4891 run_loop_.reset();
4892 }
4893
4894 void WaitForAuthAndRestartSync() {
4895 restart_sync_ = true;
4896 WaitForAuth();
4897 restart_sync_ = false;
4898 }
4899
4900 void WaitForAuthAndResetHandleSync() {
4901 reset_handle_sync_ = true;
4902 WaitForAuth();
4903 reset_handle_sync_ = false;
4904 }
4905
4906 void RestartWithAuth() {
4907 DCHECK(restart_with_auth_callback_);
4908 std::move(restart_with_auth_callback_).Run();
4909 }
4910
4911 int WaitForResult() {
4912 int result = callback_.WaitForResult();
4913 // There shouldn't be any callback waiting to be invoked once the request is
4914 // complete.
4915 EXPECT_FALSE(restart_with_auth_callback_);
4916 // The socket should only be initialized on success.
4917 EXPECT_EQ(result == OK, handle_.is_initialized());
4918 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
4919 return result;
4920 }
4921
4922 ClientSocketHandle* handle() { return &handle_; }
4923 int auth_count() const { return auth_count_; }
4924 int have_result() const { return callback_.have_result(); }
4925
4926 private:
4927 void AuthCallback(const HttpResponseInfo& response,
4928 HttpAuthController* auth_controller,
4929 base::OnceClosure restart_with_auth_callback) {
4930 EXPECT_FALSE(restart_with_auth_callback_);
4931 EXPECT_TRUE(restart_with_auth_callback);
4932
4933 // Once there's a result, this method shouldn't be invoked again.
4934 EXPECT_FALSE(callback_.have_result());
4935
4936 ++auth_count_;
4937 run_loop_->Quit();
4938 if (restart_sync_) {
4939 std::move(restart_with_auth_callback).Run();
4940 return;
4941 }
4942
4943 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
4944
4945 if (reset_handle_sync_) {
4946 handle_.Reset();
4947 return;
4948 }
4949 }
4950
4951 std::unique_ptr<base::RunLoop> run_loop_;
4952 base::OnceClosure restart_with_auth_callback_;
4953
4954 bool restart_sync_ = false;
4955 bool reset_handle_sync_ = false;
4956
4957 ClientSocketHandle handle_;
4958 int auth_count_ = 0;
4959 TestCompletionCallback callback_;
4960
4961 DISALLOW_COPY_AND_ASSIGN(TestAuthHelper);
4962};
4963
4964TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
4965 CreatePool(1, 1);
4966 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4967
4968 TestAuthHelper auth_helper;
4969 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:264970 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014971 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:394972 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104973
4974 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:264975 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014976 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:394977 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104978
4979 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:264980 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014981 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:394982 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104983
4984 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
4985 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:264986 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4987 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394988 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104989 EXPECT_EQ(0, pool_->IdleSocketCount());
4990}
4991
4992TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
4993 CreatePool(1, 1);
4994 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4995
4996 TestAuthHelper auth_helper;
4997 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:264998 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014999 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395000 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105001
5002 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265003 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015004 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395005 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105006
5007 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5008 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265009 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5010 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395011 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105012 EXPECT_EQ(0, pool_->IdleSocketCount());
5013}
5014
5015TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5016 CreatePool(1, 1);
5017 connect_job_factory_->set_job_type(
5018 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5019
5020 TestAuthHelper auth_helper;
5021 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265022 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105023
5024 auth_helper.WaitForAuth();
5025 auth_helper.RestartWithAuth();
5026 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5027
5028 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265029 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105030 EXPECT_EQ(0, pool_->IdleSocketCount());
5031}
5032
5033TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5034 CreatePool(1, 1);
5035 connect_job_factory_->set_job_type(
5036 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5037
5038 TestAuthHelper auth_helper;
5039 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265040 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105041
5042 auth_helper.WaitForAuthAndRestartSync();
5043 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5044
5045 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265046 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105047 EXPECT_EQ(0, pool_->IdleSocketCount());
5048}
5049
5050TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5051 CreatePool(1, 1);
5052 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5053
5054 TestAuthHelper auth_helper;
5055 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265056 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105057
5058 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265059 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105060
5061 auth_helper.handle()->Reset();
5062
5063 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265064 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105065 EXPECT_EQ(0, pool_->IdleSocketCount());
5066 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5067 EXPECT_FALSE(auth_helper.handle()->socket());
5068}
5069
5070TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5071 CreatePool(1, 1);
5072 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5073
5074 TestAuthHelper auth_helper;
5075 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265076 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105077
5078 auth_helper.WaitForAuthAndResetHandleSync();
5079 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265080 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105081 EXPECT_EQ(0, pool_->IdleSocketCount());
5082 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5083 EXPECT_FALSE(auth_helper.handle()->socket());
5084}
5085
5086TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5087 CreatePool(1, 1);
5088 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5089
5090 TestAuthHelper auth_helper;
5091 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265092 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105093
5094 auth_helper.WaitForAuth();
5095
5096 pool_->FlushWithError(ERR_FAILED);
5097 base::RunLoop().RunUntilIdle();
5098
5099 // When flushing the socket pool, bound sockets should delay returning the
5100 // error until completion.
5101 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265102 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105103 EXPECT_EQ(0, pool_->IdleSocketCount());
5104
5105 auth_helper.RestartWithAuth();
5106 // The callback should be called asynchronously.
5107 EXPECT_FALSE(auth_helper.have_result());
5108
5109 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265110 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105111 EXPECT_EQ(0, pool_->IdleSocketCount());
5112}
5113
5114TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5115 CreatePool(1, 1);
5116 connect_job_factory_->set_job_type(
5117 TestConnectJob::kMockAuthChallengeTwiceJob);
5118
5119 TestAuthHelper auth_helper;
5120 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265121 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015122 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395123 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105124
5125 auth_helper.WaitForAuth();
5126 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265127 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105128 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015129 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395130 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105131
5132 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265133 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015134 EXPECT_EQ(2, auth_helper.auth_count());
5135 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395136 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015137
Matt Menkeb57663b32019-03-01 17:17:105138 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265139 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105140 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015141 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395142 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105143
5144 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5145 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265146 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5147 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395148 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105149 EXPECT_EQ(0, pool_->IdleSocketCount());
5150}
5151
5152TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5153 CreatePool(1, 1);
5154 connect_job_factory_->set_job_type(
5155 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5156
5157 TestAuthHelper auth_helper;
5158 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265159 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105160
5161 auth_helper.WaitForAuth();
5162 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265163 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105164 EXPECT_EQ(1, auth_helper.auth_count());
5165
5166 auth_helper.WaitForAuth();
5167 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265168 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105169 EXPECT_EQ(2, auth_helper.auth_count());
5170
5171 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5172 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265173 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105174 EXPECT_EQ(0, pool_->IdleSocketCount());
5175}
5176
5177// Makes sure that when a bound request is destroyed, a new ConnectJob is
5178// created, if needed.
5179TEST_F(ClientSocketPoolBaseTest,
5180 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5181 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5182 connect_job_factory_->set_job_type(
5183 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5184
5185 // First request creates a ConnectJob.
5186 TestAuthHelper auth_helper1;
5187 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265188 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105189
5190 // A second request come in, but no new ConnectJob is needed, since the limit
5191 // has been reached.
5192 TestAuthHelper auth_helper2;
5193 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265194 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105195
5196 // Run until the auth callback for the first request is invoked.
5197 auth_helper1.WaitForAuth();
5198 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265199 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5200 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395201 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105202
5203 // Make connect jobs succeed, then cancel the first request, which should
5204 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5205 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5206 auth_helper1.handle()->Reset();
5207 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265208 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105209
5210 // The second ConnectJob should succeed.
5211 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5212 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265213 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105214}
5215
5216// Makes sure that when a bound request is destroyed, a new ConnectJob is
5217// created for another group, if needed.
5218TEST_F(ClientSocketPoolBaseTest,
5219 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5220 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5221 connect_job_factory_->set_job_type(
5222 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5223
5224 // First request creates a ConnectJob.
5225 TestAuthHelper auth_helper1;
5226 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265227 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105228
5229 // A second request come in, but no new ConnectJob is needed, since the limit
5230 // has been reached.
5231 TestAuthHelper auth_helper2;
5232 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395233 ClientSocketPool::RespectLimits::ENABLED,
5234 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265235 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5236 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105237
5238 // Run until the auth callback for the first request is invoked.
5239 auth_helper1.WaitForAuth();
5240 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265241 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5242 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395243 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265244 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5245 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395246 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105247
5248 // Make connect jobs succeed, then cancel the first request, which should
5249 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5250 // other group.
5251 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5252 auth_helper1.handle()->Reset();
5253 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265254 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5255 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105256
5257 // The second ConnectJob should succeed.
5258 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5259 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265260 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5261 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105262}
5263
5264// Test that once an auth challenge is bound, that's the request that gets all
5265// subsequent calls and the socket itself.
5266TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5267 CreatePool(1, 1);
5268 connect_job_factory_->set_job_type(
5269 TestConnectJob::kMockAuthChallengeTwiceJob);
5270
5271 // First request creates a ConnectJob.
5272 TestAuthHelper auth_helper1;
5273 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265274 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105275
5276 // A second, higher priority request is made.
5277 TestAuthHelper auth_helper2;
5278 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265279 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105280
5281 // Run until the auth callback for the second request is invoked.
5282 auth_helper2.WaitForAuth();
5283 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265284 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5285 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395286 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105287
5288 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5289 // ConnectJob.
5290 TestAuthHelper auth_helper3;
5291 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265292 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105293
5294 // Start a higher job that ignores limits, creating a hanging socket. It
5295 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5296 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5297 TestAuthHelper auth_helper4;
5298 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5299 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265300 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105301
5302 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5303 // again.
5304 auth_helper2.RestartWithAuth();
5305 auth_helper2.WaitForAuth();
5306 EXPECT_EQ(0, auth_helper1.auth_count());
5307 EXPECT_FALSE(auth_helper1.have_result());
5308 EXPECT_EQ(2, auth_helper2.auth_count());
5309 EXPECT_FALSE(auth_helper2.have_result());
5310 EXPECT_EQ(0, auth_helper3.auth_count());
5311 EXPECT_FALSE(auth_helper3.have_result());
5312 EXPECT_EQ(0, auth_helper4.auth_count());
5313 EXPECT_FALSE(auth_helper4.have_result());
5314
5315 // Advance auth again, and |auth_helper2| should get the socket.
5316 auth_helper2.RestartWithAuth();
5317 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5318 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5319 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265320 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5321 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105322 EXPECT_EQ(0, auth_helper1.auth_count());
5323 EXPECT_FALSE(auth_helper1.have_result());
5324 EXPECT_EQ(0, auth_helper3.auth_count());
5325 EXPECT_FALSE(auth_helper3.have_result());
5326 EXPECT_EQ(0, auth_helper4.auth_count());
5327 EXPECT_FALSE(auth_helper4.have_result());
5328
5329 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5330 // socket request should be able to claim it.
5331 auth_helper2.handle()->Reset();
5332 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5333 EXPECT_EQ(0, auth_helper1.auth_count());
5334 EXPECT_FALSE(auth_helper1.have_result());
5335 EXPECT_EQ(0, auth_helper3.auth_count());
5336 EXPECT_FALSE(auth_helper3.have_result());
5337 EXPECT_EQ(0, auth_helper4.auth_count());
5338}
5339
Matt Menkebf3c767d2019-04-15 23:28:245340TEST_F(ClientSocketPoolBaseTest, RefreshGroupCreatesNewConnectJobs) {
5341 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5342 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5343
5344 // First job will be waiting until it gets aborted.
5345 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5346
5347 ClientSocketHandle handle;
5348 TestCompletionCallback callback;
5349 EXPECT_THAT(
5350 handle.Init(kGroupId, params_, DEFAULT_PRIORITY, SocketTag(),
5351 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
5352 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5353 NetLogWithSource()),
5354 IsError(ERR_IO_PENDING));
5355
5356 // Switch connect job types, so creating a new ConnectJob will result in
5357 // success.
5358 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5359
5360 pool_->RefreshGroupForTesting(kGroupId);
5361 EXPECT_EQ(OK, callback.WaitForResult());
5362 ASSERT_TRUE(handle.socket());
5363 EXPECT_EQ(0, pool_->IdleSocketCount());
5364 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5365 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5366 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5367 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5368}
5369
5370TEST_F(ClientSocketPoolBaseTest, RefreshGroupClosesIdleConnectJobs) {
5371 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5372 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5373
5374 pool_->RequestSockets(kGroupId, params_, 2, NetLogWithSource());
5375 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5376 EXPECT_EQ(2, pool_->IdleSocketCount());
5377 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
5378
5379 pool_->RefreshGroupForTesting(kGroupId);
5380 EXPECT_EQ(0, pool_->IdleSocketCount());
5381 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5382}
5383
5384TEST_F(ClientSocketPoolBaseTest,
5385 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5386 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5387 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5388 const ClientSocketPool::GroupId kOtherGroupId = TestGroupId("b");
5389
5390 pool_->RequestSockets(kOtherGroupId, params_, 2, NetLogWithSource());
5391 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5392 EXPECT_EQ(2, pool_->IdleSocketCount());
5393 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5394
5395 pool_->RefreshGroupForTesting(kGroupId);
5396 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5397 EXPECT_EQ(2, pool_->IdleSocketCount());
5398 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5399}
5400
5401TEST_F(ClientSocketPoolBaseTest, RefreshGroupPreventsSocketReuse) {
5402 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5403 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5404
5405 ClientSocketHandle handle;
5406 TestCompletionCallback callback;
5407 EXPECT_THAT(
5408 handle.Init(kGroupId, params_, DEFAULT_PRIORITY, SocketTag(),
5409 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
5410 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5411 NetLogWithSource()),
5412 IsOk());
5413 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5414 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5415
5416 pool_->RefreshGroupForTesting(kGroupId);
5417
5418 handle.Reset();
5419 EXPECT_EQ(0, pool_->IdleSocketCount());
5420 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5421}
5422
5423TEST_F(ClientSocketPoolBaseTest,
5424 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5425 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5426 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5427 const ClientSocketPool::GroupId kOtherGroupId = TestGroupId("b");
5428
5429 ClientSocketHandle handle;
5430 TestCompletionCallback callback;
5431 EXPECT_THAT(
5432 handle.Init(kOtherGroupId, params_, DEFAULT_PRIORITY, SocketTag(),
5433 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
5434 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5435 NetLogWithSource()),
5436 IsOk());
5437 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5438 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5439
5440 pool_->RefreshGroupForTesting(kGroupId);
5441
5442 handle.Reset();
5443 EXPECT_EQ(1, pool_->IdleSocketCount());
5444 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5445 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5446}
5447
5448TEST_F(ClientSocketPoolBaseTest, RefreshGroupReplacesBoundConnectJobOnConnect) {
5449 CreatePool(1, 1);
5450 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5451 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5452
5453 TestAuthHelper auth_helper;
5454 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5455 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5456 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5457
5458 auth_helper.WaitForAuth();
5459
5460 // This should update the generation, but not cancel the old ConnectJob - it's
5461 // not safe to do anything while waiting on the original ConnectJob.
5462 pool_->RefreshGroupForTesting(kGroupId);
5463
5464 // Providing auth credentials and restarting the request with them will cause
5465 // the ConnectJob to complete successfully, but the result will be discarded
5466 // because of the generation mismatch.
5467 auth_helper.RestartWithAuth();
5468
5469 // Despite using ConnectJobs that simulate a single challenge, a second
5470 // challenge will be seen, due to using a new ConnectJob.
5471 auth_helper.WaitForAuth();
5472 auth_helper.RestartWithAuth();
5473
5474 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5475 EXPECT_TRUE(auth_helper.handle()->socket());
5476 EXPECT_EQ(2, auth_helper.auth_count());
5477
5478 // When released, the socket will be returned to the socket pool, and
5479 // available for reuse.
5480 auth_helper.handle()->Reset();
5481 EXPECT_EQ(1, pool_->IdleSocketCount());
5482 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5483 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5484}
5485
[email protected]f6d1d6eb2009-06-24 20:16:095486} // namespace
5487
5488} // namespace net