blob: fc04510cc46923e43d9f916c61e4f69384d3ceba [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
Matt Menke84d11e562019-03-27 00:11:1984// Returns a ClientSocketPool::SocketParams that will never be used to
Matt Menke9fa17d52019-03-25 19:12:2685// create a real TreansportConnectJob.
Matt Menke84d11e562019-03-27 00:11:1986scoped_refptr<ClientSocketPool::SocketParams> CreateDummyParams() {
87 return ClientSocketPool::SocketParams::CreateFromTransportSocketParams(
88 base::MakeRefCounted<TransportSocketParams>(HostPortPair("ignored", 80),
89 OnHostResolutionCallback()));
Matt Menke9fa17d52019-03-25 19:12:2690}
91
[email protected]034df0f32013-01-07 23:17:4892// Make sure |handle| sets load times correctly when it has been assigned a
93// reused socket.
94void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
95 LoadTimingInfo load_timing_info;
96 // Only pass true in as |is_reused|, as in general, HttpStream types should
97 // have stricter concepts of reuse than socket pools.
98 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
99
100 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19101 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48102
[email protected]b258e0792013-01-12 07:11:59103 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
104 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48105}
106
107// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33108// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48109// of a connection where |is_reused| is false may consider the connection
110// reused.
111void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
112 EXPECT_FALSE(handle.is_reused());
113
114 LoadTimingInfo load_timing_info;
115 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
116
117 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19118 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48119
[email protected]b258e0792013-01-12 07:11:59120 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
121 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
122 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48123
124 TestLoadTimingInfoConnectedReused(handle);
125}
126
127// Make sure |handle| sets load times correctly, in the case that it does not
128// currently have a socket.
129void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
130 // Should only be set to true once a socket is assigned, if at all.
131 EXPECT_FALSE(handle.is_reused());
132
133 LoadTimingInfo load_timing_info;
134 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
135
136 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19137 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48138
[email protected]b258e0792013-01-12 07:11:59139 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
140 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48141}
142
[email protected]3268023f2011-05-05 00:08:10143class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09144 public:
[email protected]034df0f32013-01-07 23:17:48145 explicit MockClientSocket(net::NetLog* net_log)
146 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28147 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20148 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30149 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09150
[email protected]0dc88b32014-03-26 20:12:28151 // Sets whether the socket has unread data. If true, the next call to Read()
152 // will return 1 byte and IsConnectedAndIdle() will return false.
153 void set_has_unread_data(bool has_unread_data) {
154 has_unread_data_ = has_unread_data;
155 }
156
[email protected]3f55aa12011-12-07 02:03:33157 // Socket implementation.
dchengb03027d2014-10-21 12:00:20158 int Read(IOBuffer* /* buf */,
159 int len,
Brad Lassey3a814172018-04-26 03:30:21160 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28161 if (has_unread_data_ && len > 0) {
162 has_unread_data_ = false;
163 was_used_to_convey_data_ = true;
164 return 1;
165 }
[email protected]e86df8dc2013-03-30 13:18:28166 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33167 }
[email protected]ab838892009-06-30 18:49:05168
[email protected]a2b2cfc2017-12-06 09:06:08169 int Write(
170 IOBuffer* /* buf */,
171 int len,
Brad Lassey3a814172018-04-26 03:30:21172 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08173 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01174 was_used_to_convey_data_ = true;
175 return len;
[email protected]ab838892009-06-30 18:49:05176 }
Avi Drissman13fc8932015-12-20 04:40:46177 int SetReceiveBufferSize(int32_t size) override { return OK; }
178 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05179
[email protected]dbf036f2011-12-06 23:33:24180 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21181 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24182 connected_ = true;
183 return OK;
184 }
[email protected]f6d1d6eb2009-06-24 20:16:09185
dchengb03027d2014-10-21 12:00:20186 void Disconnect() override { connected_ = false; }
187 bool IsConnected() const override { return connected_; }
188 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28189 return connected_ && !has_unread_data_;
190 }
[email protected]0b7648c2009-07-06 20:14:01191
dchengb03027d2014-10-21 12:00:20192 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16193 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09194 }
[email protected]f6d1d6eb2009-06-24 20:16:09195
dchengb03027d2014-10-21 12:00:20196 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35197 return ERR_UNEXPECTED;
198 }
199
tfarina428341112016-09-22 13:38:20200 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02201
dchengb03027d2014-10-21 12:00:20202 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37203 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20204 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
205 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03206 void GetConnectionAttempts(ConnectionAttempts* out) const override {
207 out->clear();
208 }
209 void ClearConnectionAttempts() override {}
210 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49211 int64_t GetTotalReceivedBytes() const override {
212 NOTIMPLEMENTED();
213 return 0;
214 }
Paul Jensen0f49dec2017-12-12 23:39:58215 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45216
[email protected]f6d1d6eb2009-06-24 20:16:09217 private:
218 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28219 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20220 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01221 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09222
[email protected]ab838892009-06-30 18:49:05223 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09224};
225
[email protected]5fc08e32009-07-15 17:09:57226class TestConnectJob;
227
[email protected]f6d1d6eb2009-06-24 20:16:09228class MockClientSocketFactory : public ClientSocketFactory {
229 public:
[email protected]ab838892009-06-30 18:49:05230 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09231
danakj655b66c2016-04-16 00:51:38232 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04233 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41234 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19235 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41236 NOTREACHED();
danakj655b66c2016-04-16 00:51:38237 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41238 }
239
Helen Lid5bb9222018-04-12 15:33:09240 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07241 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38242 std::unique_ptr<
243 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07244 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19245 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09246 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09247 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09248 }
249
danakj655b66c2016-04-16 00:51:38250 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
Matt Menke841fc412019-03-05 23:20:12251 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27252 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21253 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13254 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09255 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38256 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09257 }
Matt Menkefd956922019-02-04 23:44:03258
Matt Menke52cd95a2019-02-08 06:16:27259 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
260 std::unique_ptr<StreamSocket> stream_socket,
261 const std::string& user_agent,
262 const HostPortPair& endpoint,
263 const ProxyServer& proxy_server,
264 HttpAuthController* http_auth_controller,
265 bool tunnel,
266 bool using_spdy,
267 NextProto negotiated_protocol,
268 ProxyDelegate* proxy_delegate,
269 bool is_https_proxy,
270 const NetworkTrafficAnnotationTag& traffic_annotation) override {
271 NOTIMPLEMENTED();
272 return nullptr;
273 }
274
[email protected]5fc08e32009-07-15 17:09:57275 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55276
[email protected]5fc08e32009-07-15 17:09:57277 void SignalJobs();
278
[email protected]03b7c8c2013-07-20 04:38:55279 void SignalJob(size_t job);
280
281 void SetJobLoadState(size_t job, LoadState load_state);
282
Matt Menke141b87f22019-01-30 02:43:03283 // Sets the HasConnectionEstablished value of the specified job to true,
284 // without invoking the callback.
285 void SetJobHasEstablishedConnection(size_t job);
286
[email protected]f6d1d6eb2009-06-24 20:16:09287 int allocation_count() const { return allocation_count_; }
288
[email protected]f6d1d6eb2009-06-24 20:16:09289 private:
290 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57291 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09292};
293
[email protected]ab838892009-06-30 18:49:05294class TestConnectJob : public ConnectJob {
295 public:
296 enum JobType {
297 kMockJob,
298 kMockFailingJob,
299 kMockPendingJob,
300 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57301 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10302
303 // Certificate errors return a socket in addition to an error code.
304 kMockCertErrorJob,
305 kMockPendingCertErrorJob,
306
[email protected]e60e47a2010-07-14 03:37:18307 kMockAdditionalErrorStateJob,
308 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28309 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10310
311 kMockAuthChallengeOnceJob,
312 kMockAuthChallengeTwiceJob,
313 kMockAuthChallengeOnceFailingJob,
314 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05315 };
316
[email protected]994d4932010-07-12 17:55:13317 // The kMockPendingJob uses a slight delay before allowing the connect
318 // to complete.
319 static const int kPendingConnectDelay = 2;
320
[email protected]ab838892009-06-30 18:49:05321 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40322 RequestPriority request_priority,
323 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34324 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43325 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05326 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43327 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40328 : ConnectJob(request_priority,
329 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38330 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43331 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38332 delegate,
333 nullptr /* net_log */,
334 NetLogSourceType::TRANSPORT_CONNECT_JOB,
335 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58336 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05337 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18338 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03339 has_established_connection_(false),
[email protected]d5492c52013-11-10 20:44:39340 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15341 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05342
[email protected]974ebd62009-08-03 23:14:34343 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13344 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34345 }
346
[email protected]03b7c8c2013-07-20 04:38:55347 void set_load_state(LoadState load_state) { load_state_ = load_state; }
348
Matt Menke141b87f22019-01-30 02:43:03349 void set_has_established_connection() {
350 DCHECK(!has_established_connection_);
351 has_established_connection_ = true;
352 }
353
[email protected]03b7c8c2013-07-20 04:38:55354 // From ConnectJob:
355
dchengb03027d2014-10-21 12:00:20356 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21357
Matt Menke141b87f22019-01-30 02:43:03358 bool HasEstablishedConnection() const override {
359 return has_established_connection_;
360 }
361
Matt Menke6f84d1f12019-04-11 19:26:47362 bool IsSSLError() const override { return store_additional_error_state_; }
363
364 scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override {
365 if (store_additional_error_state_)
366 return base::MakeRefCounted<SSLCertRequestInfo>();
367 return nullptr;
[email protected]e60e47a2010-07-14 03:37:18368 }
369
[email protected]974ebd62009-08-03 23:14:34370 private:
[email protected]03b7c8c2013-07-20 04:38:55371 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05372
dchengb03027d2014-10-21 12:00:20373 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05374 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35375 client_socket_factory_->CreateTransportClientSocket(
376 ignored, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05377 switch (job_type_) {
378 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13379 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10380 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05381 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13382 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10383 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05384 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57385 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47386
387 // Depending on execution timings, posting a delayed task can result
388 // in the task getting executed the at the earliest possible
389 // opportunity or only after returning once from the message loop and
390 // then a second call into the message loop. In order to make behavior
391 // more deterministic, we change the default delay to 2ms. This should
392 // always require us to wait for the second call into the message loop.
393 //
394 // N.B. The correct fix for this and similar timing problems is to
395 // abstract time for the purpose of unittests. Unfortunately, we have
396 // a lot of third-party components that directly call the various
397 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45398 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05399 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49400 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
401 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10402 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53403 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05404 return ERR_IO_PENDING;
405 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57406 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45407 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05408 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49409 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
410 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10411 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53412 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05413 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57414 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55415 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57416 client_socket_factory_->WaitForSignal(this);
417 waiting_success_ = true;
418 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10419 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13420 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10421 true /* cert_error */);
422 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13423 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45424 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13425 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49426 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
427 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10428 true /* async */, true /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53429 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13430 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18431 case kMockAdditionalErrorStateJob:
432 store_additional_error_state_ = true;
433 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10434 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18435 case kMockPendingAdditionalErrorStateJob:
436 set_load_state(LOAD_STATE_CONNECTING);
437 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45438 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18439 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49440 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
441 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10442 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53443 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18444 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28445 case kMockUnreadDataJob: {
446 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10447 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28448 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
449 return ret;
450 }
Matt Menkeb57663b32019-03-01 17:17:10451 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01452 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10453 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
454 return ERR_IO_PENDING;
455 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01456 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10457 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
458 return ERR_IO_PENDING;
459 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01460 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10461 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
462 return ERR_IO_PENDING;
463 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01464 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10465 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
466 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05467 default:
468 NOTREACHED();
danakj655b66c2016-04-16 00:51:38469 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05470 return ERR_FAILED;
471 }
472 }
473
Lily Chen02ef29a2018-11-30 16:31:43474 void ChangePriorityInternal(RequestPriority priority) override {}
475
Matt Menkeb57663b32019-03-01 17:17:10476 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13477 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03478 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05479 if (succeed) {
Matt Menkeb57663b32019-03-01 17:17:10480 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
Bence Békybdbb0e72018-08-07 21:42:59481 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10482 } else if (cert_error) {
483 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
484 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40485 } else {
[email protected]e772db3f2010-07-12 18:11:13486 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38487 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05488 }
[email protected]2ab05b52009-07-01 23:57:58489
490 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30491 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05492 return result;
493 }
494
Matt Menkeb57663b32019-03-01 17:17:10495 void DoAdvanceAuthChallenge(int remaining_challenges,
496 bool succeed_after_last_challenge) {
497 base::ThreadTaskRunnerHandle::Get()->PostTask(
498 FROM_HERE,
499 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
500 weak_factory_.GetWeakPtr(), remaining_challenges,
501 succeed_after_last_challenge));
502 }
503
504 void InvokeNextProxyAuthCallback(int remaining_challenges,
505 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01506 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10507 if (remaining_challenges == 0) {
508 DoConnect(succeed_after_last_challenge, true /* was_async */,
509 false /* cert_error */);
510 return;
511 }
512
513 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
514 // The auth tests here are just focused on ConnectJob bookkeeping.
515 HttpResponseInfo info;
516 NotifyDelegateOfProxyAuth(
517 info, nullptr /* http_auth_controller */,
518 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
519 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
520 succeed_after_last_challenge));
521 }
522
[email protected]5fc08e32009-07-15 17:09:57523 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05524 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57525 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21526 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03527 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18528 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05529
[email protected]d5492c52013-11-10 20:44:39530 base::WeakPtrFactory<TestConnectJob> weak_factory_;
531
[email protected]ab838892009-06-30 18:49:05532 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
533};
534
[email protected]d80a4322009-08-14 07:07:49535class TestConnectJobFactory
Matt Menke16f5c2e52019-03-25 21:50:40536 : public TransportClientSocketPool::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05537 public:
[email protected]034df0f32013-01-07 23:17:48538 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
539 NetLog* net_log)
Matt Menkea6f99ad2019-03-08 02:26:43540 : common_connect_job_params_(
541 nullptr /* client_socket_factory */,
542 nullptr /* host_resolver */,
Matt Menkeb88837e2019-03-20 11:50:40543 nullptr /* http_auth_cache */,
544 nullptr /* http_auth_handler_factory */,
545 nullptr /* spdy_session_pool */,
Matt Menkeb5fb42b2019-03-22 17:26:13546 nullptr /* quic_supported_versions */,
Matt Menkeb88837e2019-03-20 11:50:40547 nullptr /* quic_stream_factory */,
Matt Menkea6f99ad2019-03-08 02:26:43548 nullptr /* proxy_delegate */,
Matt Menked732ea42019-03-08 12:05:00549 nullptr /* http_user_agent_settings */,
Matt Menkea6f99ad2019-03-08 02:26:43550 SSLClientSocketContext(),
551 SSLClientSocketContext(),
552 nullptr /* socket_performance_watcher_factory */,
553 nullptr /* network_quality_estimator */,
554 net_log,
555 nullptr /* websocket_endpoint_lock_manager */),
556 job_type_(TestConnectJob::kMockJob),
Raul Tambre94493c652019-03-11 17:18:35557 job_types_(nullptr),
Matt Menkea6f99ad2019-03-08 02:26:43558 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05559
Chris Watkins7a41d3552017-12-01 02:13:27560 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05561
562 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
563
[email protected]51fdc7c2012-04-10 19:19:48564 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
565 job_types_ = job_types;
566 CHECK(!job_types_->empty());
567 }
568
[email protected]974ebd62009-08-03 23:14:34569 void set_timeout_duration(base::TimeDelta timeout_duration) {
570 timeout_duration_ = timeout_duration;
571 }
572
[email protected]3f55aa12011-12-07 02:03:33573 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55574
danakj655b66c2016-04-16 00:51:38575 std::unique_ptr<ConnectJob> NewConnectJob(
Matt Menkeaafff542019-04-22 22:09:36576 ClientSocketPool::GroupId group_id,
577 scoped_refptr<ClientSocketPool::SocketParams> socket_params,
Matt Menke16f5c2e52019-03-25 21:50:40578 RequestPriority request_priority,
579 SocketTag socket_tag,
mostynbba063d6032014-10-09 11:01:13580 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48581 EXPECT_TRUE(!job_types_ || !job_types_->empty());
582 TestConnectJob::JobType job_type = job_type_;
583 if (job_types_ && !job_types_->empty()) {
584 job_type = job_types_->front();
585 job_types_->pop_front();
586 }
Matt Menkea6f99ad2019-03-08 02:26:43587 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40588 job_type, request_priority, socket_tag, timeout_duration_,
589 &common_connect_job_params_, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05590 }
591
592 private:
Matt Menkea6f99ad2019-03-08 02:26:43593 const CommonConnectJobParams common_connect_job_params_;
[email protected]ab838892009-06-30 18:49:05594 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48595 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34596 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57597 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05598
599 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
600};
601
[email protected]a937a06d2009-08-19 21:19:24602} // namespace
603
[email protected]a937a06d2009-08-19 21:19:24604namespace {
605
[email protected]5fc08e32009-07-15 17:09:57606void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26607 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57608 (*it)->Signal();
609 }
610 waiting_jobs_.clear();
611}
612
[email protected]03b7c8c2013-07-20 04:38:55613void MockClientSocketFactory::SignalJob(size_t job) {
614 ASSERT_LT(job, waiting_jobs_.size());
615 waiting_jobs_[job]->Signal();
616 waiting_jobs_.erase(waiting_jobs_.begin() + job);
617}
618
619void MockClientSocketFactory::SetJobLoadState(size_t job,
620 LoadState load_state) {
621 ASSERT_LT(job, waiting_jobs_.size());
622 waiting_jobs_[job]->set_load_state(load_state);
623}
624
Matt Menke141b87f22019-01-30 02:43:03625void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
626 ASSERT_LT(job, waiting_jobs_.size());
627 waiting_jobs_[job]->set_has_established_connection();
628}
629
Bence Béky98447b12018-05-08 03:14:01630class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09631 protected:
Alex Clarke0def2092018-12-10 12:01:45632 ClientSocketPoolBaseTest()
633 : TestWithScopedTaskEnvironment(
634 base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
Matt Menke9fa17d52019-03-25 19:12:26635 params_(CreateDummyParams()) {
[email protected]636b8252011-04-08 19:56:54636 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40637 TransportClientSocketPool::connect_backup_jobs_enabled();
638 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54639 }
[email protected]2431756e2010-09-29 20:26:13640
dcheng67be2b1f2014-10-27 21:47:29641 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40642 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54643 connect_backup_jobs_enabled_);
644 }
[email protected]c9d6a1d2009-07-14 16:15:20645
Matt Menke9fa17d52019-03-25 19:12:26646 void CreatePool(int max_sockets,
647 int max_sockets_per_group,
648 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59649 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
650 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26651 ClientSocketPool::used_idle_socket_timeout(),
652 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16653 }
654
Matt Menke9fa17d52019-03-25 19:12:26655 void CreatePoolWithIdleTimeouts(int max_sockets,
656 int max_sockets_per_group,
657 base::TimeDelta unused_idle_socket_timeout,
658 base::TimeDelta used_idle_socket_timeout,
659 bool enable_backup_connect_jobs = false) {
[email protected]c9d6a1d2009-07-14 16:15:20660 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26661 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
662 std::make_unique<TestConnectJobFactory>(&client_socket_factory_,
663 &net_log_);
664 connect_job_factory_ = connect_job_factory.get();
665 pool_ = TransportClientSocketPool::CreateForTesting(
666 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
667 used_idle_socket_timeout, std::move(connect_job_factory),
668 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20669 }
[email protected]f6d1d6eb2009-06-24 20:16:09670
mmenked3641e12016-01-28 16:06:15671 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39672 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33673 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15674 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39675 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15676 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33677 }
678
Matt Menkec6b3edf72019-03-19 17:00:39679 int StartRequest(const ClientSocketPool::GroupId& group_id,
680 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15681 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39682 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09683 }
684
[email protected]2431756e2010-09-29 20:26:13685 int GetOrderOfRequest(size_t index) const {
686 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09687 }
688
[email protected]2431756e2010-09-29 20:26:13689 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
690 return test_base_.ReleaseOneConnection(keep_alive);
691 }
692
693 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
694 test_base_.ReleaseAllConnections(keep_alive);
695 }
696
697 TestSocketRequest* request(int i) { return test_base_.request(i); }
698 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38699 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42700 return test_base_.requests();
701 }
rdsmith29dbad12017-02-17 02:22:18702 // Only counts the requests that get sockets asynchronously;
703 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13704 size_t completion_count() const { return test_base_.completion_count(); }
705
vishal.b62985ca92015-04-17 08:45:51706 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54707 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09708 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04709 TestConnectJobFactory* connect_job_factory_;
Matt Menke9fa17d52019-03-25 19:12:26710 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19711 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26712 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13713 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09714};
715
[email protected]5fc08e32009-07-15 17:09:57716TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53717 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20718
[email protected]6ecf2b92011-12-15 01:14:52719 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06720 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51721 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48722 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53723
Matt Menkec6b3edf72019-03-19 17:00:39724 EXPECT_EQ(
725 OK, handle.Init(
726 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
727 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
728 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09729 EXPECT_TRUE(handle.is_initialized());
730 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48731 TestLoadTimingInfoConnectedNotReused(handle);
732
[email protected]f6d1d6eb2009-06-24 20:16:09733 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48734 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30735
mmenke43758e62015-05-04 21:09:46736 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40737 log.GetEntries(&entries);
738
Matt Menke9fa17d52019-03-25 19:12:26739 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53740 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26741 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00742 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26743 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
744 EXPECT_TRUE(LogContainsEvent(
745 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
746 NetLogEventPhase::NONE));
747 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00748 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
749 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26750 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09751}
752
[email protected]ab838892009-06-30 18:49:05753TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53754 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20755
[email protected]ab838892009-06-30 18:49:05756 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51757 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53758
[email protected]2431756e2010-09-29 20:26:13759 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52760 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18761 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13762 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51763 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50764 EXPECT_EQ(
765 ERR_CONNECTION_FAILED,
Matt Menkec6b3edf72019-03-19 17:00:39766 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:50767 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
768 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
769 log.bound()));
[email protected]2431756e2010-09-29 20:26:13770 EXPECT_FALSE(handle.socket());
771 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51772 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48773 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30774
mmenke43758e62015-05-04 21:09:46775 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40776 log.GetEntries(&entries);
777
Matt Menke9fa17d52019-03-25 19:12:26778 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17779 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26780 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00781 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26782 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
783 EXPECT_TRUE(LogContainsEvent(
784 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
785 NetLogEventPhase::NONE));
786 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09787}
788
Matt Menkef6edce752019-03-19 17:21:56789// Make sure different groups do not share sockets.
790TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
791 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
792
793 const HostPortPair kHostPortPairs[] = {
794 {"a", 80},
795 {"a", 443},
796 {"b", 80},
797 };
798
799 const ClientSocketPool::SocketType kSocketTypes[] = {
800 ClientSocketPool::SocketType::kHttp,
801 ClientSocketPool::SocketType::kSsl,
802 ClientSocketPool::SocketType::kSslVersionInterferenceProbe,
803 ClientSocketPool::SocketType::kFtp,
804 };
805
Matt Menkebdf777802019-04-22 19:38:59806 const PrivacyMode kPrivacyModes[] = {PrivacyMode::PRIVACY_MODE_DISABLED,
807 PrivacyMode::PRIVACY_MODE_ENABLED};
Matt Menkef6edce752019-03-19 17:21:56808
809 int total_idle_sockets = 0;
810
811 // Walk through each GroupId, making sure that requesting a socket for one
812 // group does not return a previously connected socket for another group.
813 for (const auto& host_port_pair : kHostPortPairs) {
814 SCOPED_TRACE(host_port_pair.ToString());
815 for (const auto& socket_type : kSocketTypes) {
816 SCOPED_TRACE(static_cast<int>(socket_type));
817 for (const auto& privacy_mode : kPrivacyModes) {
818 SCOPED_TRACE(privacy_mode);
819
820 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
821
822 ClientSocketPool::GroupId group_id(host_port_pair, socket_type,
823 privacy_mode);
824
Matt Menke9fa17d52019-03-25 19:12:26825 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56826
827 TestCompletionCallback callback;
828 ClientSocketHandle handle;
829
830 // Since the group is empty, requesting a socket should not complete
831 // synchronously.
832 EXPECT_THAT(
833 handle.Init(group_id, params_, DEFAULT_PRIORITY, SocketTag(),
834 ClientSocketPool::RespectLimits::ENABLED,
835 callback.callback(),
836 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
837 NetLogWithSource()),
838 IsError(ERR_IO_PENDING));
Matt Menke9fa17d52019-03-25 19:12:26839 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56840 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
841
842 EXPECT_THAT(callback.WaitForResult(), IsOk());
843 EXPECT_TRUE(handle.socket());
Matt Menke9fa17d52019-03-25 19:12:26844 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56845 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
846
847 // Return socket to pool.
848 handle.Reset();
849 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
850
851 // Requesting a socket again should return the same socket as before, so
852 // should complete synchronously.
853 EXPECT_THAT(
854 handle.Init(group_id, params_, DEFAULT_PRIORITY, SocketTag(),
855 ClientSocketPool::RespectLimits::ENABLED,
856 callback.callback(),
857 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
858 NetLogWithSource()),
859 IsOk());
860 EXPECT_TRUE(handle.socket());
861 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
862
863 // Return socket to pool again.
864 handle.Reset();
865 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
866
867 ++total_idle_sockets;
868 }
869 }
870 }
871}
872
[email protected]211d21722009-07-22 15:48:53873TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
874 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
875
[email protected]9e743cd2010-03-16 07:03:53876 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30877
Matt Menkec6b3edf72019-03-19 17:00:39878 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
879 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
880 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
881 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53882
[email protected]2431756e2010-09-29 20:26:13883 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53884 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13885 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53886
Matt Menkec6b3edf72019-03-19 17:00:39887 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
888 IsError(ERR_IO_PENDING));
889 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
890 IsError(ERR_IO_PENDING));
891 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
892 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53893
[email protected]2431756e2010-09-29 20:26:13894 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53895
[email protected]2431756e2010-09-29 20:26:13896 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53897 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13898 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53899
900 EXPECT_EQ(1, GetOrderOfRequest(1));
901 EXPECT_EQ(2, GetOrderOfRequest(2));
902 EXPECT_EQ(3, GetOrderOfRequest(3));
903 EXPECT_EQ(4, GetOrderOfRequest(4));
904 EXPECT_EQ(5, GetOrderOfRequest(5));
905 EXPECT_EQ(6, GetOrderOfRequest(6));
906 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17907
908 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13909 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53910}
911
912TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
913 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
914
[email protected]9e743cd2010-03-16 07:03:53915 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30916
[email protected]211d21722009-07-22 15:48:53917 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39918 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
919 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
920 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
921 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53922
[email protected]2431756e2010-09-29 20:26:13923 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53924 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13925 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53926
927 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:39928 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
929 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53930
[email protected]2431756e2010-09-29 20:26:13931 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53932
[email protected]2431756e2010-09-29 20:26:13933 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53934 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13935 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53936
937 EXPECT_EQ(1, GetOrderOfRequest(1));
938 EXPECT_EQ(2, GetOrderOfRequest(2));
939 EXPECT_EQ(3, GetOrderOfRequest(3));
940 EXPECT_EQ(4, GetOrderOfRequest(4));
941 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17942
943 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13944 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53945}
946
947TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
948 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
949
Matt Menkec6b3edf72019-03-19 17:00:39950 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
951 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
952 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
953 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53954
[email protected]2431756e2010-09-29 20:26:13955 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53956 client_socket_factory_.allocation_count());
957
Matt Menkec6b3edf72019-03-19 17:00:39958 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
959 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
960 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53961
[email protected]2431756e2010-09-29 20:26:13962 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53963
[email protected]2431756e2010-09-29 20:26:13964 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53965
966 // First 4 requests don't have to wait, and finish in order.
967 EXPECT_EQ(1, GetOrderOfRequest(1));
968 EXPECT_EQ(2, GetOrderOfRequest(2));
969 EXPECT_EQ(3, GetOrderOfRequest(3));
970 EXPECT_EQ(4, GetOrderOfRequest(4));
971
Matt Menkec6b3edf72019-03-19 17:00:39972 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
973 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53974 EXPECT_EQ(7, GetOrderOfRequest(5));
975 EXPECT_EQ(6, GetOrderOfRequest(6));
976 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17977
978 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13979 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53980}
981
rdsmith29dbad12017-02-17 02:22:18982// Test reprioritizing a request before completion doesn't interfere with
983// its completion.
984TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
985 CreatePool(kDefaultMaxSockets, 1);
986
Matt Menkec6b3edf72019-03-19 17:00:39987 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
988 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:18989 EXPECT_TRUE(request(0)->handle()->socket());
990 EXPECT_FALSE(request(1)->handle()->socket());
991
Lily Chenecebf932018-11-02 17:15:43992 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:18993
994 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
995
996 EXPECT_TRUE(request(1)->handle()->socket());
997}
998
999// Reprioritize a request up past another one and make sure that changes the
1000// completion order.
1001TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1002 CreatePool(kDefaultMaxSockets, 1);
1003
Matt Menkec6b3edf72019-03-19 17:00:391004 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1005 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1006 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181007 EXPECT_TRUE(request(0)->handle()->socket());
1008 EXPECT_FALSE(request(1)->handle()->socket());
1009 EXPECT_FALSE(request(2)->handle()->socket());
1010
1011 request(2)->handle()->SetPriority(HIGHEST);
1012
1013 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1014
1015 EXPECT_EQ(1, GetOrderOfRequest(1));
1016 EXPECT_EQ(3, GetOrderOfRequest(2));
1017 EXPECT_EQ(2, GetOrderOfRequest(3));
1018}
1019
1020// Reprioritize a request without changing relative priorities and check
1021// that the order doesn't change.
1022TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1023 CreatePool(kDefaultMaxSockets, 1);
1024
Matt Menkec6b3edf72019-03-19 17:00:391025 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1026 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1027 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181028 EXPECT_TRUE(request(0)->handle()->socket());
1029 EXPECT_FALSE(request(1)->handle()->socket());
1030 EXPECT_FALSE(request(2)->handle()->socket());
1031
1032 request(2)->handle()->SetPriority(MEDIUM);
1033
1034 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1035
1036 EXPECT_EQ(1, GetOrderOfRequest(1));
1037 EXPECT_EQ(2, GetOrderOfRequest(2));
1038 EXPECT_EQ(3, GetOrderOfRequest(3));
1039}
1040
1041// Reprioritize a request past down another one and make sure that changes the
1042// completion order.
1043TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1044 CreatePool(kDefaultMaxSockets, 1);
1045
Matt Menkec6b3edf72019-03-19 17:00:391046 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1047 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1048 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181049 EXPECT_TRUE(request(0)->handle()->socket());
1050 EXPECT_FALSE(request(1)->handle()->socket());
1051 EXPECT_FALSE(request(2)->handle()->socket());
1052
1053 request(1)->handle()->SetPriority(LOW);
1054
1055 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1056
1057 EXPECT_EQ(1, GetOrderOfRequest(1));
1058 EXPECT_EQ(3, GetOrderOfRequest(2));
1059 EXPECT_EQ(2, GetOrderOfRequest(3));
1060}
1061
1062// Reprioritize a request to the same level as another and confirm it is
1063// put after the old request.
1064TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1065 CreatePool(kDefaultMaxSockets, 1);
1066
Matt Menkec6b3edf72019-03-19 17:00:391067 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1068 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1069 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181070 EXPECT_TRUE(request(0)->handle()->socket());
1071 EXPECT_FALSE(request(1)->handle()->socket());
1072 EXPECT_FALSE(request(2)->handle()->socket());
1073
1074 request(1)->handle()->SetPriority(MEDIUM);
1075
1076 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1077
1078 EXPECT_EQ(1, GetOrderOfRequest(1));
1079 EXPECT_EQ(3, GetOrderOfRequest(2));
1080 EXPECT_EQ(2, GetOrderOfRequest(3));
1081}
1082
[email protected]211d21722009-07-22 15:48:531083TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1084 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1085
Matt Menkec6b3edf72019-03-19 17:00:391086 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1087 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1088 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1089 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531090
[email protected]2431756e2010-09-29 20:26:131091 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531092 client_socket_factory_.allocation_count());
1093
Matt Menkec6b3edf72019-03-19 17:00:391094 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1095 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1096 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531097
[email protected]2431756e2010-09-29 20:26:131098 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531099
[email protected]2431756e2010-09-29 20:26:131100 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531101 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131102 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531103
1104 // First 4 requests don't have to wait, and finish in order.
1105 EXPECT_EQ(1, GetOrderOfRequest(1));
1106 EXPECT_EQ(2, GetOrderOfRequest(2));
1107 EXPECT_EQ(3, GetOrderOfRequest(3));
1108 EXPECT_EQ(4, GetOrderOfRequest(4));
1109
1110 // Request ("b", 7) has the highest priority, but we can't make new socket for
1111 // group "b", because it has reached the per-group limit. Then we make
1112 // socket for ("c", 6), because it has higher priority than ("a", 4),
1113 // and we still can't make a socket for group "b".
1114 EXPECT_EQ(5, GetOrderOfRequest(5));
1115 EXPECT_EQ(6, GetOrderOfRequest(6));
1116 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171117
1118 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131119 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531120}
1121
1122// Make sure that we count connecting sockets against the total limit.
1123TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1124 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1125
Matt Menkec6b3edf72019-03-19 17:00:391126 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1127 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1128 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531129
1130 // Create one asynchronous request.
1131 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391132 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1133 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531134
[email protected]6b175382009-10-13 06:47:471135 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1136 // actually become pending until 2ms after they have been created. In order
1137 // to flush all tasks, we need to wait so that we know there are no
1138 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451139 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471140
[email protected]211d21722009-07-22 15:48:531141 // The next synchronous request should wait for its turn.
1142 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391143 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1144 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531145
[email protected]2431756e2010-09-29 20:26:131146 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531147
[email protected]2431756e2010-09-29 20:26:131148 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531149 client_socket_factory_.allocation_count());
1150
1151 EXPECT_EQ(1, GetOrderOfRequest(1));
1152 EXPECT_EQ(2, GetOrderOfRequest(2));
1153 EXPECT_EQ(3, GetOrderOfRequest(3));
1154 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171155 EXPECT_EQ(5, GetOrderOfRequest(5));
1156
1157 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131158 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531159}
1160
[email protected]6427fe22010-04-16 22:27:411161TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1162 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1163 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1164
Matt Menkec6b3edf72019-03-19 17:00:391165 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1166 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1167 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1168 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411169
1170 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1171
1172 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1173
Matt Menkec6b3edf72019-03-19 17:00:391174 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1175 IsError(ERR_IO_PENDING));
1176 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1177 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411178
1179 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1180
[email protected]2431756e2010-09-29 20:26:131181 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411182 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131183 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411184 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131185 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1186 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411187 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1188}
1189
[email protected]d7027bb2010-05-10 18:58:541190TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1191 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1192 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1193
1194 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521195 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501196 EXPECT_EQ(
1197 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391198 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501199 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1200 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1201 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541202
1203 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241204 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521205 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501206 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391207 handles[i].Init(
1208 TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
1209 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1210 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1211 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541212 }
1213
1214 // One will be stalled, cancel all the handles now.
1215 // This should hit the OnAvailableSocketSlot() code where we previously had
1216 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241217 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541218 handles[i].Reset();
1219}
1220
[email protected]eb5a99382010-07-11 03:18:261221TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541222 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1223 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1224
[email protected]eb5a99382010-07-11 03:18:261225 {
1226 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521227 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261228 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:391229 EXPECT_EQ(OK, handles[i].Init(TestGroupId(base::NumberToString(i)),
1230 params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541231 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501232 callbacks[i].callback(),
1233 ClientSocketPool::ProxyAuthCallback(),
1234 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261235 }
1236
1237 // Force a stalled group.
1238 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521239 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201240 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391241 stalled_handle.Init(
1242 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1243 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1244 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1245 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261246
1247 // Cancel the stalled request.
1248 stalled_handle.Reset();
1249
1250 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1251 EXPECT_EQ(0, pool_->IdleSocketCount());
1252
1253 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541254 }
1255
[email protected]43a21b82010-06-10 21:30:541256 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1257 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261258}
[email protected]43a21b82010-06-10 21:30:541259
[email protected]eb5a99382010-07-11 03:18:261260TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1261 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1262 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1263
1264 {
1265 ClientSocketHandle handles[kDefaultMaxSockets];
1266 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521267 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201268 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391269 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
1270 DEFAULT_PRIORITY, SocketTag(),
1271 ClientSocketPool::RespectLimits::ENABLED,
1272 callback.callback(),
1273 ClientSocketPool::ProxyAuthCallback(),
1274 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261275 }
1276
1277 // Force a stalled group.
1278 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1279 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521280 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201281 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391282 stalled_handle.Init(
1283 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1284 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1285 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1286 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261287
1288 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261289 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1290 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1291 TestGroupId("foo")));
1292 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1293 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261294
1295 // Cancel the stalled request.
1296 handles[0].Reset();
1297
[email protected]eb5a99382010-07-11 03:18:261298 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261299 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1300 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1301 TestGroupId("foo")));
1302 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1303 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261304
1305 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011306 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261307
1308 EXPECT_EQ(kDefaultMaxSockets + 1,
1309 client_socket_factory_.allocation_count());
1310 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261311 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1312 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1313 TestGroupId("foo")));
1314 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1315 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261316
1317 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541318 }
1319
[email protected]eb5a99382010-07-11 03:18:261320 EXPECT_EQ(1, pool_->IdleSocketCount());
1321}
[email protected]43a21b82010-06-10 21:30:541322
[email protected]eb5a99382010-07-11 03:18:261323TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1324 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1325 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541326
[email protected]eb5a99382010-07-11 03:18:261327 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521328 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261329 {
[email protected]51fdc7c2012-04-10 19:19:481330 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261331 ClientSocketHandle handles[kDefaultMaxSockets];
1332 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521333 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391334 EXPECT_EQ(
1335 OK, handles[i].Init(TestGroupId(base::StringPrintf("Take 2: %d", i)),
1336 params_, DEFAULT_PRIORITY, SocketTag(),
1337 ClientSocketPool::RespectLimits::ENABLED,
1338 callback.callback(),
1339 ClientSocketPool::ProxyAuthCallback(),
1340 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261341 }
1342
1343 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1344 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481345 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261346
1347 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201348 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391349 stalled_handle.Init(
1350 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1351 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1352 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1353 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481354 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261355
1356 // Dropping out of scope will close all handles and return them to idle.
1357 }
[email protected]43a21b82010-06-10 21:30:541358
1359 // But if we wait for it, the released idle sockets will be closed in
1360 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011361 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261362
1363 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1364 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541365}
1366
1367// Regression test for http://crbug.com/40952.
1368TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261369 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1370 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541371 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1372
1373 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1374 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521375 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391376 EXPECT_EQ(OK, handle.Init(TestGroupId(base::NumberToString(i)), params_,
1377 DEFAULT_PRIORITY, SocketTag(),
1378 ClientSocketPool::RespectLimits::ENABLED,
1379 callback.callback(),
1380 ClientSocketPool::ProxyAuthCallback(),
1381 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541382 }
1383
1384 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281385 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541386
1387 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1388 // reuse a socket.
1389 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1390 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521391 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541392
1393 // "0" is special here, since it should be the first entry in the sorted map,
1394 // which is the one which we would close an idle socket for. We shouldn't
1395 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391396 EXPECT_EQ(OK, handle.Init(
1397 TestGroupId("0"), params_, DEFAULT_PRIORITY, SocketTag(),
1398 ClientSocketPool::RespectLimits::ENABLED,
1399 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1400 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541401
1402 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1403 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1404}
1405
[email protected]ab838892009-06-30 18:49:051406TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531407 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091408
Matt Menkec6b3edf72019-03-19 17:00:391409 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1410 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1411 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1412 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1413 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1414 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1415 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1416 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091417
[email protected]2431756e2010-09-29 20:26:131418 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201419 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1420 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131421 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1422 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091423
[email protected]c9d6a1d2009-07-14 16:15:201424 EXPECT_EQ(1, GetOrderOfRequest(1));
1425 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031426 EXPECT_EQ(8, GetOrderOfRequest(3));
1427 EXPECT_EQ(6, GetOrderOfRequest(4));
1428 EXPECT_EQ(4, GetOrderOfRequest(5));
1429 EXPECT_EQ(3, GetOrderOfRequest(6));
1430 EXPECT_EQ(5, GetOrderOfRequest(7));
1431 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171432
1433 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131434 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091435}
1436
[email protected]ab838892009-06-30 18:49:051437TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531438 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091439
Matt Menkec6b3edf72019-03-19 17:00:391440 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1441 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1442 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1443 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1444 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1445 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1446 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091447
[email protected]2431756e2010-09-29 20:26:131448 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091449
[email protected]2431756e2010-09-29 20:26:131450 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011451 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201452
[email protected]2431756e2010-09-29 20:26:131453 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201454 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131455 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1456 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091457}
1458
1459// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051460// The pending connect job will be cancelled and should not call back into
1461// ClientSocketPoolBase.
1462TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531463 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201464
[email protected]ab838892009-06-30 18:49:051465 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131466 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521467 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501468 EXPECT_EQ(
1469 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391470 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501471 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1472 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1473 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131474 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091475}
1476
[email protected]ab838892009-06-30 18:49:051477TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531478 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201479
[email protected]ab838892009-06-30 18:49:051480 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061481 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521482 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091483
Matt Menke28ac03e2019-02-25 22:25:501484 EXPECT_EQ(
1485 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391486 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501487 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1488 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1489 NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091490
1491 handle.Reset();
1492
[email protected]6ecf2b92011-12-15 01:14:521493 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501494 EXPECT_EQ(
1495 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391496 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501497 ClientSocketPool::RespectLimits::ENABLED,
1498 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1499 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091500
robpercival214763f2016-07-01 23:27:011501 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091502 EXPECT_FALSE(callback.have_result());
1503
1504 handle.Reset();
1505}
1506
[email protected]ab838892009-06-30 18:49:051507TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531508 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091509
Matt Menkec6b3edf72019-03-19 17:00:391510 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1511 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1512 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1513 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1514 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1515 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1516 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091517
1518 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201519 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131520 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1521 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091522
[email protected]2431756e2010-09-29 20:26:131523 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091524
[email protected]c9d6a1d2009-07-14 16:15:201525 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1526 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131527 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1528 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091529
[email protected]c9d6a1d2009-07-14 16:15:201530 EXPECT_EQ(1, GetOrderOfRequest(1));
1531 EXPECT_EQ(2, GetOrderOfRequest(2));
1532 EXPECT_EQ(5, GetOrderOfRequest(3));
1533 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131534 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1535 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201536 EXPECT_EQ(4, GetOrderOfRequest(6));
1537 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171538
1539 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131540 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091541}
1542
mmenke33d24423d2015-05-19 19:41:091543// Function to be used as a callback on socket request completion. It first
1544// disconnects the successfully connected socket from the first request, and
1545// then reuses the ClientSocketHandle to request another socket.
1546//
1547// |nested_callback| is called with the result of the second socket request.
1548void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261549 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091550 TestConnectJobFactory* test_connect_job_factory,
1551 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411552 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091553 int first_request_result) {
robpercival214763f2016-07-01 23:27:011554 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091555
1556 test_connect_job_factory->set_job_type(next_job_type);
1557
1558 // Don't allow reuse of the socket. Disconnect it and then release it.
1559 if (handle->socket())
1560 handle->socket()->Disconnect();
1561 handle->Reset();
1562
mmenke33d24423d2015-05-19 19:41:091563 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501564 int rv = handle->Init(
Matt Menke9fa17d52019-03-25 19:12:261565 TestGroupId("a"), CreateDummyParams(), LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501566 ClientSocketPool::RespectLimits::ENABLED, nested_callback->callback(),
1567 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091568 if (rv != ERR_IO_PENDING) {
1569 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411570 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091571 } else {
1572 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521573 }
mmenke33d24423d2015-05-19 19:41:091574}
[email protected]f6d1d6eb2009-06-24 20:16:091575
mmenke33d24423d2015-05-19 19:41:091576// Tests the case where a second socket is requested in a completion callback,
1577// and the second socket connects asynchronously. Reuses the same
1578// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581579TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531580 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201581
[email protected]0b7648c2009-07-06 20:14:011582 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061583 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091584 TestCompletionCallback second_result_callback;
1585 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391586 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541587 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501588 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1589 connect_job_factory_, TestConnectJob::kMockPendingJob,
1590 &second_result_callback),
1591 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011592 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091593
robpercival214763f2016-07-01 23:27:011594 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581595}
[email protected]f6d1d6eb2009-06-24 20:16:091596
mmenke33d24423d2015-05-19 19:41:091597// Tests the case where a second socket is requested in a completion callback,
1598// and the second socket connects synchronously. Reuses the same
1599// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581600TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531601 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201602
[email protected]0b7648c2009-07-06 20:14:011603 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061604 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091605 TestCompletionCallback second_result_callback;
1606 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391607 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541608 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501609 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1610 connect_job_factory_, TestConnectJob::kMockPendingJob,
1611 &second_result_callback),
1612 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011613 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581614
robpercival214763f2016-07-01 23:27:011615 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091616}
1617
1618// Make sure that pending requests get serviced after active requests get
1619// cancelled.
[email protected]ab838892009-06-30 18:49:051620TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531621 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201622
[email protected]0b7648c2009-07-06 20:14:011623 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091624
Matt Menkec6b3edf72019-03-19 17:00:391625 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));
1633 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1634 IsError(ERR_IO_PENDING));
1635 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1636 IsError(ERR_IO_PENDING));
1637 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1638 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091639
[email protected]c9d6a1d2009-07-14 16:15:201640 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1641 // Let's cancel them.
1642 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131643 ASSERT_FALSE(request(i)->handle()->is_initialized());
1644 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091645 }
1646
[email protected]f6d1d6eb2009-06-24 20:16:091647 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131648 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011649 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131650 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091651 }
1652
[email protected]2431756e2010-09-29 20:26:131653 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1654 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091655}
1656
1657// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051658TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531659 const size_t kMaxSockets = 5;
1660 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201661
[email protected]0b7648c2009-07-06 20:14:011662 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091663
[email protected]211d21722009-07-22 15:48:531664 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1665 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091666
1667 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531668 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391669 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1670 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091671
[email protected]211d21722009-07-22 15:48:531672 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011673 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091674}
1675
mmenke9d72fe42017-05-18 22:36:071676// Make sure that pending requests that complete synchronously get serviced
1677// after active requests fail. See https://crbug.com/723748
1678TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1679 const size_t kNumberOfRequests = 10;
1680 const size_t kMaxSockets = 1;
1681 CreatePool(kMaxSockets, kMaxSockets);
1682
1683 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1684
Matt Menkec6b3edf72019-03-19 17:00:391685 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1686 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071687
1688 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1689
1690 // Queue up all the other requests
1691 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391692 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1693 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071694
1695 // Make sure all requests fail, instead of hanging.
1696 for (size_t i = 0; i < kNumberOfRequests; ++i)
1697 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1698}
1699
[email protected]5fc08e32009-07-15 17:09:571700TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531701 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571702
1703 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1704
[email protected]2431756e2010-09-29 20:26:131705 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521706 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501707 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391708 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501709 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1710 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011711 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571712
1713 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131714 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571715
Matt Menkec6b3edf72019-03-19 17:00:391716 rv = handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151717 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501718 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1719 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011720 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1721 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571722
[email protected]2431756e2010-09-29 20:26:131723 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481724 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571725 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1726}
1727
xunjieli26619e72016-11-23 19:39:551728TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551729 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1730 ClientSocketHandle handle;
1731 TestCompletionCallback callback;
1732 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501733 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391734 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501735 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1736 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551737 EXPECT_THAT(rv, IsOk());
1738 handle.Reset();
1739 EXPECT_EQ(1, pool_->IdleSocketCount());
1740 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551741}
1742
xunjieli92feb332017-03-03 17:19:231743TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231744 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1745 TestCompletionCallback callback;
1746 BoundTestNetLog log;
1747 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501748 int rv = handle1.Init(
Matt Menkec6b3edf72019-03-19 17:00:391749 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501750 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1751 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231752 EXPECT_THAT(rv, IsOk());
1753 ClientSocketHandle handle2;
Matt Menkec6b3edf72019-03-19 17:00:391754 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231755 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501756 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1757 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231758 ClientSocketHandle handle3;
Matt Menkec6b3edf72019-03-19 17:00:391759 rv = handle3.Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231760 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501761 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1762 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231763 EXPECT_THAT(rv, IsOk());
1764 handle1.Reset();
1765 handle2.Reset();
1766 handle3.Reset();
1767 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:391768 pool_->CloseIdleSocketsInGroup(TestGroupId("a"));
xunjieli92feb332017-03-03 17:19:231769 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231770}
1771
xunjieli26619e72016-11-23 19:39:551772TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551773 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1774 ClientSocketHandle handle;
1775 TestCompletionCallback callback;
1776 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501777 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391778 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501779 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1780 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551781 EXPECT_THAT(rv, IsOk());
1782 StreamSocket* socket = handle.socket();
1783 handle.Reset();
1784 EXPECT_EQ(1, pool_->IdleSocketCount());
1785
1786 // Disconnect socket now to make the socket unusable.
1787 socket->Disconnect();
1788 ClientSocketHandle handle2;
Matt Menkec6b3edf72019-03-19 17:00:391789 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551790 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501791 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1792 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551793 EXPECT_THAT(rv, IsOk());
1794 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551795}
1796
[email protected]2b7523d2009-07-29 20:29:231797// Regression test for http://crbug.com/17985.
1798TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1799 const int kMaxSockets = 3;
1800 const int kMaxSocketsPerGroup = 2;
1801 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1802
[email protected]ac790b42009-12-02 04:31:311803 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231804
Matt Menkec6b3edf72019-03-19 17:00:391805 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1806 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231807
1808 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:391809 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1810 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231811
1812 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:391813 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231814
1815 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:391816 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1817 IsError(ERR_IO_PENDING));
1818 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1819 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231820
Matt Menkec6b3edf72019-03-19 17:00:391821 // Release the first two sockets from TestGroupId("a"). Because this is a
1822 // keepalive, the first release will unblock the pending request for
1823 // TestGroupId("a"). The second release will unblock a request for "c",
1824 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:131825 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1826 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231827
1828 // Closing idle sockets should not get us into trouble, but in the bug
1829 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:391830 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]43a21b82010-06-10 21:30:541831 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261832
[email protected]2da659e2013-05-23 20:51:341833 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281834 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231835}
1836
[email protected]4d3b05d2010-01-27 21:27:291837TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531838 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571839
1840 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131841 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521842 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511843 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501844 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391845 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501846 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1847 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011848 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:391849 EXPECT_EQ(LOAD_STATE_CONNECTING,
1850 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:481851 TestLoadTimingInfoNotConnected(handle);
1852
robpercival214763f2016-07-01 23:27:011853 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131854 EXPECT_TRUE(handle.is_initialized());
1855 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481856 TestLoadTimingInfoConnectedNotReused(handle);
1857
[email protected]2431756e2010-09-29 20:26:131858 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481859 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301860
mmenke43758e62015-05-04 21:09:461861 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401862 log.GetEntries(&entries);
1863
Matt Menke9fa17d52019-03-25 19:12:261864 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:171865 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:261866 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:001867 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:261868 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
1869 EXPECT_TRUE(LogContainsEvent(
1870 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1871 NetLogEventPhase::NONE));
1872 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:001873 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1874 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:261875 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571876}
1877
[email protected]4d3b05d2010-01-27 21:27:291878TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571879 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531880 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571881
1882 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131883 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521884 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511885 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181886 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131887 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:511888 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:501889 EXPECT_EQ(
1890 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391891 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501892 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1893 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1894 log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:391895 EXPECT_EQ(LOAD_STATE_CONNECTING,
1896 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:011897 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131898 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:511899 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:301900
mmenke43758e62015-05-04 21:09:461901 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401902 log.GetEntries(&entries);
1903
Matt Menke9fa17d52019-03-25 19:12:261904 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:171905 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:261906 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:001907 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:261908 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
1909 EXPECT_TRUE(LogContainsEvent(
1910 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1911 NetLogEventPhase::NONE));
1912 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571913}
1914
mmenke6be122f2015-03-09 22:22:471915// Check that an async ConnectJob failure does not result in creation of a new
1916// ConnectJob when there's another pending request also waiting on its own
1917// ConnectJob. See http://crbug.com/463960.
1918TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1919 CreatePool(2, 2);
1920 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1921
Matt Menkec6b3edf72019-03-19 17:00:391922 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1923 IsError(ERR_IO_PENDING));
1924 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1925 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471926
robpercival214763f2016-07-01 23:27:011927 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1928 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471929
1930 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1931}
1932
[email protected]4d3b05d2010-01-27 21:27:291933TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101934 // TODO(eroman): Add back the log expectations! Removed them because the
1935 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531936 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571937
1938 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131939 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521940 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131941 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521942 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571943
Matt Menke28ac03e2019-02-25 22:25:501944 EXPECT_EQ(
1945 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391946 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501947 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1948 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1949 NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511950 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201951 EXPECT_EQ(
1952 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391953 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201954 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501955 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1956 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571957
[email protected]2431756e2010-09-29 20:26:131958 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571959
[email protected]fd7b7c92009-08-20 19:38:301960
1961 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301962
robpercival214763f2016-07-01 23:27:011963 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131964 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301965
1966 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531967 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571968}
1969
[email protected]4d3b05d2010-01-27 21:27:291970TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341971 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1972
[email protected]17a0c6c2009-08-04 00:07:041973 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1974
Matt Menkec6b3edf72019-03-19 17:00:391975 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1976 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1977 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1978 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341979
Raul Tambre8335a6d2019-02-21 16:57:431980 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261981 static_cast<int>(
1982 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:131983 (*requests())[2]->handle()->Reset();
1984 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431985 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261986 static_cast<int>(
1987 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:341988
[email protected]2431756e2010-09-29 20:26:131989 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431990 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261991 static_cast<int>(
1992 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:341993
[email protected]2431756e2010-09-29 20:26:131994 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431995 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261996 static_cast<int>(
1997 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:341998}
1999
[email protected]5fc08e32009-07-15 17:09:572000// When requests and ConnectJobs are not coupled, the request will get serviced
2001// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292002TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532003 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572004
2005 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322006 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572007
[email protected]2431756e2010-09-29 20:26:132008 std::vector<TestSocketRequest*> request_order;
2009 size_t completion_count; // unused
2010 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502011 int rv = req1.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392012 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502013 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2014 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012015 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2016 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572017
2018 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2019 // without a job.
2020 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2021
[email protected]2431756e2010-09-29 20:26:132022 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502023 rv = req2.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, req2.callback(),
2026 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012027 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132028 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502029 rv = req3.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392030 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502031 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2032 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012033 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572034
2035 // Both Requests 2 and 3 are pending. We release socket 1 which should
2036 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332037 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342038 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282039 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332040 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012041 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332042 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572043
2044 // Signal job 2, which should service request 3.
2045
2046 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012047 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572048
Raul Tambre8335a6d2019-02-21 16:57:432049 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132050 EXPECT_EQ(&req1, request_order[0]);
2051 EXPECT_EQ(&req2, request_order[1]);
2052 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392053 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572054}
2055
2056// The requests are not coupled to the jobs. So, the requests should finish in
2057// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292058TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532059 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572060 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322061 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572062
[email protected]2431756e2010-09-29 20:26:132063 std::vector<TestSocketRequest*> request_order;
2064 size_t completion_count; // unused
2065 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502066 int rv = req1.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392067 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502068 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2069 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012070 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572071
[email protected]2431756e2010-09-29 20:26:132072 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502073 rv = req2.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392074 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502075 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2076 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012077 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572078
2079 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322080 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572081
[email protected]2431756e2010-09-29 20:26:132082 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502083 rv = req3.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392084 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502085 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2086 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012087 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572088
robpercival214763f2016-07-01 23:27:012089 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2090 EXPECT_THAT(req2.WaitForResult(), IsOk());
2091 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572092
Raul Tambre8335a6d2019-02-21 16:57:432093 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132094 EXPECT_EQ(&req1, request_order[0]);
2095 EXPECT_EQ(&req2, request_order[1]);
2096 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572097}
2098
[email protected]03b7c8c2013-07-20 04:38:552099// Test GetLoadState in the case there's only one socket request.
2100TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532101 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552102 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572103
[email protected]2431756e2010-09-29 20:26:132104 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522105 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502106 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392107 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502108 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2109 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012110 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552111 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572112
[email protected]03b7c8c2013-07-20 04:38:552113 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2114 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2115
2116 // No point in completing the connection, since ClientSocketHandles only
2117 // expect the LoadState to be checked while connecting.
2118}
2119
2120// Test GetLoadState in the case there are two socket requests.
2121TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2122 CreatePool(2, 2);
2123 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2124
2125 ClientSocketHandle handle;
2126 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502127 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392128 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502129 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2130 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012131 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002132 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2133
2134 ClientSocketHandle handle2;
2135 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392136 rv = handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152137 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502138 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2139 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012140 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002141 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2142
Matt Menke4b69f932019-03-04 16:20:012143 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002144 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2145 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2146
Matt Menke4b69f932019-03-04 16:20:012147 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002148 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2149
Matt Menke4b69f932019-03-04 16:20:012150 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002151 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002152 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012153
2154 // Update the state of the second job.
2155 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2156
2157 // Only the state of the second request should have changed.
2158 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2159 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2160
2161 // Second job connects and the first request gets the socket. The
2162 // second handle switches to the state of the remaining ConnectJob.
2163 client_socket_factory_.SignalJob(1);
2164 EXPECT_THAT(callback.WaitForResult(), IsOk());
2165 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552166}
2167
2168// Test GetLoadState in the case the per-group limit is reached.
2169TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2170 CreatePool(2, 1);
2171 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2172
2173 ClientSocketHandle handle;
2174 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502175 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392176 TestGroupId("a"), params_, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502177 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2178 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012179 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552180 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2181
2182 // Request another socket from the same pool, buth with a higher priority.
2183 // The first request should now be stalled at the socket group limit.
2184 ClientSocketHandle handle2;
2185 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392186 rv = handle2.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152187 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502188 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2189 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012190 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552191 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2192 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2193
2194 // The first handle should remain stalled as the other socket goes through
2195 // the connect process.
2196
2197 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2198 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2199 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2200
2201 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012202 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552203 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2204
2205 // Closing the second socket should cause the stalled handle to finally get a
2206 // ConnectJob.
2207 handle2.socket()->Disconnect();
2208 handle2.Reset();
2209 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2210}
2211
2212// Test GetLoadState in the case the per-pool limit is reached.
2213TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2214 CreatePool(2, 2);
2215 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2216
2217 ClientSocketHandle handle;
2218 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502219 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392220 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502221 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2222 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012223 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552224
2225 // Request for socket from another pool.
2226 ClientSocketHandle handle2;
2227 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392228 rv = handle2.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152229 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502230 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2231 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012232 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552233
2234 // Request another socket from the first pool. Request should stall at the
2235 // socket pool limit.
2236 ClientSocketHandle handle3;
2237 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392238 rv = handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152239 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502240 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2241 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012242 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552243
2244 // The third handle should remain stalled as the other sockets in its group
2245 // goes through the connect process.
2246
2247 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2248 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2249
2250 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2251 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2252 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2253
2254 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012255 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552256 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2257
2258 // Closing a socket should allow the stalled handle to finally get a new
2259 // ConnectJob.
2260 handle.socket()->Disconnect();
2261 handle.Reset();
2262 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572263}
2264
Matt Menkeb57663b32019-03-01 17:17:102265TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132266 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102267 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132268
[email protected]2431756e2010-09-29 20:26:132269 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522270 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502271 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102272 ERR_CERT_COMMON_NAME_INVALID,
Matt Menkec6b3edf72019-03-19 17:00:392273 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502274 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2275 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2276 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132277 EXPECT_TRUE(handle.is_initialized());
2278 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132279}
2280
Matt Menkeb57663b32019-03-01 17:17:102281TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132282 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2283
Matt Menkeb57663b32019-03-01 17:17:102284 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132285 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522286 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502287 EXPECT_EQ(
2288 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392289 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502290 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2291 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2292 NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392293 EXPECT_EQ(LOAD_STATE_CONNECTING,
2294 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102295 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132296 EXPECT_TRUE(handle.is_initialized());
2297 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132298}
2299
[email protected]e60e47a2010-07-14 03:37:182300TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2301 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2302 connect_job_factory_->set_job_type(
2303 TestConnectJob::kMockAdditionalErrorStateJob);
2304
[email protected]2431756e2010-09-29 20:26:132305 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522306 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502307 EXPECT_EQ(
2308 ERR_CONNECTION_FAILED,
Matt Menkec6b3edf72019-03-19 17:00:392309 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502310 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2311 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2312 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132313 EXPECT_FALSE(handle.is_initialized());
2314 EXPECT_FALSE(handle.socket());
2315 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512316 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182317}
2318
2319TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2320 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2321
2322 connect_job_factory_->set_job_type(
2323 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132324 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522325 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502326 EXPECT_EQ(
2327 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392328 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502329 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2330 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2331 NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392332 EXPECT_EQ(LOAD_STATE_CONNECTING,
2333 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012334 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132335 EXPECT_FALSE(handle.is_initialized());
2336 EXPECT_FALSE(handle.socket());
2337 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512338 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182339}
2340
martijn003cd612016-05-19 22:24:382341// Make sure we can reuse sockets.
2342TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412343 CreatePoolWithIdleTimeouts(
2344 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032345 base::TimeDelta(), // Time out unused sockets immediately.
2346 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2347
2348 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2349
2350 ClientSocketHandle handle;
2351 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502352 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392353 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502354 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2355 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012356 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392357 EXPECT_EQ(LOAD_STATE_CONNECTING,
2358 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012359 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032360
2361 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352362 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382363 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482364 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032365 handle.Reset();
2366
2367 // Should now have one idle socket.
2368 ASSERT_EQ(1, pool_->IdleSocketCount());
2369
2370 // Request a new socket. This should reuse the old socket and complete
2371 // synchronously.
vishal.b62985ca92015-04-17 08:45:512372 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502373 rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392374 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502375 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2376 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012377 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032378 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482379 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032380
Matt Menke9fa17d52019-03-25 19:12:262381 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392382 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262383 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032384
mmenke43758e62015-05-04 21:09:462385 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032386 log.GetEntries(&entries);
Matt Menke9fa17d52019-03-25 19:12:262387 EXPECT_TRUE(LogContainsEvent(
2388 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2389 NetLogEventPhase::NONE));
2390 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032391 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262392 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032393}
2394
martijn003cd612016-05-19 22:24:382395// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172396TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032397 CreatePoolWithIdleTimeouts(
2398 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2399 base::TimeDelta(), // Time out unused sockets immediately
2400 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412401
2402 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2403
2404 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2405
2406 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522407 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502408 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392409 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502410 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2411 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012412 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392413 EXPECT_EQ(LOAD_STATE_CONNECTING,
2414 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412415
2416 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522417 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392418 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152419 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502420 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2421 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012422 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392423 EXPECT_EQ(LOAD_STATE_CONNECTING,
2424 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412425
2426 // Cancel one of the requests. Wait for the other, which will get the first
2427 // job. Release the socket. Run the loop again to make sure the second
2428 // socket is sitting idle and the first one is released (since ReleaseSocket()
2429 // just posts a DoReleaseSocket() task).
2430
2431 handle.Reset();
robpercival214763f2016-07-01 23:27:012432 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412433 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352434 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382435 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412436 handle2.Reset();
2437
[email protected]e7b1c6d2c2012-05-05 00:54:032438 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2439 // actually become pending until 2ms after they have been created. In order
2440 // to flush all tasks, we need to wait so that we know there are no
2441 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452442 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412443
[email protected]e7b1c6d2c2012-05-05 00:54:032444 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412445 ASSERT_EQ(2, pool_->IdleSocketCount());
2446
2447 // Request a new socket. This should cleanup the unused and timed out ones.
2448 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512449 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522450 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392451 rv = handle.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152452 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502453 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2454 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012455 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2456 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412457 EXPECT_FALSE(handle.is_reused());
2458
[email protected]e7b1c6d2c2012-05-05 00:54:032459 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262460 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392461 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262462 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412463
mmenke43758e62015-05-04 21:09:462464 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412465 log.GetEntries(&entries);
2466 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002467 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412468}
2469
[email protected]2041cf342010-02-19 03:15:592470// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162471// because of multiple releasing disconnected sockets.
2472TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2473 CreatePoolWithIdleTimeouts(
2474 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2475 base::TimeDelta(), // Time out unused sockets immediately.
2476 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2477
2478 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2479
2480 // Startup 4 connect jobs. Two of them will be pending.
2481
[email protected]2431756e2010-09-29 20:26:132482 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522483 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502484 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392485 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502486 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2487 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012488 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162489
[email protected]2431756e2010-09-29 20:26:132490 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522491 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392492 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152493 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502494 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2495 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012496 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162497
[email protected]2431756e2010-09-29 20:26:132498 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522499 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392500 rv = handle3.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152501 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502502 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2503 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012504 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162505
[email protected]2431756e2010-09-29 20:26:132506 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522507 TestCompletionCallback callback4;
Matt Menkec6b3edf72019-03-19 17:00:392508 rv = handle4.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152509 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502510 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2511 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012512 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162513
2514 // Release two disconnected sockets.
2515
[email protected]2431756e2010-09-29 20:26:132516 handle.socket()->Disconnect();
2517 handle.Reset();
2518 handle2.socket()->Disconnect();
2519 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162520
robpercival214763f2016-07-01 23:27:012521 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132522 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012523 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132524 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162525}
2526
[email protected]d7027bb2010-05-10 18:58:542527// Regression test for http://crbug.com/42267.
2528// When DoReleaseSocket() is processed for one socket, it is blocked because the
2529// other stalled groups all have releasing sockets, so no progress can be made.
2530TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2531 CreatePoolWithIdleTimeouts(
2532 4 /* socket limit */, 4 /* socket limit per group */,
2533 base::TimeDelta(), // Time out unused sockets immediately.
2534 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2535
2536 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2537
2538 // Max out the socket limit with 2 per group.
2539
[email protected]2431756e2010-09-29 20:26:132540 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522541 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132542 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522543 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542544
2545 for (int i = 0; i < 2; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:392546 EXPECT_EQ(
2547 OK, handle_a[i].Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
2548 ClientSocketPool::RespectLimits::ENABLED,
2549 callback_a[i].callback(),
2550 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2551 NetLogWithSource()));
2552 EXPECT_EQ(
2553 OK, handle_b[i].Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
2554 ClientSocketPool::RespectLimits::ENABLED,
2555 callback_b[i].callback(),
2556 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2557 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542558 }
[email protected]b89f7e42010-05-20 20:37:002559
[email protected]d7027bb2010-05-10 18:58:542560 // Make 4 pending requests, 2 per group.
2561
2562 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202563 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392564 handle_a[i].Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202565 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502566 callback_a[i].callback(),
2567 ClientSocketPool::ProxyAuthCallback(),
2568 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:202569 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392570 handle_b[i].Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202571 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502572 callback_b[i].callback(),
2573 ClientSocketPool::ProxyAuthCallback(),
2574 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542575 }
2576
2577 // Release b's socket first. The order is important, because in
2578 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2579 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2580 // first, which has a releasing socket, so it refuses to start up another
2581 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132582 handle_b[0].socket()->Disconnect();
2583 handle_b[0].Reset();
2584 handle_a[0].socket()->Disconnect();
2585 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542586
2587 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282588 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542589
[email protected]2431756e2010-09-29 20:26:132590 handle_b[1].socket()->Disconnect();
2591 handle_b[1].Reset();
2592 handle_a[1].socket()->Disconnect();
2593 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542594
2595 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012596 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2597 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542598 }
2599}
2600
[email protected]fd4fe0b2010-02-08 23:02:152601TEST_F(ClientSocketPoolBaseTest,
2602 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2603 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2604
2605 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2606
Matt Menkec6b3edf72019-03-19 17:00:392607 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2608 IsError(ERR_IO_PENDING));
2609 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2610 IsError(ERR_IO_PENDING));
2611 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2612 IsError(ERR_IO_PENDING));
2613 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2614 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152615
robpercival214763f2016-07-01 23:27:012616 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2617 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132618 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152619
2620 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132621 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012622 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152623
[email protected]2431756e2010-09-29 20:26:132624 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012625 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132626 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152627
2628 EXPECT_EQ(1, GetOrderOfRequest(1));
2629 EXPECT_EQ(2, GetOrderOfRequest(2));
2630 EXPECT_EQ(3, GetOrderOfRequest(3));
2631 EXPECT_EQ(4, GetOrderOfRequest(4));
2632
2633 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132634 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152635}
2636
[email protected]6ecf2b92011-12-15 01:14:522637class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042638 public:
Matt Menke9fa17d52019-03-25 19:12:262639 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132640 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182641 bool reset_releasing_handle)
2642 : pool_(pool),
2643 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042644 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522645
Chris Watkins7a41d3552017-12-01 02:13:272646 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042647
2648 ClientSocketHandle* handle() { return &handle_; }
2649
Bence Béky8ddc2492018-06-13 01:02:042650 CompletionOnceCallback callback() {
2651 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2652 base::Unretained(this));
2653 }
[email protected]4f1e4982010-03-02 18:31:042654
2655 private:
[email protected]6ecf2b92011-12-15 01:14:522656 void OnComplete(int result) {
2657 SetResult(result);
2658 if (reset_releasing_handle_)
2659 handle_.Reset();
2660
Matt Menkec6b3edf72019-03-19 17:00:392661 EXPECT_EQ(
2662 expected_result_,
Matt Menke9fa17d52019-03-25 19:12:262663 handle2_.Init(TestGroupId("a"), CreateDummyParams(), DEFAULT_PRIORITY,
2664 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2665 CompletionOnceCallback(),
2666 ClientSocketPool::ProxyAuthCallback(), pool_,
2667 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522668 }
2669
Matt Menke9fa17d52019-03-25 19:12:262670 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182671 int expected_result_;
2672 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042673 ClientSocketHandle handle_;
2674 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042675};
2676
[email protected]e60e47a2010-07-14 03:37:182677
2678TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2679 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2680
Matt Menkec6b3edf72019-03-19 17:00:392681 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2682 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2683 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182684
[email protected]2431756e2010-09-29 20:26:132685 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182686 client_socket_factory_.allocation_count());
2687
2688 connect_job_factory_->set_job_type(
2689 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2690 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202691 EXPECT_EQ(
2692 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392693 req.handle()->Init(TestGroupId("a"), params_, DEFAULT_PRIORITY,
2694 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502695 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2696 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182697 // The next job should complete synchronously
2698 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2699
robpercival214763f2016-07-01 23:27:012700 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182701 EXPECT_FALSE(req.handle()->is_initialized());
2702 EXPECT_FALSE(req.handle()->socket());
2703 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512704 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182705}
2706
[email protected]b6501d3d2010-06-03 23:53:342707// http://crbug.com/44724 regression test.
2708// We start releasing the pool when we flush on network change. When that
2709// happens, the only active references are in the ClientSocketHandles. When a
2710// ConnectJob completes and calls back into the last ClientSocketHandle, that
2711// callback can release the last reference and delete the pool. After the
2712// callback finishes, we go back to the stack frame within the now-deleted pool.
2713// Executing any code that refers to members of the now-deleted pool can cause
2714// crashes.
2715TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2716 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2717 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2718
2719 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522720 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502721 EXPECT_EQ(
2722 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392723 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502724 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2725 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2726 NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342727
[email protected]7af985a2012-12-14 22:40:422728 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342729
2730 // We'll call back into this now.
2731 callback.WaitForResult();
2732}
2733
[email protected]a7e38572010-06-07 18:22:242734TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2735 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2736 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2737
2738 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522739 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502740 EXPECT_EQ(
2741 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392742 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502743 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2744 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2745 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012746 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242747 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2748
[email protected]7af985a2012-12-14 22:40:422749 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242750
2751 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282752 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242753
Matt Menke28ac03e2019-02-25 22:25:502754 EXPECT_EQ(
2755 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392756 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502757 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2758 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2759 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012760 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242761 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2762}
2763
[email protected]6ecf2b92011-12-15 01:14:522764class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142765 public:
Matt Menke9fa17d52019-03-25 19:12:262766 ConnectWithinCallback(
2767 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:192768 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:262769 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:392770 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142771
Chris Watkins7a41d3552017-12-01 02:13:272772 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142773
2774 int WaitForNestedResult() {
2775 return nested_callback_.WaitForResult();
2776 }
2777
Bence Béky8ddc2492018-06-13 01:02:042778 CompletionOnceCallback callback() {
2779 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2780 base::Unretained(this));
2781 }
[email protected]6ecf2b92011-12-15 01:14:522782
[email protected]06f92462010-08-31 19:24:142783 private:
[email protected]6ecf2b92011-12-15 01:14:522784 void OnComplete(int result) {
2785 SetResult(result);
Matt Menke28ac03e2019-02-25 22:25:502786 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392787 handle_.Init(group_id_, params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502788 ClientSocketPool::RespectLimits::ENABLED,
2789 nested_callback_.callback(),
2790 ClientSocketPool::ProxyAuthCallback(), pool_,
2791 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522792 }
2793
Matt Menkec6b3edf72019-03-19 17:00:392794 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:192795 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:262796 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142797 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522798 TestCompletionCallback nested_callback_;
2799
2800 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142801};
2802
2803TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2804 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2805
2806 // First job will be waiting until it gets aborted.
2807 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2808
2809 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:392810 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:502811 EXPECT_EQ(
2812 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392813 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502814 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2815 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2816 NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142817
2818 // Second job will be started during the first callback, and will
2819 // asynchronously complete with OK.
2820 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422821 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012822 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2823 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142824}
2825
Matt Menke141b87f22019-01-30 02:43:032826TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:262827 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2828 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:032829
2830 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2831 ClientSocketHandle handle;
2832 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502833 EXPECT_EQ(
2834 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392835 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502836 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2837 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2838 NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:032839 // The backup timer fires but doesn't start a new ConnectJob while resolving
2840 // the hostname.
2841 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2842 FastForwardBy(base::TimeDelta::FromMilliseconds(
2843 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2844 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2845
2846 // Once the ConnectJob has finished resolving the hostname, the backup timer
2847 // will create a ConnectJob when it fires.
2848 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2849 FastForwardBy(base::TimeDelta::FromMilliseconds(
2850 ClientSocketPool::kMaxConnectRetryIntervalMs));
2851 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2852}
2853
2854// Test that no backup socket is created when a ConnectJob connects before it
2855// completes.
2856TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:262857 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2858 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:032859
2860 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2861 ClientSocketHandle handle;
2862 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502863 EXPECT_EQ(
2864 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392865 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502866 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2867 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2868 NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:032869 // The backup timer fires but doesn't start a new ConnectJob while resolving
2870 // the hostname.
2871 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2872 FastForwardBy(base::TimeDelta::FromMilliseconds(
2873 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2874 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2875
2876 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2877 client_socket_factory_.SetJobHasEstablishedConnection(0);
2878 FastForwardBy(base::TimeDelta::FromMilliseconds(
2879 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2880 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2881}
2882
[email protected]25eea382010-07-10 23:55:262883// Cancel a pending socket request while we're at max sockets,
2884// and verify that the backup socket firing doesn't cause a crash.
2885TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2886 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:262887 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2888 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:262889
[email protected]4baaf9d2010-08-31 15:15:442890 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2891 // timer.
[email protected]25eea382010-07-10 23:55:262892 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2893 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522894 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502895 EXPECT_EQ(
2896 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392897 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502898 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2899 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2900 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262901
2902 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2903 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2904 ClientSocketHandle handles[kDefaultMaxSockets];
2905 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522906 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:392907 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY,
2908 SocketTag(),
tfarina428341112016-09-22 13:38:202909 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502910 callback.callback(),
2911 ClientSocketPool::ProxyAuthCallback(),
2912 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262913 }
2914
fdoray5eeb7642016-06-22 16:11:282915 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262916
2917 // Cancel the pending request.
2918 handle.Reset();
2919
2920 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452921 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002922 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262923
[email protected]25eea382010-07-10 23:55:262924 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2925}
2926
[email protected]3f00be82010-09-27 19:50:022927TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:262928 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2929 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:442930
2931 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2932 // timer.
2933 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2934 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522935 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502936 EXPECT_EQ(
2937 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392938 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502939 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2940 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2941 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:262942 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
2943 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
2944 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
2945 TestGroupId("bar")));
2946 EXPECT_EQ(
2947 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:442948
2949 // Cancel the socket request. This should cancel the backup timer. Wait for
2950 // the backup time to see if it indeed got canceled.
2951 handle.Reset();
2952 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452953 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002954 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:262955 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
2956 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:442957}
2958
[email protected]3f00be82010-09-27 19:50:022959TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:262960 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2961 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:022962
2963 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2964 // timer.
2965 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2966 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522967 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502968 EXPECT_EQ(
2969 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392970 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502971 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2972 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2973 NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022974 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2975 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522976 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202977 EXPECT_EQ(
2978 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392979 handle2.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202980 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502981 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2982 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:262983 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
2984 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:022985
2986 // Cancel request 1 and then complete request 2. With the requests finished,
2987 // the backup timer should be cancelled.
2988 handle.Reset();
robpercival214763f2016-07-01 23:27:012989 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022990 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452991 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002992 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:022993}
2994
[email protected]eb5a99382010-07-11 03:18:262995// Test delayed socket binding for the case where we have two connects,
2996// and while one is waiting on a connect, the other frees up.
2997// The socket waiting on a connect should switch immediately to the freed
2998// up socket.
2999TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3000 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3001 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3002
3003 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523004 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503005 EXPECT_EQ(
3006 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393007 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503008 ClientSocketPool::RespectLimits::ENABLED,
3009 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3010 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013011 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263012
3013 // No idle sockets, no pending jobs.
3014 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263015 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263016
3017 // Create a second socket to the same host, but this one will wait.
3018 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3019 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503020 EXPECT_EQ(
3021 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393022 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503023 ClientSocketPool::RespectLimits::ENABLED,
3024 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3025 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263026 // No idle sockets, and one connecting job.
3027 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263028 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263029
3030 // Return the first handle to the pool. This will initiate the delayed
3031 // binding.
3032 handle1.Reset();
3033
fdoray5eeb7642016-06-22 16:11:283034 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263035
3036 // Still no idle sockets, still one pending connect job.
3037 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263038 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263039
3040 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013041 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263042
3043 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263044 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263045
3046 // Finally, signal the waiting Connect.
3047 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263048 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263049
fdoray5eeb7642016-06-22 16:11:283050 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263051}
3052
3053// Test delayed socket binding when a group is at capacity and one
3054// of the group's sockets frees up.
3055TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3056 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3057 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3058
3059 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523060 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503061 EXPECT_EQ(
3062 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393063 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503064 ClientSocketPool::RespectLimits::ENABLED,
3065 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3066 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013067 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263068
3069 // No idle sockets, no pending jobs.
3070 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263071 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263072
3073 // Create a second socket to the same host, but this one will wait.
3074 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3075 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503076 EXPECT_EQ(
3077 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393078 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503079 ClientSocketPool::RespectLimits::ENABLED,
3080 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3081 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263082 // No idle sockets, and one connecting job.
3083 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263084 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263085
3086 // Return the first handle to the pool. This will initiate the delayed
3087 // binding.
3088 handle1.Reset();
3089
fdoray5eeb7642016-06-22 16:11:283090 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263091
3092 // Still no idle sockets, still one pending connect job.
3093 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263094 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263095
3096 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013097 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263098
3099 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263100 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263101
3102 // Finally, signal the waiting Connect.
3103 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263104 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263105
fdoray5eeb7642016-06-22 16:11:283106 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263107}
3108
3109// Test out the case where we have one socket connected, one
3110// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513111// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263112// should complete, by taking the first socket's idle socket.
3113TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3114 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3115 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3116
3117 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523118 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503119 EXPECT_EQ(
3120 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393121 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503122 ClientSocketPool::RespectLimits::ENABLED,
3123 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3124 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013125 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263126
3127 // No idle sockets, no pending jobs.
3128 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263129 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263130
3131 // Create a second socket to the same host, but this one will wait.
3132 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3133 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503134 EXPECT_EQ(
3135 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393136 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503137 ClientSocketPool::RespectLimits::ENABLED,
3138 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3139 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263140 // No idle sockets, and one connecting job.
3141 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263142 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263143
3144 // Return the first handle to the pool. This will initiate the delayed
3145 // binding.
3146 handle1.Reset();
3147
fdoray5eeb7642016-06-22 16:11:283148 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263149
3150 // Still no idle sockets, still one pending connect job.
3151 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263152 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263153
3154 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013155 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263156
3157 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263158 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263159
3160 // Finally, signal the waiting Connect.
3161 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263162 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263163
fdoray5eeb7642016-06-22 16:11:283164 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263165}
3166
[email protected]2abfe90a2010-08-25 17:49:513167// Cover the case where on an available socket slot, we have one pending
3168// request that completes synchronously, thereby making the Group empty.
3169TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3170 const int kUnlimitedSockets = 100;
3171 const int kOneSocketPerGroup = 1;
3172 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3173
3174 // Make the first request asynchronous fail.
3175 // This will free up a socket slot later.
3176 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3177
3178 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523179 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203180 EXPECT_EQ(
3181 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393182 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203183 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503184 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3185 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263186 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513187
3188 // Make the second request synchronously fail. This should make the Group
3189 // empty.
3190 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3191 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523192 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513193 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3194 // when created.
tfarina428341112016-09-22 13:38:203195 EXPECT_EQ(
3196 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393197 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203198 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503199 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3200 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513201
Matt Menke9fa17d52019-03-25 19:12:263202 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513203
robpercival214763f2016-07-01 23:27:013204 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3205 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263206 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513207}
3208
[email protected]e1b54dc2010-10-06 21:27:223209TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3210 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3211
3212 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3213
3214 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523215 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203216 EXPECT_EQ(
3217 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393218 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203219 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503220 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3221 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223222
3223 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523224 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203225 EXPECT_EQ(
3226 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393227 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203228 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503229 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3230 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223231 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523232 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203233 EXPECT_EQ(
3234 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393235 handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203236 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503237 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3238 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223239
robpercival214763f2016-07-01 23:27:013240 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3241 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3242 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223243
3244 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353245 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383246 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353247 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383248 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223249
3250 handle1.Reset();
3251 handle2.Reset();
3252 handle3.Reset();
3253
Matt Menkec6b3edf72019-03-19 17:00:393254 EXPECT_EQ(OK, handle1.Init(
3255 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3256 ClientSocketPool::RespectLimits::ENABLED,
3257 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3258 pool_.get(), NetLogWithSource()));
3259 EXPECT_EQ(OK, handle2.Init(
3260 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3261 ClientSocketPool::RespectLimits::ENABLED,
3262 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3263 pool_.get(), NetLogWithSource()));
3264 EXPECT_EQ(OK, handle3.Init(
3265 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3266 ClientSocketPool::RespectLimits::ENABLED,
3267 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3268 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223269
3270 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3271 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3272 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3273}
3274
[email protected]2c2bef152010-10-13 00:55:033275TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3276 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3277 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3278
Matt Menkebd12b7e2019-03-25 21:12:033279 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033280
Matt Menke9fa17d52019-03-25 19:12:263281 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3282 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3283 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3284 TestGroupId("a")));
3285 EXPECT_EQ(2u,
3286 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393287 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033288
3289 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523290 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203291 EXPECT_EQ(
3292 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393293 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203294 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503295 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3296 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033297
3298 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523299 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203300 EXPECT_EQ(
3301 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393302 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203303 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503304 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3305 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033306
Matt Menke9fa17d52019-03-25 19:12:263307 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3308 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3309 TestGroupId("a")));
3310 EXPECT_EQ(0u,
3311 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393312 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033313
robpercival214763f2016-07-01 23:27:013314 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3315 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033316 handle1.Reset();
3317 handle2.Reset();
3318
Matt Menke9fa17d52019-03-25 19:12:263319 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3320 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3321 TestGroupId("a")));
3322 EXPECT_EQ(0u,
3323 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393324 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033325}
3326
3327TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3328 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3329 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3330
3331 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523332 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203333 EXPECT_EQ(
3334 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393335 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203336 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503337 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3338 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033339
Matt Menke9fa17d52019-03-25 19:12:263340 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3341 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3342 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3343 TestGroupId("a")));
3344 EXPECT_EQ(0u,
3345 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393346 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033347
Matt Menkebd12b7e2019-03-25 21:12:033348 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033349
Matt Menke9fa17d52019-03-25 19:12:263350 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3351 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3352 TestGroupId("a")));
3353 EXPECT_EQ(1u,
3354 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393355 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033356
3357 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523358 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203359 EXPECT_EQ(
3360 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393361 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203362 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503363 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3364 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033365
Matt Menke9fa17d52019-03-25 19:12:263366 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3367 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3368 TestGroupId("a")));
3369 EXPECT_EQ(0u,
3370 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393371 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033372
robpercival214763f2016-07-01 23:27:013373 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3374 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033375 handle1.Reset();
3376 handle2.Reset();
3377
Matt Menke9fa17d52019-03-25 19:12:263378 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3379 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3380 TestGroupId("a")));
3381 EXPECT_EQ(0u,
3382 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393383 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033384}
3385
3386TEST_F(ClientSocketPoolBaseTest,
3387 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3388 CreatePool(4, 4);
3389 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3390
3391 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523392 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203393 EXPECT_EQ(
3394 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393395 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203396 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503397 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3398 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033399
3400 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523401 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203402 EXPECT_EQ(
3403 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393404 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203405 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503406 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3407 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033408
3409 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523410 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203411 EXPECT_EQ(
3412 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393413 handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203414 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503415 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3416 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033417
Matt Menke9fa17d52019-03-25 19:12:263418 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3419 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3420 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3421 TestGroupId("a")));
3422 EXPECT_EQ(0u,
3423 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393424 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033425
Matt Menkebd12b7e2019-03-25 21:12:033426 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033427
Matt Menke9fa17d52019-03-25 19:12:263428 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3429 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3430 TestGroupId("a")));
3431 EXPECT_EQ(0u,
3432 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393433 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033434
robpercival214763f2016-07-01 23:27:013435 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3436 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3437 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033438 handle1.Reset();
3439 handle2.Reset();
3440 handle3.Reset();
3441
Matt Menke9fa17d52019-03-25 19:12:263442 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3443 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3444 TestGroupId("a")));
3445 EXPECT_EQ(0u,
3446 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393447 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033448}
3449
3450TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3451 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3452 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3453
Matt Menke9fa17d52019-03-25 19:12:263454 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033455
Matt Menkebd12b7e2019-03-25 21:12:033456 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393457 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033458
Matt Menke9fa17d52019-03-25 19:12:263459 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433460 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393461 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263462 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3463 EXPECT_EQ(
3464 kDefaultMaxSockets,
3465 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3466 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433467 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263468 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3469 TestGroupId("a"))));
[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
Matt Menkebd12b7e2019-03-25 21:12:033473 pool_->RequestSockets(TestGroupId("b"), params_, kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393474 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033475
Matt Menke9fa17d52019-03-25 19:12:263476 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033477}
3478
3479TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3480 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3481 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3482
Matt Menke9fa17d52019-03-25 19:12:263483 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033484
Matt Menkebd12b7e2019-03-25 21:12:033485 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573486 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033487
Matt Menke9fa17d52019-03-25 19:12:263488 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433489 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393490 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263491 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3492 EXPECT_EQ(
3493 kDefaultMaxSockets - 1,
3494 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3495 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433496 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263497 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3498 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483499 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033500
Matt Menke9fa17d52019-03-25 19:12:263501 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033502
Matt Menkebd12b7e2019-03-25 21:12:033503 pool_->RequestSockets(TestGroupId("b"), params_, kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393504 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033505
Matt Menke9fa17d52019-03-25 19:12:263506 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3507 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483508 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033509}
3510
3511TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3512 CreatePool(4, 4);
3513 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3514
3515 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523516 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203517 EXPECT_EQ(
3518 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393519 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203520 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503521 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3522 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013523 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033524 handle1.Reset();
3525
Matt Menke9fa17d52019-03-25 19:12:263526 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3527 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3528 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3529 TestGroupId("a")));
3530 EXPECT_EQ(0u,
3531 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393532 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033533
Matt Menkebd12b7e2019-03-25 21:12:033534 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033535
Matt Menke9fa17d52019-03-25 19:12:263536 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3537 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3538 TestGroupId("a")));
3539 EXPECT_EQ(1u,
3540 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393541 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033542}
3543
3544TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3545 CreatePool(4, 4);
3546 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3547
3548 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523549 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203550 EXPECT_EQ(
3551 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393552 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203553 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503554 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3555 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013556 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033557
Matt Menke9fa17d52019-03-25 19:12:263558 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3559 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3560 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3561 TestGroupId("a")));
3562 EXPECT_EQ(0u,
3563 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393564 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263565 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033566
Matt Menkebd12b7e2019-03-25 21:12:033567 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033568
Matt Menke9fa17d52019-03-25 19:12:263569 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3570 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3571 TestGroupId("a")));
3572 EXPECT_EQ(1u,
3573 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393574 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263575 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033576}
3577
3578TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3579 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3580 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3581
Matt Menkebd12b7e2019-03-25 21:12:033582 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573583 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033584
Matt Menke9fa17d52019-03-25 19:12:263585 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3586 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3587 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3588 TestGroupId("a")));
3589 EXPECT_EQ(0u,
3590 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433591 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393592 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033593
Matt Menkebd12b7e2019-03-25 21:12:033594 pool_->RequestSockets(TestGroupId("b"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573595 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033596
Matt Menke9fa17d52019-03-25 19:12:263597 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3598 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3599 TestGroupId("b")));
3600 EXPECT_EQ(0u,
3601 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433602 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393603 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033604}
3605
[email protected]3c819f522010-12-02 02:03:123606TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3607 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3608 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3609
Matt Menkebd12b7e2019-03-25 21:12:033610 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573611 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123612
Matt Menke9fa17d52019-03-25 19:12:263613 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523614
3615 connect_job_factory_->set_job_type(
3616 TestConnectJob::kMockAdditionalErrorStateJob);
Matt Menkebd12b7e2019-03-25 21:12:033617 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573618 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523619
Matt Menke9fa17d52019-03-25 19:12:263620 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123621}
3622
[email protected]8159a1c2012-06-07 00:00:103623TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033624 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433625 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033626
Matt Menkebd12b7e2019-03-25 21:12:033627 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033628
Matt Menke9fa17d52019-03-25 19:12:263629 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3630 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3631 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3632 TestGroupId("a")));
3633 EXPECT_EQ(2u,
3634 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3635 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393636 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033637
Matt Menkebd12b7e2019-03-25 21:12:033638 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263639 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3640 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3641 TestGroupId("a")));
3642 EXPECT_EQ(2u,
3643 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3644 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393645 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033646
3647 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523648 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203649 EXPECT_EQ(
3650 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393651 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203652 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503653 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3654 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433655
3656 client_socket_factory_.SignalJob(0);
3657 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3658
Matt Menke9fa17d52019-03-25 19:12:263659 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3660 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3661 TestGroupId("a")));
3662 EXPECT_EQ(1u,
3663 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3664 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393665 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033666
3667 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523668 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433669 EXPECT_EQ(
3670 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393671 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:433672 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503673 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3674 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433675 client_socket_factory_.SignalJob(0);
3676 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033677
Matt Menke9fa17d52019-03-25 19:12:263678 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3679 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3680 TestGroupId("a")));
3681 EXPECT_EQ(0u,
3682 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3683 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393684 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103685
[email protected]2c2bef152010-10-13 00:55:033686 handle1.Reset();
3687 handle2.Reset();
3688
Matt Menke9fa17d52019-03-25 19:12:263689 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3690 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3691 TestGroupId("a")));
3692 EXPECT_EQ(0u,
3693 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3694 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393695 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033696
Matt Menkebd12b7e2019-03-25 21:12:033697 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263698 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3699 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3700 TestGroupId("a")));
3701 EXPECT_EQ(0u,
3702 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3703 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393704 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033705}
3706
3707TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3708 CreatePool(4, 4);
3709 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3710
Matt Menkebd12b7e2019-03-25 21:12:033711 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033712
Matt Menke9fa17d52019-03-25 19:12:263713 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3714 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3715 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3716 TestGroupId("a")));
3717 EXPECT_EQ(1u,
3718 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393719 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033720
Matt Menkebd12b7e2019-03-25 21:12:033721 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263722 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3723 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3724 TestGroupId("a")));
3725 EXPECT_EQ(2u,
3726 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393727 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033728
Matt Menkebd12b7e2019-03-25 21:12:033729 pool_->RequestSockets(TestGroupId("a"), params_, 3, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263730 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3731 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3732 TestGroupId("a")));
3733 EXPECT_EQ(3u,
3734 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393735 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033736
Matt Menkebd12b7e2019-03-25 21:12:033737 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263738 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3739 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3740 TestGroupId("a")));
3741 EXPECT_EQ(3u,
3742 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393743 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033744}
3745
3746TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3747 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433748 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033749
Matt Menkebd12b7e2019-03-25 21:12:033750 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033751
Matt Menke9fa17d52019-03-25 19:12:263752 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3753 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3754 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3755 TestGroupId("a")));
3756 EXPECT_EQ(1u,
3757 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393758 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033759
3760 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523761 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203762 EXPECT_EQ(
3763 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393764 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203765 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503766 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3767 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033768
Matt Menke9fa17d52019-03-25 19:12:263769 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3770 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3771 TestGroupId("a")));
3772 EXPECT_EQ(0u,
3773 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393774 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033775
Lily Chenecebf932018-11-02 17:15:433776 client_socket_factory_.SignalJobs();
3777 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3778
Matt Menke9fa17d52019-03-25 19:12:263779 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3780 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3781 TestGroupId("a")));
3782 EXPECT_EQ(0u,
3783 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393784 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263785 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033786
[email protected]0dc88b32014-03-26 20:12:283787 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483788 // starts, it has a connect start time.
3789 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033790 handle1.Reset();
3791
Matt Menkec6b3edf72019-03-19 17:00:393792 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033793}
3794
[email protected]034df0f32013-01-07 23:17:483795// Checks that fully connected preconnect jobs have no connect times, and are
3796// marked as reused.
3797TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3798 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3799 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkebd12b7e2019-03-25 21:12:033800 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483801
Matt Menke9fa17d52019-03-25 19:12:263802 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3803 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3804 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3805 TestGroupId("a")));
3806 EXPECT_EQ(0u,
3807 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393808 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483809
3810 ClientSocketHandle handle;
3811 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:393812 EXPECT_EQ(OK, handle.Init(
3813 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3814 ClientSocketPool::RespectLimits::ENABLED,
3815 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3816 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483817
3818 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:393819 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483820
3821 TestLoadTimingInfoConnectedReused(handle);
3822 handle.Reset();
3823 TestLoadTimingInfoNotConnected(handle);
3824}
3825
[email protected]dcbe168a2010-12-02 03:14:463826// http://crbug.com/64940 regression test.
3827TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3828 const int kMaxTotalSockets = 3;
3829 const int kMaxSocketsPerGroup = 2;
3830 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433831 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:463832
Matt Menkef6edce752019-03-19 17:21:563833 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:463834 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3835
3836 // Set up one idle socket in "a".
3837 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523838 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203839 EXPECT_EQ(
3840 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393841 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203842 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503843 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3844 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263845 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3846 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3847 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3848 TestGroupId("a")));
3849 EXPECT_EQ(0u,
3850 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393851 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:463852
Lily Chenecebf932018-11-02 17:15:433853 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013854 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:263855 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3856 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3857 TestGroupId("a")));
3858 EXPECT_EQ(0u,
3859 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3860 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433861
[email protected]dcbe168a2010-12-02 03:14:463862 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:393863 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:463864
3865 // Set up two active sockets in "b".
3866 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523867 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203868 EXPECT_EQ(
3869 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393870 handle1.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203871 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503872 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3873 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:203874 EXPECT_EQ(
3875 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393876 handle2.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203877 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503878 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3879 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463880
Matt Menke9fa17d52019-03-25 19:12:263881 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3882 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3883 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3884 TestGroupId("b")));
3885 EXPECT_EQ(0u,
3886 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:393887 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:433888
3889 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013890 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3891 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:393892 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263893 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3894 TestGroupId("b")));
3895 EXPECT_EQ(0u,
3896 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
3897 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463898
3899 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3900 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3901 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3902 // sockets for "a", and "b" should still have 2 active sockets.
3903
Matt Menkebd12b7e2019-03-25 21:12:033904 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263905 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3906 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3907 TestGroupId("a")));
3908 EXPECT_EQ(0u,
3909 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393910 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263911 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
3912 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3913 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3914 TestGroupId("b")));
3915 EXPECT_EQ(0u,
3916 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:393917 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263918 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463919
3920 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3921 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3922 // "a" should result in closing 1 for "b".
3923 handle1.Reset();
3924 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:393925 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263926 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463927
Matt Menkebd12b7e2019-03-25 21:12:033928 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263929 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3930 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3931 TestGroupId("a")));
3932 EXPECT_EQ(1u,
3933 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393934 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263935 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
3936 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3937 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3938 TestGroupId("b")));
3939 EXPECT_EQ(0u,
3940 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:393941 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263942 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463943}
3944
[email protected]b7b8be42011-07-12 12:46:413945TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:263946 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
3947 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:073948
3949 // Make the ConnectJob hang until it times out, shorten the timeout.
3950 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3951 connect_job_factory_->set_timeout_duration(
3952 base::TimeDelta::FromMilliseconds(500));
Matt Menkebd12b7e2019-03-25 21:12:033953 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263954 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3955 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3956 TestGroupId("a")));
3957 EXPECT_EQ(1u,
3958 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393959 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:073960
[email protected]b7b8be42011-07-12 12:46:413961 // Verify the backup timer doesn't create a backup job, by making
3962 // the backup job a pending job instead of a waiting job, so it
3963 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073964 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453965 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443966 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343967 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283968 base::RunLoop().Run();
Matt Menke9fa17d52019-03-25 19:12:263969 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:073970}
3971
[email protected]b7b8be42011-07-12 12:46:413972TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:263973 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
3974 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:073975
3976 // Make the ConnectJob hang forever.
3977 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Matt Menkebd12b7e2019-03-25 21:12:033978 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263979 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3980 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3981 TestGroupId("a")));
3982 EXPECT_EQ(1u,
3983 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393984 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:283985 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073986
3987 // Make the backup job be a pending job, so it completes normally.
3988 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3989 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523990 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503991 EXPECT_EQ(
3992 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393993 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503994 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
3995 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
3996 NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413997 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:263998 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3999 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4000 TestGroupId("a")));
4001 EXPECT_EQ(0u,
4002 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394003 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264004 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014005 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074006
4007 // The hung connect job should still be there, but everything else should be
4008 // complete.
Matt Menke9fa17d52019-03-25 19:12:264009 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4010 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4011 TestGroupId("a")));
4012 EXPECT_EQ(1u,
4013 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394014 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264015 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074016}
4017
[email protected]0dc88b32014-03-26 20:12:284018// Tests that a preconnect that starts out with unread data can still be used.
4019// http://crbug.com/334467
4020TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4021 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4022 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4023
Matt Menkebd12b7e2019-03-25 21:12:034024 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284025
Matt Menke9fa17d52019-03-25 19:12:264026 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4027 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4028 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4029 TestGroupId("a")));
4030 EXPECT_EQ(0u,
4031 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394032 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284033
4034 // Fail future jobs to be sure that handle receives the preconnected socket
4035 // rather than closing it and making a new one.
4036 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4037 ClientSocketHandle handle;
4038 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394039 EXPECT_EQ(OK, handle.Init(
4040 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
4041 ClientSocketPool::RespectLimits::ENABLED,
4042 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4043 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284044
Matt Menke9fa17d52019-03-25 19:12:264045 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4046 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4047 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4048 TestGroupId("a")));
4049 EXPECT_EQ(0u,
4050 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394051 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264052 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284053
4054 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354055 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284056
4057 TestLoadTimingInfoConnectedReused(handle);
4058 handle.Reset();
4059
4060 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394061 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284062}
4063
Lily Chenecebf932018-11-02 17:15:434064TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4065 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4066 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4067
4068 ClientSocketHandle handle1;
4069 TestCompletionCallback callback1;
4070 EXPECT_EQ(
4071 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394072 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434073 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504074 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4075 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434076
Matt Menke9fa17d52019-03-25 19:12:264077 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4078 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4079 TestGroupId("a")));
4080 EXPECT_EQ(0u,
4081 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394082 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434083
Matt Menkec6b3edf72019-03-19 17:00:394084 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4085 &handle1));
Lily Chenecebf932018-11-02 17:15:434086}
4087
4088TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4089 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4090 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4091
4092 ClientSocketHandle handle1;
4093 TestCompletionCallback callback1;
4094 EXPECT_EQ(
4095 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394096 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434097 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504098 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4099 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434100
Matt Menke9fa17d52019-03-25 19:12:264101 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4102 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4103 TestGroupId("a")));
4104 EXPECT_EQ(0u,
4105 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394106 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434107
4108 ClientSocketHandle handle2;
4109 TestCompletionCallback callback2;
4110 EXPECT_EQ(
4111 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394112 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434113 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504114 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4115 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434116
Matt Menke9fa17d52019-03-25 19:12:264117 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4118 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4119 TestGroupId("a")));
4120 EXPECT_EQ(0u,
4121 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394122 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434123
Matt Menkec6b3edf72019-03-19 17:00:394124 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4125 &handle1));
4126 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4127 &handle2));
Lily Chenecebf932018-11-02 17:15:434128
4129 // One job completes. The other request should still have its job.
4130 client_socket_factory_.SignalJob(0);
4131 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4132
Matt Menke9fa17d52019-03-25 19:12:264133 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4134 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4135 TestGroupId("a")));
4136 EXPECT_EQ(0u,
4137 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4138 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394139 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434140
Matt Menkec6b3edf72019-03-19 17:00:394141 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4142 &handle2));
Lily Chenecebf932018-11-02 17:15:434143}
4144
4145TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4146 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4147 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4148
Matt Menkebd12b7e2019-03-25 21:12:034149 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434150
Matt Menke9fa17d52019-03-25 19:12:264151 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4152 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4153 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4154 TestGroupId("a")));
4155 EXPECT_EQ(1u,
4156 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394157 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434158
4159 ClientSocketHandle handle1;
4160 TestCompletionCallback callback1;
4161 EXPECT_EQ(
4162 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394163 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434164 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504165 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4166 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434167
Matt Menke9fa17d52019-03-25 19:12:264168 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4169 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4170 TestGroupId("a")));
4171 EXPECT_EQ(0u,
4172 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394173 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434174
Matt Menkec6b3edf72019-03-19 17:00:394175 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4176 &handle1));
Lily Chenecebf932018-11-02 17:15:434177}
4178
4179TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4180 CreatePool(kDefaultMaxSockets, 1);
4181 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4182
4183 ClientSocketHandle handle1;
4184 TestCompletionCallback callback1;
4185 EXPECT_EQ(
4186 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394187 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434188 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504189 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4190 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434191
Matt Menke9fa17d52019-03-25 19:12:264192 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4193 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4194 TestGroupId("a")));
4195 EXPECT_EQ(0u,
4196 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394197 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434198
Matt Menkec6b3edf72019-03-19 17:00:394199 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4200 &handle1));
Lily Chenecebf932018-11-02 17:15:434201
4202 // Insert a higher priority request
4203 ClientSocketHandle handle2;
4204 TestCompletionCallback callback2;
4205 EXPECT_EQ(
4206 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394207 handle2.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434208 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504209 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4210 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434211
Matt Menke9fa17d52019-03-25 19:12:264212 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4213 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4214 TestGroupId("a")));
4215 EXPECT_EQ(0u,
4216 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394217 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434218
4219 // The highest priority request should steal the job from the default priority
4220 // request.
Matt Menkec6b3edf72019-03-19 17:00:394221 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4222 &handle2));
4223 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4224 &handle1));
Lily Chenecebf932018-11-02 17:15:434225}
4226
4227TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4228 CreatePool(3, 3);
4229 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4230
4231 ClientSocketHandle handle_lowest;
4232 TestCompletionCallback callback_lowest;
4233 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394234 handle_lowest.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434235 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504236 callback_lowest.callback(),
4237 ClientSocketPool::ProxyAuthCallback(),
4238 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434239
Matt Menke9fa17d52019-03-25 19:12:264240 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4241 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4242 TestGroupId("a")));
4243 EXPECT_EQ(0u,
4244 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394245 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434246
4247 ClientSocketHandle handle_highest;
4248 TestCompletionCallback callback_highest;
4249 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394250 handle_highest.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434251 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504252 callback_highest.callback(),
4253 ClientSocketPool::ProxyAuthCallback(),
4254 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434255
Matt Menke9fa17d52019-03-25 19:12:264256 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4257 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4258 TestGroupId("a")));
4259 EXPECT_EQ(0u,
4260 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394261 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434262
4263 ClientSocketHandle handle_low;
4264 TestCompletionCallback callback_low;
4265 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394266 handle_low.Init(TestGroupId("a"), params_, LOW, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434267 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504268 callback_low.callback(),
4269 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
Lily Chenecebf932018-11-02 17:15:434270 NetLogWithSource()));
4271
Matt Menke9fa17d52019-03-25 19:12:264272 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4273 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4274 TestGroupId("a")));
4275 EXPECT_EQ(0u,
4276 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394277 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434278
4279 ClientSocketHandle handle_lowest2;
4280 TestCompletionCallback callback_lowest2;
4281 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394282 handle_lowest2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434283 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504284 callback_lowest2.callback(),
4285 ClientSocketPool::ProxyAuthCallback(),
4286 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434287
Matt Menke9fa17d52019-03-25 19:12:264288 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4289 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4290 TestGroupId("a")));
4291 EXPECT_EQ(0u,
4292 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394293 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434294
4295 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394296 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4297 &handle_highest));
4298 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4299 &handle_low));
4300 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4301 &handle_lowest));
4302 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4303 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434304
4305 // Add another request with medium priority. It should steal the job from the
4306 // lowest priority request with a job.
4307 ClientSocketHandle handle_medium;
4308 TestCompletionCallback callback_medium;
4309 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394310 handle_medium.Init(TestGroupId("a"), params_, MEDIUM, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434311 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504312 callback_medium.callback(),
4313 ClientSocketPool::ProxyAuthCallback(),
4314 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434315
Matt Menke9fa17d52019-03-25 19:12:264316 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4317 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4318 TestGroupId("a")));
4319 EXPECT_EQ(0u,
4320 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394321 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4322 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4323 &handle_highest));
4324 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4325 &handle_medium));
4326 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4327 &handle_low));
4328 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4329 &handle_lowest));
4330 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4331 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434332}
4333
4334TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4335 CreatePool(kDefaultMaxSockets, 1);
4336 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4337
4338 ClientSocketHandle handle1;
4339 TestCompletionCallback callback1;
4340 EXPECT_EQ(
4341 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394342 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434343 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504344 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4345 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434346
Matt Menke9fa17d52019-03-25 19:12:264347 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4348 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4349 TestGroupId("a")));
4350 EXPECT_EQ(0u,
4351 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394352 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434353
4354 ClientSocketHandle handle2;
4355 TestCompletionCallback callback2;
4356 EXPECT_EQ(
4357 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394358 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434359 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504360 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4361 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434362
Matt Menke9fa17d52019-03-25 19:12:264363 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4364 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4365 TestGroupId("a")));
4366 EXPECT_EQ(0u,
4367 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394368 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434369
4370 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394371 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4372 &handle1));
4373 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4374 &handle2));
Lily Chenecebf932018-11-02 17:15:434375
4376 // Reprioritizing the second request places it above the first, and it steals
4377 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394378 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4379 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4380 &handle2));
4381 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4382 &handle1));
Lily Chenecebf932018-11-02 17:15:434383}
4384
4385TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4386 CreatePool(kDefaultMaxSockets, 1);
4387 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4388
4389 ClientSocketHandle handle1;
4390 TestCompletionCallback callback1;
4391 EXPECT_EQ(
4392 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394393 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434394 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504395 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4396 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434397
Matt Menke9fa17d52019-03-25 19:12:264398 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4399 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4400 TestGroupId("a")));
4401 EXPECT_EQ(0u,
4402 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394403 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434404
Matt Menkec6b3edf72019-03-19 17:00:394405 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4406 &handle1));
Lily Chenecebf932018-11-02 17:15:434407
4408 ClientSocketHandle handle2;
4409 TestCompletionCallback callback2;
4410 EXPECT_EQ(
4411 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394412 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434413 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504414 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4415 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434416
Matt Menke9fa17d52019-03-25 19:12:264417 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4418 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4419 TestGroupId("a")));
4420 EXPECT_EQ(0u,
4421 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394422 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434423
4424 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394425 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4426 &handle1));
4427 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4428 &handle2));
Lily Chenecebf932018-11-02 17:15:434429
4430 // The second request should get a job upon cancelling the first request.
4431 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264432 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4433 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4434 TestGroupId("a")));
4435 EXPECT_EQ(0u,
4436 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394437 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434438
Matt Menkec6b3edf72019-03-19 17:00:394439 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4440 &handle2));
Lily Chenecebf932018-11-02 17:15:434441}
4442
4443TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4444 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4445 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4446
4447 ClientSocketHandle handle1;
4448 TestCompletionCallback callback1;
4449 EXPECT_EQ(
4450 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394451 handle1.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434452 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504453 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4454 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434455
Matt Menke9fa17d52019-03-25 19:12:264456 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4457 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4458 TestGroupId("a")));
4459 EXPECT_EQ(0u,
4460 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394461 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434462
4463 ClientSocketHandle handle2;
4464 TestCompletionCallback callback2;
4465 EXPECT_EQ(
4466 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394467 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434468 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504469 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4470 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434471
Matt Menke9fa17d52019-03-25 19:12:264472 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4473 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4474 TestGroupId("a")));
4475 EXPECT_EQ(0u,
4476 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394477 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434478
Matt Menkec6b3edf72019-03-19 17:00:394479 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4480 &handle1));
4481 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4482 &handle2));
Lily Chenecebf932018-11-02 17:15:434483
4484 // The lower-priority job completes first. The higher-priority request should
4485 // get the socket, and the lower-priority request should get the remaining
4486 // job.
4487 client_socket_factory_.SignalJob(1);
4488 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264489 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4490 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4491 TestGroupId("a")));
4492 EXPECT_EQ(0u,
4493 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4494 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394495 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434496 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394497 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4498 &handle2));
Lily Chenecebf932018-11-02 17:15:434499}
4500
[email protected]043b68c82013-08-22 23:41:524501class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204502 public:
Matt Menke9fa17d52019-03-25 19:12:264503 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394504 const ClientSocketPool::GroupId& group_id)
4505 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524506 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204507 }
4508
Daniel Cheng4496d0822018-04-26 21:52:154509 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204510
Matt Menke9fa17d52019-03-25 19:12:264511 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504512 return handle_.Init(
Matt Menke9fa17d52019-03-25 19:12:264513 group_id_, CreateDummyParams(), DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504514 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4515 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204516 }
4517
Matt Menke9fa17d52019-03-25 19:12:264518 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504519 return handle_.Init(
Matt Menke9fa17d52019-03-25 19:12:264520 group_id_, CreateDummyParams(), MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504521 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4522 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204523 }
4524
4525 bool ReleaseOneConnection() {
4526 if (!handle_.is_initialized() || !can_release_connection_) {
4527 return false;
4528 }
4529 handle_.socket()->Disconnect();
4530 handle_.Reset();
4531 return true;
4532 }
4533
4534 void set_can_release_connection(bool can_release_connection) {
4535 can_release_connection_ = can_release_connection;
4536 }
4537
4538 MOCK_METHOD0(CloseOneIdleConnection, bool());
4539
4540 private:
Matt Menke9fa17d52019-03-25 19:12:264541 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204542 ClientSocketHandle handle_;
4543 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394544 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204545 bool can_release_connection_;
4546};
4547
[email protected]58e562f2013-04-22 17:32:204548// Tests the basic case of closing an idle socket in a higher layered pool when
4549// a new request is issued and the lower layer pool is stalled.
4550TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4551 CreatePool(1, 1);
4552 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4553
Matt Menkec6b3edf72019-03-19 17:00:394554 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014555 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204556 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4557 .WillOnce(Invoke(&mock_layered_pool,
4558 &MockLayeredPool::ReleaseOneConnection));
4559 ClientSocketHandle handle;
4560 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504561 EXPECT_EQ(
4562 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394563 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504564 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4565 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4566 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014567 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204568}
4569
Matt Menke833678642019-03-05 22:05:514570// Tests the case that trying to close an idle socket in a higher layered pool
4571// fails.
4572TEST_F(ClientSocketPoolBaseTest,
4573 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4574 CreatePool(1, 1);
4575 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4576
Matt Menkec6b3edf72019-03-19 17:00:394577 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514578 mock_layered_pool.set_can_release_connection(false);
4579 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4580 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4581 .WillOnce(Invoke(&mock_layered_pool,
4582 &MockLayeredPool::ReleaseOneConnection));
4583 ClientSocketHandle handle;
4584 TestCompletionCallback callback;
4585 EXPECT_EQ(
4586 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394587 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke833678642019-03-05 22:05:514588 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4589 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4590 NetLogWithSource()));
4591 base::RunLoop().RunUntilIdle();
4592 EXPECT_FALSE(callback.have_result());
4593}
4594
[email protected]58e562f2013-04-22 17:32:204595// Same as above, but the idle socket is in the same group as the stalled
4596// socket, and closes the only other request in its group when closing requests
4597// in higher layered pools. This generally shouldn't happen, but it may be
4598// possible if a higher level pool issues a request and the request is
4599// subsequently cancelled. Even if it's not possible, best not to crash.
4600TEST_F(ClientSocketPoolBaseTest,
4601 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4602 CreatePool(2, 2);
4603 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4604
4605 // Need a socket in another group for the pool to be stalled (If a group
4606 // has the maximum number of connections already, it's not stalled).
4607 ClientSocketHandle handle1;
4608 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394609 EXPECT_EQ(OK, handle1.Init(
4610 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4611 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4612 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4613 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204614
Matt Menkec6b3edf72019-03-19 17:00:394615 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014616 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204617 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4618 .WillOnce(Invoke(&mock_layered_pool,
4619 &MockLayeredPool::ReleaseOneConnection));
4620 ClientSocketHandle handle;
4621 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:504622 EXPECT_EQ(
4623 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394624 handle.Init(TestGroupId("group2"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504625 ClientSocketPool::RespectLimits::ENABLED,
4626 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4627 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014628 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204629}
4630
4631// Tests the case when an idle socket can be closed when a new request is
4632// issued, and the new request belongs to a group that was previously stalled.
4633TEST_F(ClientSocketPoolBaseTest,
4634 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4635 CreatePool(2, 2);
4636 std::list<TestConnectJob::JobType> job_types;
4637 job_types.push_back(TestConnectJob::kMockJob);
4638 job_types.push_back(TestConnectJob::kMockJob);
4639 job_types.push_back(TestConnectJob::kMockJob);
4640 job_types.push_back(TestConnectJob::kMockJob);
4641 connect_job_factory_->set_job_types(&job_types);
4642
4643 ClientSocketHandle handle1;
4644 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394645 EXPECT_EQ(OK, handle1.Init(
4646 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4647 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4648 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4649 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204650
Matt Menkec6b3edf72019-03-19 17:00:394651 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014652 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204653 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4654 .WillRepeatedly(Invoke(&mock_layered_pool,
4655 &MockLayeredPool::ReleaseOneConnection));
4656 mock_layered_pool.set_can_release_connection(false);
4657
4658 // The third request is made when the socket pool is in a stalled state.
4659 ClientSocketHandle handle3;
4660 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204661 EXPECT_EQ(
4662 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394663 handle3.Init(TestGroupId("group3"), params_, DEFAULT_PRIORITY,
4664 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504665 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4666 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204667
4668 base::RunLoop().RunUntilIdle();
4669 EXPECT_FALSE(callback3.have_result());
4670
4671 // The fourth request is made when the pool is no longer stalled. The third
4672 // request should be serviced first, since it was issued first and has the
4673 // same priority.
4674 mock_layered_pool.set_can_release_connection(true);
4675 ClientSocketHandle handle4;
4676 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204677 EXPECT_EQ(
4678 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394679 handle4.Init(TestGroupId("group3"), params_, DEFAULT_PRIORITY,
4680 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504681 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4682 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014683 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204684 EXPECT_FALSE(callback4.have_result());
4685
4686 // Closing a handle should free up another socket slot.
4687 handle1.Reset();
robpercival214763f2016-07-01 23:27:014688 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204689}
4690
4691// Tests the case when an idle socket can be closed when a new request is
4692// issued, and the new request belongs to a group that was previously stalled.
4693//
4694// The two differences from the above test are that the stalled requests are not
4695// in the same group as the layered pool's request, and the the fourth request
4696// has a higher priority than the third one, so gets a socket first.
4697TEST_F(ClientSocketPoolBaseTest,
4698 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4699 CreatePool(2, 2);
4700 std::list<TestConnectJob::JobType> job_types;
4701 job_types.push_back(TestConnectJob::kMockJob);
4702 job_types.push_back(TestConnectJob::kMockJob);
4703 job_types.push_back(TestConnectJob::kMockJob);
4704 job_types.push_back(TestConnectJob::kMockJob);
4705 connect_job_factory_->set_job_types(&job_types);
4706
4707 ClientSocketHandle handle1;
4708 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394709 EXPECT_EQ(OK, handle1.Init(
4710 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4711 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4712 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4713 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204714
Matt Menkec6b3edf72019-03-19 17:00:394715 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014716 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204717 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4718 .WillRepeatedly(Invoke(&mock_layered_pool,
4719 &MockLayeredPool::ReleaseOneConnection));
4720 mock_layered_pool.set_can_release_connection(false);
4721
4722 // The third request is made when the socket pool is in a stalled state.
4723 ClientSocketHandle handle3;
4724 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204725 EXPECT_EQ(
4726 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394727 handle3.Init(TestGroupId("group3"), params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:204728 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504729 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4730 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204731
4732 base::RunLoop().RunUntilIdle();
4733 EXPECT_FALSE(callback3.have_result());
4734
4735 // The fourth request is made when the pool is no longer stalled. This
4736 // request has a higher priority than the third request, so is serviced first.
4737 mock_layered_pool.set_can_release_connection(true);
4738 ClientSocketHandle handle4;
4739 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204740 EXPECT_EQ(
4741 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394742 handle4.Init(TestGroupId("group3"), params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:204743 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504744 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4745 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014746 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204747 EXPECT_FALSE(callback3.have_result());
4748
4749 // Closing a handle should free up another socket slot.
4750 handle1.Reset();
robpercival214763f2016-07-01 23:27:014751 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204752}
4753
4754TEST_F(ClientSocketPoolBaseTest,
4755 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4756 CreatePool(1, 1);
4757 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4758
Matt Menkec6b3edf72019-03-19 17:00:394759 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014760 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204761 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4762 .WillRepeatedly(Invoke(&mock_layered_pool1,
4763 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:394764 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:014765 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4766 IsOk());
[email protected]58e562f2013-04-22 17:32:204767 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4768 .WillRepeatedly(Invoke(&mock_layered_pool2,
4769 &MockLayeredPool::ReleaseOneConnection));
4770 ClientSocketHandle handle;
4771 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504772 EXPECT_EQ(
4773 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394774 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504775 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4776 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4777 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014778 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204779}
4780
[email protected]b021ece62013-06-11 11:06:334781// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154782// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4783// socket instead of a request with the same priority that was issued earlier,
4784// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334785TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334786 CreatePool(1, 1);
4787
4788 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:394789 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
4790 TestGroupId("a"), MAXIMUM_PRIORITY,
4791 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264792 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334793
4794 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4795
mmenked3641e12016-01-28 16:06:154796 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394797 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154798 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264799 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334800
mmenked3641e12016-01-28 16:06:154801 // Issue a request that ignores the limits, so a new ConnectJob is
4802 // created.
4803 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394804 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154805 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:264806 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334807
robpercival214763f2016-07-01 23:27:014808 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334809 EXPECT_FALSE(request(1)->have_result());
4810}
4811
[email protected]c55fabd2013-11-04 23:26:564812// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154813// issued for a request with RespectLimits::DISABLED is not cancelled when a
4814// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564815TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564816 CreatePool(1, 1);
4817
4818 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:394819 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
4820 TestGroupId("a"), MAXIMUM_PRIORITY,
4821 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264822 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:564823
4824 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4825
mmenked3641e12016-01-28 16:06:154826 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394827 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154828 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264829 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:564830
mmenked3641e12016-01-28 16:06:154831 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4832 // created.
4833 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394834 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154835 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:264836 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334837
mmenked3641e12016-01-28 16:06:154838 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334839 // should not be cancelled.
4840 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:264841 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334842
robpercival214763f2016-07-01 23:27:014843 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334844 EXPECT_FALSE(request(1)->have_result());
4845}
4846
Matt Menkeb57663b32019-03-01 17:17:104847TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
4848 CreatePool(1, 1);
4849
4850 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4851
4852 ClientSocketHandle handle;
4853 TestCompletionCallback callback;
4854 EXPECT_EQ(
4855 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394856 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menkeb57663b32019-03-01 17:17:104857 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4858 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4859 NetLogWithSource()));
4860
Matt Menke9fa17d52019-03-25 19:12:264861 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104862
4863 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
4864 EXPECT_FALSE(handle.is_initialized());
4865 EXPECT_FALSE(handle.socket());
4866
4867 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:264868 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104869}
4870
4871class TestAuthHelper {
4872 public:
4873 TestAuthHelper() = default;
4874 ~TestAuthHelper() = default;
4875
Matt Menkec6b3edf72019-03-19 17:00:394876 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:194877 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:264878 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394879 RequestPriority priority = DEFAULT_PRIORITY,
4880 ClientSocketPool::RespectLimits respect_limits =
4881 ClientSocketPool::RespectLimits::ENABLED,
4882 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:104883 EXPECT_EQ(ERR_IO_PENDING,
Matt Menke9fa17d52019-03-25 19:12:264884 handle_.Init(group_id_in, params, priority, SocketTag(),
Matt Menkeb57663b32019-03-01 17:17:104885 respect_limits, callback_.callback(),
4886 base::BindRepeating(&TestAuthHelper::AuthCallback,
4887 base::Unretained(this)),
4888 pool, NetLogWithSource()));
4889 }
4890
4891 void WaitForAuth() {
4892 run_loop_ = std::make_unique<base::RunLoop>();
4893 run_loop_->Run();
4894 run_loop_.reset();
4895 }
4896
4897 void WaitForAuthAndRestartSync() {
4898 restart_sync_ = true;
4899 WaitForAuth();
4900 restart_sync_ = false;
4901 }
4902
4903 void WaitForAuthAndResetHandleSync() {
4904 reset_handle_sync_ = true;
4905 WaitForAuth();
4906 reset_handle_sync_ = false;
4907 }
4908
4909 void RestartWithAuth() {
4910 DCHECK(restart_with_auth_callback_);
4911 std::move(restart_with_auth_callback_).Run();
4912 }
4913
4914 int WaitForResult() {
4915 int result = callback_.WaitForResult();
4916 // There shouldn't be any callback waiting to be invoked once the request is
4917 // complete.
4918 EXPECT_FALSE(restart_with_auth_callback_);
4919 // The socket should only be initialized on success.
4920 EXPECT_EQ(result == OK, handle_.is_initialized());
4921 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
4922 return result;
4923 }
4924
4925 ClientSocketHandle* handle() { return &handle_; }
4926 int auth_count() const { return auth_count_; }
4927 int have_result() const { return callback_.have_result(); }
4928
4929 private:
4930 void AuthCallback(const HttpResponseInfo& response,
4931 HttpAuthController* auth_controller,
4932 base::OnceClosure restart_with_auth_callback) {
4933 EXPECT_FALSE(restart_with_auth_callback_);
4934 EXPECT_TRUE(restart_with_auth_callback);
4935
4936 // Once there's a result, this method shouldn't be invoked again.
4937 EXPECT_FALSE(callback_.have_result());
4938
4939 ++auth_count_;
4940 run_loop_->Quit();
4941 if (restart_sync_) {
4942 std::move(restart_with_auth_callback).Run();
4943 return;
4944 }
4945
4946 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
4947
4948 if (reset_handle_sync_) {
4949 handle_.Reset();
4950 return;
4951 }
4952 }
4953
4954 std::unique_ptr<base::RunLoop> run_loop_;
4955 base::OnceClosure restart_with_auth_callback_;
4956
4957 bool restart_sync_ = false;
4958 bool reset_handle_sync_ = false;
4959
4960 ClientSocketHandle handle_;
4961 int auth_count_ = 0;
4962 TestCompletionCallback callback_;
4963
4964 DISALLOW_COPY_AND_ASSIGN(TestAuthHelper);
4965};
4966
4967TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
4968 CreatePool(1, 1);
4969 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4970
4971 TestAuthHelper auth_helper;
4972 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:264973 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014974 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:394975 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104976
4977 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:264978 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014979 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:394980 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104981
4982 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:264983 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014984 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:394985 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104986
4987 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
4988 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:264989 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4990 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394991 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104992 EXPECT_EQ(0, pool_->IdleSocketCount());
4993}
4994
4995TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
4996 CreatePool(1, 1);
4997 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4998
4999 TestAuthHelper auth_helper;
5000 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265001 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015002 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395003 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105004
5005 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265006 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015007 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395008 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105009
5010 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5011 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265012 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5013 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395014 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105015 EXPECT_EQ(0, pool_->IdleSocketCount());
5016}
5017
5018TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5019 CreatePool(1, 1);
5020 connect_job_factory_->set_job_type(
5021 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5022
5023 TestAuthHelper auth_helper;
5024 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265025 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105026
5027 auth_helper.WaitForAuth();
5028 auth_helper.RestartWithAuth();
5029 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5030
5031 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265032 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105033 EXPECT_EQ(0, pool_->IdleSocketCount());
5034}
5035
5036TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5037 CreatePool(1, 1);
5038 connect_job_factory_->set_job_type(
5039 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5040
5041 TestAuthHelper auth_helper;
5042 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265043 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105044
5045 auth_helper.WaitForAuthAndRestartSync();
5046 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5047
5048 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265049 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105050 EXPECT_EQ(0, pool_->IdleSocketCount());
5051}
5052
5053TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5054 CreatePool(1, 1);
5055 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5056
5057 TestAuthHelper auth_helper;
5058 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265059 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105060
5061 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265062 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105063
5064 auth_helper.handle()->Reset();
5065
5066 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265067 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105068 EXPECT_EQ(0, pool_->IdleSocketCount());
5069 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5070 EXPECT_FALSE(auth_helper.handle()->socket());
5071}
5072
5073TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5074 CreatePool(1, 1);
5075 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5076
5077 TestAuthHelper auth_helper;
5078 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265079 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105080
5081 auth_helper.WaitForAuthAndResetHandleSync();
5082 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265083 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105084 EXPECT_EQ(0, pool_->IdleSocketCount());
5085 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5086 EXPECT_FALSE(auth_helper.handle()->socket());
5087}
5088
5089TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5090 CreatePool(1, 1);
5091 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5092
5093 TestAuthHelper auth_helper;
5094 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265095 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105096
5097 auth_helper.WaitForAuth();
5098
5099 pool_->FlushWithError(ERR_FAILED);
5100 base::RunLoop().RunUntilIdle();
5101
5102 // When flushing the socket pool, bound sockets should delay returning the
5103 // error until completion.
5104 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265105 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105106 EXPECT_EQ(0, pool_->IdleSocketCount());
5107
5108 auth_helper.RestartWithAuth();
5109 // The callback should be called asynchronously.
5110 EXPECT_FALSE(auth_helper.have_result());
5111
5112 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265113 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105114 EXPECT_EQ(0, pool_->IdleSocketCount());
5115}
5116
5117TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5118 CreatePool(1, 1);
5119 connect_job_factory_->set_job_type(
5120 TestConnectJob::kMockAuthChallengeTwiceJob);
5121
5122 TestAuthHelper auth_helper;
5123 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265124 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015125 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395126 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105127
5128 auth_helper.WaitForAuth();
5129 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265130 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105131 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015132 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395133 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105134
5135 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265136 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015137 EXPECT_EQ(2, auth_helper.auth_count());
5138 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395139 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015140
Matt Menkeb57663b32019-03-01 17:17:105141 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265142 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105143 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015144 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395145 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105146
5147 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5148 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265149 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5150 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395151 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105152 EXPECT_EQ(0, pool_->IdleSocketCount());
5153}
5154
5155TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5156 CreatePool(1, 1);
5157 connect_job_factory_->set_job_type(
5158 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5159
5160 TestAuthHelper auth_helper;
5161 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265162 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105163
5164 auth_helper.WaitForAuth();
5165 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265166 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105167 EXPECT_EQ(1, auth_helper.auth_count());
5168
5169 auth_helper.WaitForAuth();
5170 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265171 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105172 EXPECT_EQ(2, auth_helper.auth_count());
5173
5174 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5175 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265176 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105177 EXPECT_EQ(0, pool_->IdleSocketCount());
5178}
5179
5180// Makes sure that when a bound request is destroyed, a new ConnectJob is
5181// created, if needed.
5182TEST_F(ClientSocketPoolBaseTest,
5183 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5184 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5185 connect_job_factory_->set_job_type(
5186 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5187
5188 // First request creates a ConnectJob.
5189 TestAuthHelper auth_helper1;
5190 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265191 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105192
5193 // A second request come in, but no new ConnectJob is needed, since the limit
5194 // has been reached.
5195 TestAuthHelper auth_helper2;
5196 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265197 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105198
5199 // Run until the auth callback for the first request is invoked.
5200 auth_helper1.WaitForAuth();
5201 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265202 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5203 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395204 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105205
5206 // Make connect jobs succeed, then cancel the first request, which should
5207 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5208 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5209 auth_helper1.handle()->Reset();
5210 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265211 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105212
5213 // The second ConnectJob should succeed.
5214 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5215 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265216 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105217}
5218
5219// Makes sure that when a bound request is destroyed, a new ConnectJob is
5220// created for another group, if needed.
5221TEST_F(ClientSocketPoolBaseTest,
5222 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5223 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5224 connect_job_factory_->set_job_type(
5225 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5226
5227 // First request creates a ConnectJob.
5228 TestAuthHelper auth_helper1;
5229 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265230 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105231
5232 // A second request come in, but no new ConnectJob is needed, since the limit
5233 // has been reached.
5234 TestAuthHelper auth_helper2;
5235 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395236 ClientSocketPool::RespectLimits::ENABLED,
5237 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265238 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5239 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105240
5241 // Run until the auth callback for the first request is invoked.
5242 auth_helper1.WaitForAuth();
5243 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265244 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5245 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395246 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265247 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5248 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395249 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105250
5251 // Make connect jobs succeed, then cancel the first request, which should
5252 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5253 // other group.
5254 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5255 auth_helper1.handle()->Reset();
5256 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265257 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5258 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105259
5260 // The second ConnectJob should succeed.
5261 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5262 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265263 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5264 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105265}
5266
5267// Test that once an auth challenge is bound, that's the request that gets all
5268// subsequent calls and the socket itself.
5269TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5270 CreatePool(1, 1);
5271 connect_job_factory_->set_job_type(
5272 TestConnectJob::kMockAuthChallengeTwiceJob);
5273
5274 // First request creates a ConnectJob.
5275 TestAuthHelper auth_helper1;
5276 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265277 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105278
5279 // A second, higher priority request is made.
5280 TestAuthHelper auth_helper2;
5281 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265282 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105283
5284 // Run until the auth callback for the second request is invoked.
5285 auth_helper2.WaitForAuth();
5286 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265287 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5288 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395289 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105290
5291 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5292 // ConnectJob.
5293 TestAuthHelper auth_helper3;
5294 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265295 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105296
5297 // Start a higher job that ignores limits, creating a hanging socket. It
5298 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5299 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5300 TestAuthHelper auth_helper4;
5301 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5302 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265303 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105304
5305 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5306 // again.
5307 auth_helper2.RestartWithAuth();
5308 auth_helper2.WaitForAuth();
5309 EXPECT_EQ(0, auth_helper1.auth_count());
5310 EXPECT_FALSE(auth_helper1.have_result());
5311 EXPECT_EQ(2, auth_helper2.auth_count());
5312 EXPECT_FALSE(auth_helper2.have_result());
5313 EXPECT_EQ(0, auth_helper3.auth_count());
5314 EXPECT_FALSE(auth_helper3.have_result());
5315 EXPECT_EQ(0, auth_helper4.auth_count());
5316 EXPECT_FALSE(auth_helper4.have_result());
5317
5318 // Advance auth again, and |auth_helper2| should get the socket.
5319 auth_helper2.RestartWithAuth();
5320 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5321 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5322 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265323 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5324 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105325 EXPECT_EQ(0, auth_helper1.auth_count());
5326 EXPECT_FALSE(auth_helper1.have_result());
5327 EXPECT_EQ(0, auth_helper3.auth_count());
5328 EXPECT_FALSE(auth_helper3.have_result());
5329 EXPECT_EQ(0, auth_helper4.auth_count());
5330 EXPECT_FALSE(auth_helper4.have_result());
5331
5332 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5333 // socket request should be able to claim it.
5334 auth_helper2.handle()->Reset();
5335 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5336 EXPECT_EQ(0, auth_helper1.auth_count());
5337 EXPECT_FALSE(auth_helper1.have_result());
5338 EXPECT_EQ(0, auth_helper3.auth_count());
5339 EXPECT_FALSE(auth_helper3.have_result());
5340 EXPECT_EQ(0, auth_helper4.auth_count());
5341}
5342
Matt Menkebf3c767d2019-04-15 23:28:245343TEST_F(ClientSocketPoolBaseTest, RefreshGroupCreatesNewConnectJobs) {
5344 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5345 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5346
5347 // First job will be waiting until it gets aborted.
5348 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5349
5350 ClientSocketHandle handle;
5351 TestCompletionCallback callback;
5352 EXPECT_THAT(
5353 handle.Init(kGroupId, params_, DEFAULT_PRIORITY, SocketTag(),
5354 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
5355 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5356 NetLogWithSource()),
5357 IsError(ERR_IO_PENDING));
5358
5359 // Switch connect job types, so creating a new ConnectJob will result in
5360 // success.
5361 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
5362
5363 pool_->RefreshGroupForTesting(kGroupId);
5364 EXPECT_EQ(OK, callback.WaitForResult());
5365 ASSERT_TRUE(handle.socket());
5366 EXPECT_EQ(0, pool_->IdleSocketCount());
5367 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5368 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(kGroupId));
5369 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5370 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5371}
5372
5373TEST_F(ClientSocketPoolBaseTest, RefreshGroupClosesIdleConnectJobs) {
5374 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5375 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5376
5377 pool_->RequestSockets(kGroupId, params_, 2, NetLogWithSource());
5378 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5379 EXPECT_EQ(2, pool_->IdleSocketCount());
5380 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kGroupId));
5381
5382 pool_->RefreshGroupForTesting(kGroupId);
5383 EXPECT_EQ(0, pool_->IdleSocketCount());
5384 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5385}
5386
5387TEST_F(ClientSocketPoolBaseTest,
5388 RefreshGroupDoesNotCloseIdleConnectJobsInOtherGroup) {
5389 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5390 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5391 const ClientSocketPool::GroupId kOtherGroupId = TestGroupId("b");
5392
5393 pool_->RequestSockets(kOtherGroupId, params_, 2, NetLogWithSource());
5394 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5395 EXPECT_EQ(2, pool_->IdleSocketCount());
5396 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5397
5398 pool_->RefreshGroupForTesting(kGroupId);
5399 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5400 EXPECT_EQ(2, pool_->IdleSocketCount());
5401 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5402}
5403
5404TEST_F(ClientSocketPoolBaseTest, RefreshGroupPreventsSocketReuse) {
5405 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5406 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5407
5408 ClientSocketHandle handle;
5409 TestCompletionCallback callback;
5410 EXPECT_THAT(
5411 handle.Init(kGroupId, params_, DEFAULT_PRIORITY, SocketTag(),
5412 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
5413 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5414 NetLogWithSource()),
5415 IsOk());
5416 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5417 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kGroupId));
5418
5419 pool_->RefreshGroupForTesting(kGroupId);
5420
5421 handle.Reset();
5422 EXPECT_EQ(0, pool_->IdleSocketCount());
5423 EXPECT_FALSE(pool_->HasGroupForTesting(kGroupId));
5424}
5425
5426TEST_F(ClientSocketPoolBaseTest,
5427 RefreshGroupDoesNotPreventSocketReuseInOtherGroup) {
5428 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
5429 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5430 const ClientSocketPool::GroupId kOtherGroupId = TestGroupId("b");
5431
5432 ClientSocketHandle handle;
5433 TestCompletionCallback callback;
5434 EXPECT_THAT(
5435 handle.Init(kOtherGroupId, params_, DEFAULT_PRIORITY, SocketTag(),
5436 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
5437 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
5438 NetLogWithSource()),
5439 IsOk());
5440 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5441 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(kOtherGroupId));
5442
5443 pool_->RefreshGroupForTesting(kGroupId);
5444
5445 handle.Reset();
5446 EXPECT_EQ(1, pool_->IdleSocketCount());
5447 ASSERT_TRUE(pool_->HasGroupForTesting(kOtherGroupId));
5448 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kOtherGroupId));
5449}
5450
5451TEST_F(ClientSocketPoolBaseTest, RefreshGroupReplacesBoundConnectJobOnConnect) {
5452 CreatePool(1, 1);
5453 const ClientSocketPool::GroupId kGroupId = TestGroupId("a");
5454 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5455
5456 TestAuthHelper auth_helper;
5457 auth_helper.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
5458 ClientSocketPool::RespectLimits::ENABLED, kGroupId);
5459 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(kGroupId));
5460
5461 auth_helper.WaitForAuth();
5462
5463 // This should update the generation, but not cancel the old ConnectJob - it's
5464 // not safe to do anything while waiting on the original ConnectJob.
5465 pool_->RefreshGroupForTesting(kGroupId);
5466
5467 // Providing auth credentials and restarting the request with them will cause
5468 // the ConnectJob to complete successfully, but the result will be discarded
5469 // because of the generation mismatch.
5470 auth_helper.RestartWithAuth();
5471
5472 // Despite using ConnectJobs that simulate a single challenge, a second
5473 // challenge will be seen, due to using a new ConnectJob.
5474 auth_helper.WaitForAuth();
5475 auth_helper.RestartWithAuth();
5476
5477 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5478 EXPECT_TRUE(auth_helper.handle()->socket());
5479 EXPECT_EQ(2, auth_helper.auth_count());
5480
5481 // When released, the socket will be returned to the socket pool, and
5482 // available for reuse.
5483 auth_helper.handle()->Reset();
5484 EXPECT_EQ(1, pool_->IdleSocketCount());
5485 ASSERT_TRUE(pool_->HasGroupForTesting(kGroupId));
5486 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(kGroupId));
5487}
5488
[email protected]f6d1d6eb2009-06-24 20:16:095489} // namespace
5490
5491} // namespace net