blob: fa128141de3ea649fd661fba4a5131acbb37ec2a [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"
[email protected]ac790b42009-12-02 04:31:3130#include "net/base/request_priority.h"
[email protected]f6d1d6eb2009-06-24 20:16:0931#include "net/base/test_completion_callback.h"
[email protected]277d5942010-08-11 21:02:3532#include "net/http/http_response_headers.h"
Matt Menke39b7c5a2019-04-10 19:47:5133#include "net/http/http_response_info.h"
eroman87c53d62015-04-02 06:51:0734#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0035#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1936#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0037#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5638#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4639#include "net/log/test_net_log_entry.h"
40#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0941#include "net/socket/client_socket_factory.h"
42#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2643#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2844#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5445#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1746#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4447#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1048#include "net/socket/stream_socket.h"
Matt Menke9fa17d52019-03-25 19:12:2649#include "net/socket/transport_connect_job.h"
Matt Menke39b7c5a2019-04-10 19:47:5150#include "net/ssl/ssl_cert_request_info.h"
robpercival214763f2016-07-01 23:27:0151#include "net/test/gtest_util.h"
Bence Béky98447b12018-05-08 03:14:0152#include "net/test/test_with_scoped_task_environment.h"
Ramin Halavati0a08cc82018-02-06 07:46:3853#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4854#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0955#include "testing/gtest/include/gtest/gtest.h"
56
robpercival214763f2016-07-01 23:27:0157using net::test::IsError;
58using net::test::IsOk;
59
[email protected]51fdc7c2012-04-10 19:19:4860using ::testing::Invoke;
61using ::testing::Return;
62
[email protected]f6d1d6eb2009-06-24 20:16:0963namespace net {
64
65namespace {
66
[email protected]211d21722009-07-22 15:48:5367const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2068const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5969constexpr base::TimeDelta kUnusedIdleSocketTimeout =
70 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0171
Matt Menkec6b3edf72019-03-19 17:00:3972ClientSocketPool::GroupId TestGroupId(const std::string& host,
73 int port = 80,
74 ClientSocketPool::SocketType socket_type =
75 ClientSocketPool::SocketType::kHttp,
76 bool privacy_mode = false) {
77 return ClientSocketPool::GroupId(HostPortPair(host, port), socket_type,
78 privacy_mode);
79}
80
Matt Menke84d11e562019-03-27 00:11:1981// Returns a ClientSocketPool::SocketParams that will never be used to
Matt Menke9fa17d52019-03-25 19:12:2682// create a real TreansportConnectJob.
Matt Menke84d11e562019-03-27 00:11:1983scoped_refptr<ClientSocketPool::SocketParams> CreateDummyParams() {
84 return ClientSocketPool::SocketParams::CreateFromTransportSocketParams(
85 base::MakeRefCounted<TransportSocketParams>(HostPortPair("ignored", 80),
86 OnHostResolutionCallback()));
Matt Menke9fa17d52019-03-25 19:12:2687}
88
[email protected]034df0f32013-01-07 23:17:4889// Make sure |handle| sets load times correctly when it has been assigned a
90// reused socket.
91void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
92 LoadTimingInfo load_timing_info;
93 // Only pass true in as |is_reused|, as in general, HttpStream types should
94 // have stricter concepts of reuse than socket pools.
95 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
96
97 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1998 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4899
[email protected]b258e0792013-01-12 07:11:59100 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
101 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48102}
103
104// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:33105// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:48106// of a connection where |is_reused| is false may consider the connection
107// reused.
108void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
109 EXPECT_FALSE(handle.is_reused());
110
111 LoadTimingInfo load_timing_info;
112 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
113
114 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19115 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48116
[email protected]b258e0792013-01-12 07:11:59117 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
118 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
119 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48120
121 TestLoadTimingInfoConnectedReused(handle);
122}
123
124// Make sure |handle| sets load times correctly, in the case that it does not
125// currently have a socket.
126void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
127 // Should only be set to true once a socket is assigned, if at all.
128 EXPECT_FALSE(handle.is_reused());
129
130 LoadTimingInfo load_timing_info;
131 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
132
133 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19134 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48135
[email protected]b258e0792013-01-12 07:11:59136 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
137 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48138}
139
[email protected]3268023f2011-05-05 00:08:10140class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09141 public:
[email protected]034df0f32013-01-07 23:17:48142 explicit MockClientSocket(net::NetLog* net_log)
143 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28144 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20145 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30146 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09147
[email protected]0dc88b32014-03-26 20:12:28148 // Sets whether the socket has unread data. If true, the next call to Read()
149 // will return 1 byte and IsConnectedAndIdle() will return false.
150 void set_has_unread_data(bool has_unread_data) {
151 has_unread_data_ = has_unread_data;
152 }
153
[email protected]3f55aa12011-12-07 02:03:33154 // Socket implementation.
dchengb03027d2014-10-21 12:00:20155 int Read(IOBuffer* /* buf */,
156 int len,
Brad Lassey3a814172018-04-26 03:30:21157 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28158 if (has_unread_data_ && len > 0) {
159 has_unread_data_ = false;
160 was_used_to_convey_data_ = true;
161 return 1;
162 }
[email protected]e86df8dc2013-03-30 13:18:28163 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33164 }
[email protected]ab838892009-06-30 18:49:05165
[email protected]a2b2cfc2017-12-06 09:06:08166 int Write(
167 IOBuffer* /* buf */,
168 int len,
Brad Lassey3a814172018-04-26 03:30:21169 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08170 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01171 was_used_to_convey_data_ = true;
172 return len;
[email protected]ab838892009-06-30 18:49:05173 }
Avi Drissman13fc8932015-12-20 04:40:46174 int SetReceiveBufferSize(int32_t size) override { return OK; }
175 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05176
[email protected]dbf036f2011-12-06 23:33:24177 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21178 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24179 connected_ = true;
180 return OK;
181 }
[email protected]f6d1d6eb2009-06-24 20:16:09182
dchengb03027d2014-10-21 12:00:20183 void Disconnect() override { connected_ = false; }
184 bool IsConnected() const override { return connected_; }
185 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28186 return connected_ && !has_unread_data_;
187 }
[email protected]0b7648c2009-07-06 20:14:01188
dchengb03027d2014-10-21 12:00:20189 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16190 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09191 }
[email protected]f6d1d6eb2009-06-24 20:16:09192
dchengb03027d2014-10-21 12:00:20193 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35194 return ERR_UNEXPECTED;
195 }
196
tfarina428341112016-09-22 13:38:20197 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02198
dchengb03027d2014-10-21 12:00:20199 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37200 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20201 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
202 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03203 void GetConnectionAttempts(ConnectionAttempts* out) const override {
204 out->clear();
205 }
206 void ClearConnectionAttempts() override {}
207 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49208 int64_t GetTotalReceivedBytes() const override {
209 NOTIMPLEMENTED();
210 return 0;
211 }
Paul Jensen0f49dec2017-12-12 23:39:58212 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45213
[email protected]f6d1d6eb2009-06-24 20:16:09214 private:
215 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28216 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20217 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01218 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09219
[email protected]ab838892009-06-30 18:49:05220 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09221};
222
[email protected]5fc08e32009-07-15 17:09:57223class TestConnectJob;
224
[email protected]f6d1d6eb2009-06-24 20:16:09225class MockClientSocketFactory : public ClientSocketFactory {
226 public:
[email protected]ab838892009-06-30 18:49:05227 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09228
danakj655b66c2016-04-16 00:51:38229 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04230 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41231 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19232 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41233 NOTREACHED();
danakj655b66c2016-04-16 00:51:38234 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41235 }
236
Helen Lid5bb9222018-04-12 15:33:09237 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07238 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38239 std::unique_ptr<
240 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07241 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19242 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09243 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09244 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09245 }
246
danakj655b66c2016-04-16 00:51:38247 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
Matt Menke841fc412019-03-05 23:20:12248 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27249 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21250 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13251 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09252 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38253 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09254 }
Matt Menkefd956922019-02-04 23:44:03255
Matt Menke52cd95a2019-02-08 06:16:27256 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
257 std::unique_ptr<StreamSocket> stream_socket,
258 const std::string& user_agent,
259 const HostPortPair& endpoint,
260 const ProxyServer& proxy_server,
261 HttpAuthController* http_auth_controller,
262 bool tunnel,
263 bool using_spdy,
264 NextProto negotiated_protocol,
265 ProxyDelegate* proxy_delegate,
266 bool is_https_proxy,
267 const NetworkTrafficAnnotationTag& traffic_annotation) override {
268 NOTIMPLEMENTED();
269 return nullptr;
270 }
271
[email protected]5fc08e32009-07-15 17:09:57272 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55273
[email protected]5fc08e32009-07-15 17:09:57274 void SignalJobs();
275
[email protected]03b7c8c2013-07-20 04:38:55276 void SignalJob(size_t job);
277
278 void SetJobLoadState(size_t job, LoadState load_state);
279
Matt Menke141b87f22019-01-30 02:43:03280 // Sets the HasConnectionEstablished value of the specified job to true,
281 // without invoking the callback.
282 void SetJobHasEstablishedConnection(size_t job);
283
[email protected]f6d1d6eb2009-06-24 20:16:09284 int allocation_count() const { return allocation_count_; }
285
[email protected]f6d1d6eb2009-06-24 20:16:09286 private:
287 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57288 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09289};
290
[email protected]ab838892009-06-30 18:49:05291class TestConnectJob : public ConnectJob {
292 public:
293 enum JobType {
294 kMockJob,
295 kMockFailingJob,
296 kMockPendingJob,
297 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57298 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10299
300 // Certificate errors return a socket in addition to an error code.
301 kMockCertErrorJob,
302 kMockPendingCertErrorJob,
303
[email protected]e60e47a2010-07-14 03:37:18304 kMockAdditionalErrorStateJob,
305 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28306 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10307
308 kMockAuthChallengeOnceJob,
309 kMockAuthChallengeTwiceJob,
310 kMockAuthChallengeOnceFailingJob,
311 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05312 };
313
[email protected]994d4932010-07-12 17:55:13314 // The kMockPendingJob uses a slight delay before allowing the connect
315 // to complete.
316 static const int kPendingConnectDelay = 2;
317
[email protected]ab838892009-06-30 18:49:05318 TestConnectJob(JobType job_type,
Matt Menke16f5c2e52019-03-25 21:50:40319 RequestPriority request_priority,
320 SocketTag socket_tag,
[email protected]974ebd62009-08-03 23:14:34321 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43322 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05323 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43324 MockClientSocketFactory* client_socket_factory)
Matt Menke16f5c2e52019-03-25 21:50:40325 : ConnectJob(request_priority,
326 socket_tag,
Matt Menke1a6c92d2019-02-23 00:25:38327 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43328 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38329 delegate,
330 nullptr /* net_log */,
331 NetLogSourceType::TRANSPORT_CONNECT_JOB,
332 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58333 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05334 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18335 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03336 has_established_connection_(false),
[email protected]d5492c52013-11-10 20:44:39337 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15338 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05339
[email protected]974ebd62009-08-03 23:14:34340 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13341 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34342 }
343
[email protected]03b7c8c2013-07-20 04:38:55344 void set_load_state(LoadState load_state) { load_state_ = load_state; }
345
Matt Menke141b87f22019-01-30 02:43:03346 void set_has_established_connection() {
347 DCHECK(!has_established_connection_);
348 has_established_connection_ = true;
349 }
350
[email protected]03b7c8c2013-07-20 04:38:55351 // From ConnectJob:
352
dchengb03027d2014-10-21 12:00:20353 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21354
Matt Menke141b87f22019-01-30 02:43:03355 bool HasEstablishedConnection() const override {
356 return has_established_connection_;
357 }
358
dchengb03027d2014-10-21 12:00:20359 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18360 if (store_additional_error_state_) {
361 // Set all of the additional error state fields in some way.
362 handle->set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51363 handle->set_ssl_cert_request_info(
364 base::MakeRefCounted<SSLCertRequestInfo>());
[email protected]e60e47a2010-07-14 03:37:18365 }
366 }
367
[email protected]974ebd62009-08-03 23:14:34368 private:
[email protected]03b7c8c2013-07-20 04:38:55369 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05370
dchengb03027d2014-10-21 12:00:20371 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05372 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35373 client_socket_factory_->CreateTransportClientSocket(
374 ignored, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05375 switch (job_type_) {
376 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13377 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10378 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05379 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13380 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10381 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05382 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57383 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47384
385 // Depending on execution timings, posting a delayed task can result
386 // in the task getting executed the at the earliest possible
387 // opportunity or only after returning once from the message loop and
388 // then a second call into the message loop. In order to make behavior
389 // more deterministic, we change the default delay to 2ms. This should
390 // always require us to wait for the second call into the message loop.
391 //
392 // N.B. The correct fix for this and similar timing problems is to
393 // abstract time for the purpose of unittests. Unfortunately, we have
394 // a lot of third-party components that directly call the various
395 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45396 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05397 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49398 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
399 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10400 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53401 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05402 return ERR_IO_PENDING;
403 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57404 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45405 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05406 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49407 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
408 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10409 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53410 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05411 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57412 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55413 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57414 client_socket_factory_->WaitForSignal(this);
415 waiting_success_ = true;
416 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10417 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13418 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10419 true /* cert_error */);
420 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13421 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45422 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13423 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49424 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
425 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10426 true /* async */, true /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53427 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13428 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18429 case kMockAdditionalErrorStateJob:
430 store_additional_error_state_ = true;
431 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10432 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18433 case kMockPendingAdditionalErrorStateJob:
434 set_load_state(LOAD_STATE_CONNECTING);
435 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45436 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18437 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49438 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
439 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10440 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53441 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18442 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28443 case kMockUnreadDataJob: {
444 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10445 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28446 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
447 return ret;
448 }
Matt Menkeb57663b32019-03-01 17:17:10449 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01450 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10451 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
452 return ERR_IO_PENDING;
453 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01454 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10455 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
456 return ERR_IO_PENDING;
457 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01458 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10459 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
460 return ERR_IO_PENDING;
461 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01462 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10463 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
464 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05465 default:
466 NOTREACHED();
danakj655b66c2016-04-16 00:51:38467 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05468 return ERR_FAILED;
469 }
470 }
471
Lily Chen02ef29a2018-11-30 16:31:43472 void ChangePriorityInternal(RequestPriority priority) override {}
473
Matt Menkeb57663b32019-03-01 17:17:10474 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13475 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03476 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05477 if (succeed) {
Matt Menkeb57663b32019-03-01 17:17:10478 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
Bence Békybdbb0e72018-08-07 21:42:59479 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10480 } else if (cert_error) {
481 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
482 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40483 } else {
[email protected]e772db3f2010-07-12 18:11:13484 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38485 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05486 }
[email protected]2ab05b52009-07-01 23:57:58487
488 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30489 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05490 return result;
491 }
492
Matt Menkeb57663b32019-03-01 17:17:10493 void DoAdvanceAuthChallenge(int remaining_challenges,
494 bool succeed_after_last_challenge) {
495 base::ThreadTaskRunnerHandle::Get()->PostTask(
496 FROM_HERE,
497 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
498 weak_factory_.GetWeakPtr(), remaining_challenges,
499 succeed_after_last_challenge));
500 }
501
502 void InvokeNextProxyAuthCallback(int remaining_challenges,
503 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01504 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10505 if (remaining_challenges == 0) {
506 DoConnect(succeed_after_last_challenge, true /* was_async */,
507 false /* cert_error */);
508 return;
509 }
510
511 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
512 // The auth tests here are just focused on ConnectJob bookkeeping.
513 HttpResponseInfo info;
514 NotifyDelegateOfProxyAuth(
515 info, nullptr /* http_auth_controller */,
516 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
517 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
518 succeed_after_last_challenge));
519 }
520
[email protected]5fc08e32009-07-15 17:09:57521 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05522 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57523 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21524 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03525 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18526 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05527
[email protected]d5492c52013-11-10 20:44:39528 base::WeakPtrFactory<TestConnectJob> weak_factory_;
529
[email protected]ab838892009-06-30 18:49:05530 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
531};
532
[email protected]d80a4322009-08-14 07:07:49533class TestConnectJobFactory
Matt Menke16f5c2e52019-03-25 21:50:40534 : public TransportClientSocketPool::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05535 public:
[email protected]034df0f32013-01-07 23:17:48536 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
537 NetLog* net_log)
Matt Menkea6f99ad2019-03-08 02:26:43538 : common_connect_job_params_(
539 nullptr /* client_socket_factory */,
540 nullptr /* host_resolver */,
Matt Menkeb88837e2019-03-20 11:50:40541 nullptr /* http_auth_cache */,
542 nullptr /* http_auth_handler_factory */,
543 nullptr /* spdy_session_pool */,
Matt Menkeb5fb42b2019-03-22 17:26:13544 nullptr /* quic_supported_versions */,
Matt Menkeb88837e2019-03-20 11:50:40545 nullptr /* quic_stream_factory */,
Matt Menkea6f99ad2019-03-08 02:26:43546 nullptr /* proxy_delegate */,
Matt Menked732ea42019-03-08 12:05:00547 nullptr /* http_user_agent_settings */,
Matt Menkea6f99ad2019-03-08 02:26:43548 SSLClientSocketContext(),
549 SSLClientSocketContext(),
550 nullptr /* socket_performance_watcher_factory */,
551 nullptr /* network_quality_estimator */,
552 net_log,
553 nullptr /* websocket_endpoint_lock_manager */),
554 job_type_(TestConnectJob::kMockJob),
Raul Tambre94493c652019-03-11 17:18:35555 job_types_(nullptr),
Matt Menkea6f99ad2019-03-08 02:26:43556 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05557
Chris Watkins7a41d3552017-12-01 02:13:27558 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05559
560 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
561
[email protected]51fdc7c2012-04-10 19:19:48562 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
563 job_types_ = job_types;
564 CHECK(!job_types_->empty());
565 }
566
[email protected]974ebd62009-08-03 23:14:34567 void set_timeout_duration(base::TimeDelta timeout_duration) {
568 timeout_duration_ = timeout_duration;
569 }
570
[email protected]3f55aa12011-12-07 02:03:33571 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55572
danakj655b66c2016-04-16 00:51:38573 std::unique_ptr<ConnectJob> NewConnectJob(
Matt Menke16f5c2e52019-03-25 21:50:40574 RequestPriority request_priority,
575 SocketTag socket_tag,
576 scoped_refptr<ClientSocketPool::SocketParams> socket_params,
mostynbba063d6032014-10-09 11:01:13577 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48578 EXPECT_TRUE(!job_types_ || !job_types_->empty());
579 TestConnectJob::JobType job_type = job_type_;
580 if (job_types_ && !job_types_->empty()) {
581 job_type = job_types_->front();
582 job_types_->pop_front();
583 }
Matt Menkea6f99ad2019-03-08 02:26:43584 return std::make_unique<TestConnectJob>(
Matt Menke16f5c2e52019-03-25 21:50:40585 job_type, request_priority, socket_tag, timeout_duration_,
586 &common_connect_job_params_, delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05587 }
588
589 private:
Matt Menkea6f99ad2019-03-08 02:26:43590 const CommonConnectJobParams common_connect_job_params_;
[email protected]ab838892009-06-30 18:49:05591 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48592 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34593 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57594 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05595
596 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
597};
598
[email protected]a937a06d2009-08-19 21:19:24599} // namespace
600
[email protected]a937a06d2009-08-19 21:19:24601namespace {
602
[email protected]5fc08e32009-07-15 17:09:57603void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26604 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57605 (*it)->Signal();
606 }
607 waiting_jobs_.clear();
608}
609
[email protected]03b7c8c2013-07-20 04:38:55610void MockClientSocketFactory::SignalJob(size_t job) {
611 ASSERT_LT(job, waiting_jobs_.size());
612 waiting_jobs_[job]->Signal();
613 waiting_jobs_.erase(waiting_jobs_.begin() + job);
614}
615
616void MockClientSocketFactory::SetJobLoadState(size_t job,
617 LoadState load_state) {
618 ASSERT_LT(job, waiting_jobs_.size());
619 waiting_jobs_[job]->set_load_state(load_state);
620}
621
Matt Menke141b87f22019-01-30 02:43:03622void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
623 ASSERT_LT(job, waiting_jobs_.size());
624 waiting_jobs_[job]->set_has_established_connection();
625}
626
Bence Béky98447b12018-05-08 03:14:01627class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09628 protected:
Alex Clarke0def2092018-12-10 12:01:45629 ClientSocketPoolBaseTest()
630 : TestWithScopedTaskEnvironment(
631 base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
Matt Menke9fa17d52019-03-25 19:12:26632 params_(CreateDummyParams()) {
[email protected]636b8252011-04-08 19:56:54633 connect_backup_jobs_enabled_ =
Matt Menke16f5c2e52019-03-25 21:50:40634 TransportClientSocketPool::connect_backup_jobs_enabled();
635 TransportClientSocketPool::set_connect_backup_jobs_enabled(true);
[email protected]636b8252011-04-08 19:56:54636 }
[email protected]2431756e2010-09-29 20:26:13637
dcheng67be2b1f2014-10-27 21:47:29638 ~ClientSocketPoolBaseTest() override {
Matt Menke16f5c2e52019-03-25 21:50:40639 TransportClientSocketPool::set_connect_backup_jobs_enabled(
[email protected]636b8252011-04-08 19:56:54640 connect_backup_jobs_enabled_);
641 }
[email protected]c9d6a1d2009-07-14 16:15:20642
Matt Menke9fa17d52019-03-25 19:12:26643 void CreatePool(int max_sockets,
644 int max_sockets_per_group,
645 bool enable_backup_connect_jobs = false) {
Tarun Bansala7635092019-02-20 10:00:59646 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
647 kUnusedIdleSocketTimeout,
Matt Menke9fa17d52019-03-25 19:12:26648 ClientSocketPool::used_idle_socket_timeout(),
649 enable_backup_connect_jobs);
[email protected]9bf28db2009-08-29 01:35:16650 }
651
Matt Menke9fa17d52019-03-25 19:12:26652 void CreatePoolWithIdleTimeouts(int max_sockets,
653 int max_sockets_per_group,
654 base::TimeDelta unused_idle_socket_timeout,
655 base::TimeDelta used_idle_socket_timeout,
656 bool enable_backup_connect_jobs = false) {
[email protected]c9d6a1d2009-07-14 16:15:20657 DCHECK(!pool_.get());
Matt Menke9fa17d52019-03-25 19:12:26658 std::unique_ptr<TestConnectJobFactory> connect_job_factory =
659 std::make_unique<TestConnectJobFactory>(&client_socket_factory_,
660 &net_log_);
661 connect_job_factory_ = connect_job_factory.get();
662 pool_ = TransportClientSocketPool::CreateForTesting(
663 max_sockets, max_sockets_per_group, unused_idle_socket_timeout,
664 used_idle_socket_timeout, std::move(connect_job_factory),
665 nullptr /* ssl_config_service */, enable_backup_connect_jobs);
[email protected]c9d6a1d2009-07-14 16:15:20666 }
[email protected]f6d1d6eb2009-06-24 20:16:09667
mmenked3641e12016-01-28 16:06:15668 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39669 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33670 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15671 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39672 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15673 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33674 }
675
Matt Menkec6b3edf72019-03-19 17:00:39676 int StartRequest(const ClientSocketPool::GroupId& group_id,
677 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15678 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39679 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09680 }
681
[email protected]2431756e2010-09-29 20:26:13682 int GetOrderOfRequest(size_t index) const {
683 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09684 }
685
[email protected]2431756e2010-09-29 20:26:13686 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
687 return test_base_.ReleaseOneConnection(keep_alive);
688 }
689
690 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
691 test_base_.ReleaseAllConnections(keep_alive);
692 }
693
694 TestSocketRequest* request(int i) { return test_base_.request(i); }
695 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38696 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42697 return test_base_.requests();
698 }
rdsmith29dbad12017-02-17 02:22:18699 // Only counts the requests that get sockets asynchronously;
700 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13701 size_t completion_count() const { return test_base_.completion_count(); }
702
vishal.b62985ca92015-04-17 08:45:51703 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54704 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09705 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04706 TestConnectJobFactory* connect_job_factory_;
Matt Menke9fa17d52019-03-25 19:12:26707 // These parameters are never actually used to create a TransportConnectJob.
Matt Menke84d11e562019-03-27 00:11:19708 scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:26709 std::unique_ptr<TransportClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13710 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09711};
712
[email protected]5fc08e32009-07-15 17:09:57713TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53714 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20715
[email protected]6ecf2b92011-12-15 01:14:52716 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06717 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51718 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48719 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53720
Matt Menkec6b3edf72019-03-19 17:00:39721 EXPECT_EQ(
722 OK, handle.Init(
723 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
724 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
725 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09726 EXPECT_TRUE(handle.is_initialized());
727 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48728 TestLoadTimingInfoConnectedNotReused(handle);
729
[email protected]f6d1d6eb2009-06-24 20:16:09730 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48731 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30732
mmenke43758e62015-05-04 21:09:46733 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40734 log.GetEntries(&entries);
735
Matt Menke9fa17d52019-03-25 19:12:26736 EXPECT_EQ(5u, entries.size());
[email protected]9e743cd2010-03-16 07:03:53737 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26738 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00739 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26740 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
741 EXPECT_TRUE(LogContainsEvent(
742 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
743 NetLogEventPhase::NONE));
744 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:00745 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
746 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26747 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09748}
749
[email protected]ab838892009-06-30 18:49:05750TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53751 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20752
[email protected]ab838892009-06-30 18:49:05753 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51754 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53755
[email protected]2431756e2010-09-29 20:26:13756 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52757 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18758 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13759 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:51760 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:50761 EXPECT_EQ(
762 ERR_CONNECTION_FAILED,
Matt Menkec6b3edf72019-03-19 17:00:39763 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:50764 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
765 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
766 log.bound()));
[email protected]2431756e2010-09-29 20:26:13767 EXPECT_FALSE(handle.socket());
768 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:51769 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]034df0f32013-01-07 23:17:48770 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30771
mmenke43758e62015-05-04 21:09:46772 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40773 log.GetEntries(&entries);
774
Matt Menke9fa17d52019-03-25 19:12:26775 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:17776 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:26777 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:00778 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:26779 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
780 EXPECT_TRUE(LogContainsEvent(
781 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
782 NetLogEventPhase::NONE));
783 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09784}
785
Matt Menkef6edce752019-03-19 17:21:56786// Make sure different groups do not share sockets.
787TEST_F(ClientSocketPoolBaseTest, GroupSeparation) {
788 CreatePool(1000 /* max_sockets */, 2 /* max_sockets_per_group */);
789
790 const HostPortPair kHostPortPairs[] = {
791 {"a", 80},
792 {"a", 443},
793 {"b", 80},
794 };
795
796 const ClientSocketPool::SocketType kSocketTypes[] = {
797 ClientSocketPool::SocketType::kHttp,
798 ClientSocketPool::SocketType::kSsl,
799 ClientSocketPool::SocketType::kSslVersionInterferenceProbe,
800 ClientSocketPool::SocketType::kFtp,
801 };
802
803 const bool kPrivacyModes[] = {false, true};
804
805 int total_idle_sockets = 0;
806
807 // Walk through each GroupId, making sure that requesting a socket for one
808 // group does not return a previously connected socket for another group.
809 for (const auto& host_port_pair : kHostPortPairs) {
810 SCOPED_TRACE(host_port_pair.ToString());
811 for (const auto& socket_type : kSocketTypes) {
812 SCOPED_TRACE(static_cast<int>(socket_type));
813 for (const auto& privacy_mode : kPrivacyModes) {
814 SCOPED_TRACE(privacy_mode);
815
816 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
817
818 ClientSocketPool::GroupId group_id(host_port_pair, socket_type,
819 privacy_mode);
820
Matt Menke9fa17d52019-03-25 19:12:26821 EXPECT_FALSE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56822
823 TestCompletionCallback callback;
824 ClientSocketHandle handle;
825
826 // Since the group is empty, requesting a socket should not complete
827 // synchronously.
828 EXPECT_THAT(
829 handle.Init(group_id, params_, DEFAULT_PRIORITY, SocketTag(),
830 ClientSocketPool::RespectLimits::ENABLED,
831 callback.callback(),
832 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
833 NetLogWithSource()),
834 IsError(ERR_IO_PENDING));
Matt Menke9fa17d52019-03-25 19:12:26835 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56836 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
837
838 EXPECT_THAT(callback.WaitForResult(), IsOk());
839 EXPECT_TRUE(handle.socket());
Matt Menke9fa17d52019-03-25 19:12:26840 EXPECT_TRUE(pool_->HasGroupForTesting(group_id));
Matt Menkef6edce752019-03-19 17:21:56841 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
842
843 // Return socket to pool.
844 handle.Reset();
845 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
846
847 // Requesting a socket again should return the same socket as before, so
848 // should complete synchronously.
849 EXPECT_THAT(
850 handle.Init(group_id, params_, DEFAULT_PRIORITY, SocketTag(),
851 ClientSocketPool::RespectLimits::ENABLED,
852 callback.callback(),
853 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
854 NetLogWithSource()),
855 IsOk());
856 EXPECT_TRUE(handle.socket());
857 EXPECT_EQ(total_idle_sockets, pool_->IdleSocketCount());
858
859 // Return socket to pool again.
860 handle.Reset();
861 EXPECT_EQ(total_idle_sockets + 1, pool_->IdleSocketCount());
862
863 ++total_idle_sockets;
864 }
865 }
866 }
867}
868
[email protected]211d21722009-07-22 15:48:53869TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
870 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
871
[email protected]9e743cd2010-03-16 07:03:53872 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30873
Matt Menkec6b3edf72019-03-19 17:00:39874 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
875 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
876 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
877 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53878
[email protected]2431756e2010-09-29 20:26:13879 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53880 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13881 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53882
Matt Menkec6b3edf72019-03-19 17:00:39883 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
884 IsError(ERR_IO_PENDING));
885 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
886 IsError(ERR_IO_PENDING));
887 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
888 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53889
[email protected]2431756e2010-09-29 20:26:13890 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53891
[email protected]2431756e2010-09-29 20:26:13892 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53893 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13894 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53895
896 EXPECT_EQ(1, GetOrderOfRequest(1));
897 EXPECT_EQ(2, GetOrderOfRequest(2));
898 EXPECT_EQ(3, GetOrderOfRequest(3));
899 EXPECT_EQ(4, GetOrderOfRequest(4));
900 EXPECT_EQ(5, GetOrderOfRequest(5));
901 EXPECT_EQ(6, GetOrderOfRequest(6));
902 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17903
904 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13905 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53906}
907
908TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
909 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
910
[email protected]9e743cd2010-03-16 07:03:53911 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30912
[email protected]211d21722009-07-22 15:48:53913 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39914 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
915 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
916 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
917 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53918
[email protected]2431756e2010-09-29 20:26:13919 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53920 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13921 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53922
923 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:39924 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
925 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53926
[email protected]2431756e2010-09-29 20:26:13927 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53928
[email protected]2431756e2010-09-29 20:26:13929 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53930 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13931 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53932
933 EXPECT_EQ(1, GetOrderOfRequest(1));
934 EXPECT_EQ(2, GetOrderOfRequest(2));
935 EXPECT_EQ(3, GetOrderOfRequest(3));
936 EXPECT_EQ(4, GetOrderOfRequest(4));
937 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17938
939 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13940 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53941}
942
943TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
944 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
945
Matt Menkec6b3edf72019-03-19 17:00:39946 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
947 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
948 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
949 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53950
[email protected]2431756e2010-09-29 20:26:13951 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53952 client_socket_factory_.allocation_count());
953
Matt Menkec6b3edf72019-03-19 17:00:39954 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
955 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
956 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53957
[email protected]2431756e2010-09-29 20:26:13958 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53959
[email protected]2431756e2010-09-29 20:26:13960 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53961
962 // First 4 requests don't have to wait, and finish in order.
963 EXPECT_EQ(1, GetOrderOfRequest(1));
964 EXPECT_EQ(2, GetOrderOfRequest(2));
965 EXPECT_EQ(3, GetOrderOfRequest(3));
966 EXPECT_EQ(4, GetOrderOfRequest(4));
967
Matt Menkec6b3edf72019-03-19 17:00:39968 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
969 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53970 EXPECT_EQ(7, GetOrderOfRequest(5));
971 EXPECT_EQ(6, GetOrderOfRequest(6));
972 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17973
974 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13975 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53976}
977
rdsmith29dbad12017-02-17 02:22:18978// Test reprioritizing a request before completion doesn't interfere with
979// its completion.
980TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
981 CreatePool(kDefaultMaxSockets, 1);
982
Matt Menkec6b3edf72019-03-19 17:00:39983 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
984 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:18985 EXPECT_TRUE(request(0)->handle()->socket());
986 EXPECT_FALSE(request(1)->handle()->socket());
987
Lily Chenecebf932018-11-02 17:15:43988 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:18989
990 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
991
992 EXPECT_TRUE(request(1)->handle()->socket());
993}
994
995// Reprioritize a request up past another one and make sure that changes the
996// completion order.
997TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
998 CreatePool(kDefaultMaxSockets, 1);
999
Matt Menkec6b3edf72019-03-19 17:00:391000 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1001 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1002 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181003 EXPECT_TRUE(request(0)->handle()->socket());
1004 EXPECT_FALSE(request(1)->handle()->socket());
1005 EXPECT_FALSE(request(2)->handle()->socket());
1006
1007 request(2)->handle()->SetPriority(HIGHEST);
1008
1009 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1010
1011 EXPECT_EQ(1, GetOrderOfRequest(1));
1012 EXPECT_EQ(3, GetOrderOfRequest(2));
1013 EXPECT_EQ(2, GetOrderOfRequest(3));
1014}
1015
1016// Reprioritize a request without changing relative priorities and check
1017// that the order doesn't change.
1018TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1019 CreatePool(kDefaultMaxSockets, 1);
1020
Matt Menkec6b3edf72019-03-19 17:00:391021 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1022 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1023 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181024 EXPECT_TRUE(request(0)->handle()->socket());
1025 EXPECT_FALSE(request(1)->handle()->socket());
1026 EXPECT_FALSE(request(2)->handle()->socket());
1027
1028 request(2)->handle()->SetPriority(MEDIUM);
1029
1030 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1031
1032 EXPECT_EQ(1, GetOrderOfRequest(1));
1033 EXPECT_EQ(2, GetOrderOfRequest(2));
1034 EXPECT_EQ(3, GetOrderOfRequest(3));
1035}
1036
1037// Reprioritize a request past down another one and make sure that changes the
1038// completion order.
1039TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1040 CreatePool(kDefaultMaxSockets, 1);
1041
Matt Menkec6b3edf72019-03-19 17:00:391042 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1043 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1044 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181045 EXPECT_TRUE(request(0)->handle()->socket());
1046 EXPECT_FALSE(request(1)->handle()->socket());
1047 EXPECT_FALSE(request(2)->handle()->socket());
1048
1049 request(1)->handle()->SetPriority(LOW);
1050
1051 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1052
1053 EXPECT_EQ(1, GetOrderOfRequest(1));
1054 EXPECT_EQ(3, GetOrderOfRequest(2));
1055 EXPECT_EQ(2, GetOrderOfRequest(3));
1056}
1057
1058// Reprioritize a request to the same level as another and confirm it is
1059// put after the old request.
1060TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1061 CreatePool(kDefaultMaxSockets, 1);
1062
Matt Menkec6b3edf72019-03-19 17:00:391063 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1064 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1065 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181066 EXPECT_TRUE(request(0)->handle()->socket());
1067 EXPECT_FALSE(request(1)->handle()->socket());
1068 EXPECT_FALSE(request(2)->handle()->socket());
1069
1070 request(1)->handle()->SetPriority(MEDIUM);
1071
1072 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1073
1074 EXPECT_EQ(1, GetOrderOfRequest(1));
1075 EXPECT_EQ(3, GetOrderOfRequest(2));
1076 EXPECT_EQ(2, GetOrderOfRequest(3));
1077}
1078
[email protected]211d21722009-07-22 15:48:531079TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1080 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1081
Matt Menkec6b3edf72019-03-19 17:00:391082 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1083 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1084 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1085 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531086
[email protected]2431756e2010-09-29 20:26:131087 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531088 client_socket_factory_.allocation_count());
1089
Matt Menkec6b3edf72019-03-19 17:00:391090 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1091 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1092 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531093
[email protected]2431756e2010-09-29 20:26:131094 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531095
[email protected]2431756e2010-09-29 20:26:131096 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531097 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131098 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531099
1100 // First 4 requests don't have to wait, and finish in order.
1101 EXPECT_EQ(1, GetOrderOfRequest(1));
1102 EXPECT_EQ(2, GetOrderOfRequest(2));
1103 EXPECT_EQ(3, GetOrderOfRequest(3));
1104 EXPECT_EQ(4, GetOrderOfRequest(4));
1105
1106 // Request ("b", 7) has the highest priority, but we can't make new socket for
1107 // group "b", because it has reached the per-group limit. Then we make
1108 // socket for ("c", 6), because it has higher priority than ("a", 4),
1109 // and we still can't make a socket for group "b".
1110 EXPECT_EQ(5, GetOrderOfRequest(5));
1111 EXPECT_EQ(6, GetOrderOfRequest(6));
1112 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171113
1114 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131115 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531116}
1117
1118// Make sure that we count connecting sockets against the total limit.
1119TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1120 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1121
Matt Menkec6b3edf72019-03-19 17:00:391122 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1123 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1124 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531125
1126 // Create one asynchronous request.
1127 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391128 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1129 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531130
[email protected]6b175382009-10-13 06:47:471131 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1132 // actually become pending until 2ms after they have been created. In order
1133 // to flush all tasks, we need to wait so that we know there are no
1134 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451135 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471136
[email protected]211d21722009-07-22 15:48:531137 // The next synchronous request should wait for its turn.
1138 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391139 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1140 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531141
[email protected]2431756e2010-09-29 20:26:131142 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531143
[email protected]2431756e2010-09-29 20:26:131144 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531145 client_socket_factory_.allocation_count());
1146
1147 EXPECT_EQ(1, GetOrderOfRequest(1));
1148 EXPECT_EQ(2, GetOrderOfRequest(2));
1149 EXPECT_EQ(3, GetOrderOfRequest(3));
1150 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171151 EXPECT_EQ(5, GetOrderOfRequest(5));
1152
1153 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131154 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531155}
1156
[email protected]6427fe22010-04-16 22:27:411157TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1158 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1159 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1160
Matt Menkec6b3edf72019-03-19 17:00:391161 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1162 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1163 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1164 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411165
1166 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1167
1168 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1169
Matt Menkec6b3edf72019-03-19 17:00:391170 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1171 IsError(ERR_IO_PENDING));
1172 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1173 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411174
1175 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1176
[email protected]2431756e2010-09-29 20:26:131177 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411178 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131179 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411180 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131181 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1182 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411183 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1184}
1185
[email protected]d7027bb2010-05-10 18:58:541186TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1187 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1188 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1189
1190 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521191 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501192 EXPECT_EQ(
1193 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391194 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501195 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1196 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1197 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541198
1199 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241200 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521201 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501202 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391203 handles[i].Init(
1204 TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
1205 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1206 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1207 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541208 }
1209
1210 // One will be stalled, cancel all the handles now.
1211 // This should hit the OnAvailableSocketSlot() code where we previously had
1212 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241213 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541214 handles[i].Reset();
1215}
1216
[email protected]eb5a99382010-07-11 03:18:261217TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541218 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1219 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1220
[email protected]eb5a99382010-07-11 03:18:261221 {
1222 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521223 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261224 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:391225 EXPECT_EQ(OK, handles[i].Init(TestGroupId(base::NumberToString(i)),
1226 params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541227 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501228 callbacks[i].callback(),
1229 ClientSocketPool::ProxyAuthCallback(),
1230 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261231 }
1232
1233 // Force a stalled group.
1234 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521235 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201236 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391237 stalled_handle.Init(
1238 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1239 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1240 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1241 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261242
1243 // Cancel the stalled request.
1244 stalled_handle.Reset();
1245
1246 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1247 EXPECT_EQ(0, pool_->IdleSocketCount());
1248
1249 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541250 }
1251
[email protected]43a21b82010-06-10 21:30:541252 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1253 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261254}
[email protected]43a21b82010-06-10 21:30:541255
[email protected]eb5a99382010-07-11 03:18:261256TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1257 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1258 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1259
1260 {
1261 ClientSocketHandle handles[kDefaultMaxSockets];
1262 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521263 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201264 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391265 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
1266 DEFAULT_PRIORITY, SocketTag(),
1267 ClientSocketPool::RespectLimits::ENABLED,
1268 callback.callback(),
1269 ClientSocketPool::ProxyAuthCallback(),
1270 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261271 }
1272
1273 // Force a stalled group.
1274 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1275 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521276 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201277 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391278 stalled_handle.Init(
1279 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1280 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1281 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1282 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261283
1284 // Since it is stalled, it should have no connect jobs.
Matt Menke9fa17d52019-03-25 19:12:261285 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1286 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1287 TestGroupId("foo")));
1288 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1289 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261290
1291 // Cancel the stalled request.
1292 handles[0].Reset();
1293
[email protected]eb5a99382010-07-11 03:18:261294 // Now we should have a connect job.
Matt Menke9fa17d52019-03-25 19:12:261295 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1296 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1297 TestGroupId("foo")));
1298 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1299 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261300
1301 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011302 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261303
1304 EXPECT_EQ(kDefaultMaxSockets + 1,
1305 client_socket_factory_.allocation_count());
1306 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:261307 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("foo")));
1308 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
1309 TestGroupId("foo")));
1310 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroupForTesting(
1311 TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261312
1313 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541314 }
1315
[email protected]eb5a99382010-07-11 03:18:261316 EXPECT_EQ(1, pool_->IdleSocketCount());
1317}
[email protected]43a21b82010-06-10 21:30:541318
[email protected]eb5a99382010-07-11 03:18:261319TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1320 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1321 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541322
[email protected]eb5a99382010-07-11 03:18:261323 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521324 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261325 {
[email protected]51fdc7c2012-04-10 19:19:481326 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261327 ClientSocketHandle handles[kDefaultMaxSockets];
1328 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521329 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391330 EXPECT_EQ(
1331 OK, handles[i].Init(TestGroupId(base::StringPrintf("Take 2: %d", i)),
1332 params_, DEFAULT_PRIORITY, SocketTag(),
1333 ClientSocketPool::RespectLimits::ENABLED,
1334 callback.callback(),
1335 ClientSocketPool::ProxyAuthCallback(),
1336 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261337 }
1338
1339 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1340 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481341 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261342
1343 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201344 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391345 stalled_handle.Init(
1346 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1347 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1348 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1349 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481350 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261351
1352 // Dropping out of scope will close all handles and return them to idle.
1353 }
[email protected]43a21b82010-06-10 21:30:541354
1355 // But if we wait for it, the released idle sockets will be closed in
1356 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011357 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261358
1359 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1360 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541361}
1362
1363// Regression test for http://crbug.com/40952.
1364TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
Matt Menke9fa17d52019-03-25 19:12:261365 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
1366 true /* enable_backup_connect_jobs */);
[email protected]43a21b82010-06-10 21:30:541367 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1368
1369 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1370 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521371 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391372 EXPECT_EQ(OK, handle.Init(TestGroupId(base::NumberToString(i)), params_,
1373 DEFAULT_PRIORITY, SocketTag(),
1374 ClientSocketPool::RespectLimits::ENABLED,
1375 callback.callback(),
1376 ClientSocketPool::ProxyAuthCallback(),
1377 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541378 }
1379
1380 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281381 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541382
1383 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1384 // reuse a socket.
1385 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1386 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521387 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541388
1389 // "0" is special here, since it should be the first entry in the sorted map,
1390 // which is the one which we would close an idle socket for. We shouldn't
1391 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391392 EXPECT_EQ(OK, handle.Init(
1393 TestGroupId("0"), params_, DEFAULT_PRIORITY, SocketTag(),
1394 ClientSocketPool::RespectLimits::ENABLED,
1395 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1396 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541397
1398 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1399 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1400}
1401
[email protected]ab838892009-06-30 18:49:051402TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531403 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091404
Matt Menkec6b3edf72019-03-19 17:00:391405 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1406 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1407 EXPECT_THAT(StartRequest(TestGroupId("a"), IDLE), IsError(ERR_IO_PENDING));
1408 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1409 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1410 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1411 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1412 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091413
[email protected]2431756e2010-09-29 20:26:131414 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201415 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1416 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131417 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1418 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091419
[email protected]c9d6a1d2009-07-14 16:15:201420 EXPECT_EQ(1, GetOrderOfRequest(1));
1421 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031422 EXPECT_EQ(8, GetOrderOfRequest(3));
1423 EXPECT_EQ(6, GetOrderOfRequest(4));
1424 EXPECT_EQ(4, GetOrderOfRequest(5));
1425 EXPECT_EQ(3, GetOrderOfRequest(6));
1426 EXPECT_EQ(5, GetOrderOfRequest(7));
1427 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171428
1429 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131430 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091431}
1432
[email protected]ab838892009-06-30 18:49:051433TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531434 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091435
Matt Menkec6b3edf72019-03-19 17:00:391436 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1437 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1438 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1439 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1440 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1441 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1442 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091443
[email protected]2431756e2010-09-29 20:26:131444 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091445
[email protected]2431756e2010-09-29 20:26:131446 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011447 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201448
[email protected]2431756e2010-09-29 20:26:131449 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201450 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131451 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1452 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091453}
1454
1455// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051456// The pending connect job will be cancelled and should not call back into
1457// ClientSocketPoolBase.
1458TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531459 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201460
[email protected]ab838892009-06-30 18:49:051461 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131462 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521463 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501464 EXPECT_EQ(
1465 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391466 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501467 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1468 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1469 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131470 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091471}
1472
[email protected]ab838892009-06-30 18:49:051473TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531474 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201475
[email protected]ab838892009-06-30 18:49:051476 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061477 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521478 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091479
Matt Menke28ac03e2019-02-25 22:25:501480 EXPECT_EQ(
1481 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391482 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501483 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1484 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1485 NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091486
1487 handle.Reset();
1488
[email protected]6ecf2b92011-12-15 01:14:521489 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501490 EXPECT_EQ(
1491 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391492 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501493 ClientSocketPool::RespectLimits::ENABLED,
1494 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1495 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091496
robpercival214763f2016-07-01 23:27:011497 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091498 EXPECT_FALSE(callback.have_result());
1499
1500 handle.Reset();
1501}
1502
[email protected]ab838892009-06-30 18:49:051503TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531504 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091505
Matt Menkec6b3edf72019-03-19 17:00:391506 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1507 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1508 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1509 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1510 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1511 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1512 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091513
1514 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201515 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131516 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1517 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091518
[email protected]2431756e2010-09-29 20:26:131519 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091520
[email protected]c9d6a1d2009-07-14 16:15:201521 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1522 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131523 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1524 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091525
[email protected]c9d6a1d2009-07-14 16:15:201526 EXPECT_EQ(1, GetOrderOfRequest(1));
1527 EXPECT_EQ(2, GetOrderOfRequest(2));
1528 EXPECT_EQ(5, GetOrderOfRequest(3));
1529 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131530 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1531 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201532 EXPECT_EQ(4, GetOrderOfRequest(6));
1533 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171534
1535 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131536 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091537}
1538
mmenke33d24423d2015-05-19 19:41:091539// Function to be used as a callback on socket request completion. It first
1540// disconnects the successfully connected socket from the first request, and
1541// then reuses the ClientSocketHandle to request another socket.
1542//
1543// |nested_callback| is called with the result of the second socket request.
1544void RequestSocketOnComplete(ClientSocketHandle* handle,
Matt Menke9fa17d52019-03-25 19:12:261545 TransportClientSocketPool* pool,
mmenke33d24423d2015-05-19 19:41:091546 TestConnectJobFactory* test_connect_job_factory,
1547 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411548 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091549 int first_request_result) {
robpercival214763f2016-07-01 23:27:011550 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091551
1552 test_connect_job_factory->set_job_type(next_job_type);
1553
1554 // Don't allow reuse of the socket. Disconnect it and then release it.
1555 if (handle->socket())
1556 handle->socket()->Disconnect();
1557 handle->Reset();
1558
mmenke33d24423d2015-05-19 19:41:091559 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501560 int rv = handle->Init(
Matt Menke9fa17d52019-03-25 19:12:261561 TestGroupId("a"), CreateDummyParams(), LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501562 ClientSocketPool::RespectLimits::ENABLED, nested_callback->callback(),
1563 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091564 if (rv != ERR_IO_PENDING) {
1565 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411566 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091567 } else {
1568 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521569 }
mmenke33d24423d2015-05-19 19:41:091570}
[email protected]f6d1d6eb2009-06-24 20:16:091571
mmenke33d24423d2015-05-19 19:41:091572// Tests the case where a second socket is requested in a completion callback,
1573// and the second socket connects asynchronously. Reuses the same
1574// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581575TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531576 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201577
[email protected]0b7648c2009-07-06 20:14:011578 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061579 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091580 TestCompletionCallback second_result_callback;
1581 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391582 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541583 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501584 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1585 connect_job_factory_, TestConnectJob::kMockPendingJob,
1586 &second_result_callback),
1587 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011588 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091589
robpercival214763f2016-07-01 23:27:011590 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581591}
[email protected]f6d1d6eb2009-06-24 20:16:091592
mmenke33d24423d2015-05-19 19:41:091593// Tests the case where a second socket is requested in a completion callback,
1594// and the second socket connects synchronously. Reuses the same
1595// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581596TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531597 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201598
[email protected]0b7648c2009-07-06 20:14:011599 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061600 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091601 TestCompletionCallback second_result_callback;
1602 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391603 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541604 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501605 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1606 connect_job_factory_, TestConnectJob::kMockPendingJob,
1607 &second_result_callback),
1608 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011609 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581610
robpercival214763f2016-07-01 23:27:011611 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091612}
1613
1614// Make sure that pending requests get serviced after active requests get
1615// cancelled.
[email protected]ab838892009-06-30 18:49:051616TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531617 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201618
[email protected]0b7648c2009-07-06 20:14:011619 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091620
Matt Menkec6b3edf72019-03-19 17:00:391621 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1622 IsError(ERR_IO_PENDING));
1623 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1624 IsError(ERR_IO_PENDING));
1625 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1626 IsError(ERR_IO_PENDING));
1627 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1628 IsError(ERR_IO_PENDING));
1629 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1630 IsError(ERR_IO_PENDING));
1631 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1632 IsError(ERR_IO_PENDING));
1633 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1634 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091635
[email protected]c9d6a1d2009-07-14 16:15:201636 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1637 // Let's cancel them.
1638 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131639 ASSERT_FALSE(request(i)->handle()->is_initialized());
1640 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091641 }
1642
[email protected]f6d1d6eb2009-06-24 20:16:091643 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131644 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011645 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131646 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091647 }
1648
[email protected]2431756e2010-09-29 20:26:131649 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1650 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091651}
1652
1653// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051654TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531655 const size_t kMaxSockets = 5;
1656 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201657
[email protected]0b7648c2009-07-06 20:14:011658 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091659
[email protected]211d21722009-07-22 15:48:531660 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1661 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091662
1663 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531664 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391665 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1666 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091667
[email protected]211d21722009-07-22 15:48:531668 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011669 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091670}
1671
mmenke9d72fe42017-05-18 22:36:071672// Make sure that pending requests that complete synchronously get serviced
1673// after active requests fail. See https://crbug.com/723748
1674TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1675 const size_t kNumberOfRequests = 10;
1676 const size_t kMaxSockets = 1;
1677 CreatePool(kMaxSockets, kMaxSockets);
1678
1679 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1680
Matt Menkec6b3edf72019-03-19 17:00:391681 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1682 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071683
1684 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1685
1686 // Queue up all the other requests
1687 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391688 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1689 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071690
1691 // Make sure all requests fail, instead of hanging.
1692 for (size_t i = 0; i < kNumberOfRequests; ++i)
1693 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1694}
1695
[email protected]5fc08e32009-07-15 17:09:571696TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531697 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571698
1699 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1700
[email protected]2431756e2010-09-29 20:26:131701 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521702 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501703 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391704 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501705 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1706 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011707 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571708
1709 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131710 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571711
Matt Menkec6b3edf72019-03-19 17:00:391712 rv = handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151713 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501714 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1715 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011716 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1717 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571718
[email protected]2431756e2010-09-29 20:26:131719 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481720 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571721 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1722}
1723
xunjieli26619e72016-11-23 19:39:551724TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551725 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1726 ClientSocketHandle handle;
1727 TestCompletionCallback callback;
1728 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501729 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391730 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501731 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1732 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551733 EXPECT_THAT(rv, IsOk());
1734 handle.Reset();
1735 EXPECT_EQ(1, pool_->IdleSocketCount());
1736 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551737}
1738
xunjieli92feb332017-03-03 17:19:231739TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231740 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1741 TestCompletionCallback callback;
1742 BoundTestNetLog log;
1743 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501744 int rv = handle1.Init(
Matt Menkec6b3edf72019-03-19 17:00:391745 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501746 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1747 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231748 EXPECT_THAT(rv, IsOk());
1749 ClientSocketHandle handle2;
Matt Menkec6b3edf72019-03-19 17:00:391750 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231751 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501752 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1753 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231754 ClientSocketHandle handle3;
Matt Menkec6b3edf72019-03-19 17:00:391755 rv = handle3.Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231756 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501757 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1758 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231759 EXPECT_THAT(rv, IsOk());
1760 handle1.Reset();
1761 handle2.Reset();
1762 handle3.Reset();
1763 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:391764 pool_->CloseIdleSocketsInGroup(TestGroupId("a"));
xunjieli92feb332017-03-03 17:19:231765 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231766}
1767
xunjieli26619e72016-11-23 19:39:551768TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551769 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1770 ClientSocketHandle handle;
1771 TestCompletionCallback callback;
1772 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501773 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391774 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501775 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1776 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551777 EXPECT_THAT(rv, IsOk());
1778 StreamSocket* socket = handle.socket();
1779 handle.Reset();
1780 EXPECT_EQ(1, pool_->IdleSocketCount());
1781
1782 // Disconnect socket now to make the socket unusable.
1783 socket->Disconnect();
1784 ClientSocketHandle handle2;
Matt Menkec6b3edf72019-03-19 17:00:391785 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551786 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501787 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1788 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551789 EXPECT_THAT(rv, IsOk());
1790 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551791}
1792
[email protected]2b7523d2009-07-29 20:29:231793// Regression test for http://crbug.com/17985.
1794TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1795 const int kMaxSockets = 3;
1796 const int kMaxSocketsPerGroup = 2;
1797 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1798
[email protected]ac790b42009-12-02 04:31:311799 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231800
Matt Menkec6b3edf72019-03-19 17:00:391801 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1802 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231803
1804 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:391805 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1806 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231807
1808 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:391809 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231810
1811 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:391812 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1813 IsError(ERR_IO_PENDING));
1814 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1815 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231816
Matt Menkec6b3edf72019-03-19 17:00:391817 // Release the first two sockets from TestGroupId("a"). Because this is a
1818 // keepalive, the first release will unblock the pending request for
1819 // TestGroupId("a"). The second release will unblock a request for "c",
1820 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:131821 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1822 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231823
1824 // Closing idle sockets should not get us into trouble, but in the bug
1825 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:391826 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]43a21b82010-06-10 21:30:541827 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261828
[email protected]2da659e2013-05-23 20:51:341829 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281830 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231831}
1832
[email protected]4d3b05d2010-01-27 21:27:291833TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531834 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571835
1836 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131837 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521838 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511839 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501840 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391841 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501842 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1843 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011844 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:391845 EXPECT_EQ(LOAD_STATE_CONNECTING,
1846 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:481847 TestLoadTimingInfoNotConnected(handle);
1848
robpercival214763f2016-07-01 23:27:011849 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131850 EXPECT_TRUE(handle.is_initialized());
1851 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481852 TestLoadTimingInfoConnectedNotReused(handle);
1853
[email protected]2431756e2010-09-29 20:26:131854 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481855 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301856
mmenke43758e62015-05-04 21:09:461857 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401858 log.GetEntries(&entries);
1859
Matt Menke9fa17d52019-03-25 19:12:261860 EXPECT_EQ(5u, entries.size());
[email protected]06650c52010-06-03 00:49:171861 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:261862 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:001863 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:261864 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
1865 EXPECT_TRUE(LogContainsEvent(
1866 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1867 NetLogEventPhase::NONE));
1868 EXPECT_TRUE(LogContainsEvent(entries, 3,
mikecirone8b85c432016-09-08 19:11:001869 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1870 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:261871 EXPECT_TRUE(LogContainsEndEvent(entries, 4, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571872}
1873
[email protected]4d3b05d2010-01-27 21:27:291874TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571875 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531876 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571877
1878 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131879 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521880 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511881 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181882 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131883 handle.set_is_ssl_error(true);
Matt Menke39b7c5a2019-04-10 19:47:511884 handle.set_ssl_cert_request_info(base::MakeRefCounted<SSLCertRequestInfo>());
Matt Menke28ac03e2019-02-25 22:25:501885 EXPECT_EQ(
1886 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391887 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501888 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1889 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1890 log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:391891 EXPECT_EQ(LOAD_STATE_CONNECTING,
1892 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:011893 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131894 EXPECT_FALSE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:511895 EXPECT_FALSE(handle.ssl_cert_request_info());
[email protected]fd7b7c92009-08-20 19:38:301896
mmenke43758e62015-05-04 21:09:461897 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401898 log.GetEntries(&entries);
1899
Matt Menke9fa17d52019-03-25 19:12:261900 EXPECT_EQ(4u, entries.size());
[email protected]06650c52010-06-03 00:49:171901 EXPECT_TRUE(LogContainsEvent(
Matt Menke9fa17d52019-03-25 19:12:261902 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
mikecirone8b85c432016-09-08 19:11:001903 NetLogEventPhase::NONE));
Matt Menke9fa17d52019-03-25 19:12:261904 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
1905 EXPECT_TRUE(LogContainsEvent(
1906 entries, 2, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1907 NetLogEventPhase::NONE));
1908 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571909}
1910
mmenke6be122f2015-03-09 22:22:471911// Check that an async ConnectJob failure does not result in creation of a new
1912// ConnectJob when there's another pending request also waiting on its own
1913// ConnectJob. See http://crbug.com/463960.
1914TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1915 CreatePool(2, 2);
1916 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1917
Matt Menkec6b3edf72019-03-19 17:00:391918 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1919 IsError(ERR_IO_PENDING));
1920 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1921 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471922
robpercival214763f2016-07-01 23:27:011923 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1924 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471925
1926 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1927}
1928
[email protected]4d3b05d2010-01-27 21:27:291929TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101930 // TODO(eroman): Add back the log expectations! Removed them because the
1931 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531932 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571933
1934 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131935 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521936 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131937 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521938 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571939
Matt Menke28ac03e2019-02-25 22:25:501940 EXPECT_EQ(
1941 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391942 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501943 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1944 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1945 NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511946 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201947 EXPECT_EQ(
1948 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391949 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201950 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501951 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1952 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571953
[email protected]2431756e2010-09-29 20:26:131954 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571955
[email protected]fd7b7c92009-08-20 19:38:301956
1957 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301958
robpercival214763f2016-07-01 23:27:011959 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131960 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301961
1962 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531963 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571964}
1965
[email protected]4d3b05d2010-01-27 21:27:291966TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341967 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1968
[email protected]17a0c6c2009-08-04 00:07:041969 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1970
Matt Menkec6b3edf72019-03-19 17:00:391971 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1972 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1973 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1974 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341975
Raul Tambre8335a6d2019-02-21 16:57:431976 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261977 static_cast<int>(
1978 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:131979 (*requests())[2]->handle()->Reset();
1980 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431981 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261982 static_cast<int>(
1983 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:341984
[email protected]2431756e2010-09-29 20:26:131985 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431986 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261987 static_cast<int>(
1988 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:341989
[email protected]2431756e2010-09-29 20:26:131990 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:431991 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menke9fa17d52019-03-25 19:12:261992 static_cast<int>(
1993 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:341994}
1995
[email protected]5fc08e32009-07-15 17:09:571996// When requests and ConnectJobs are not coupled, the request will get serviced
1997// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291998TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531999 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572000
2001 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322002 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572003
[email protected]2431756e2010-09-29 20:26:132004 std::vector<TestSocketRequest*> request_order;
2005 size_t completion_count; // unused
2006 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502007 int rv = req1.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392008 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502009 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2010 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012011 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2012 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572013
2014 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2015 // without a job.
2016 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2017
[email protected]2431756e2010-09-29 20:26:132018 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502019 rv = req2.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392020 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502021 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2022 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012023 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132024 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502025 rv = req3.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392026 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502027 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2028 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012029 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572030
2031 // Both Requests 2 and 3 are pending. We release socket 1 which should
2032 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332033 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342034 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282035 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332036 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012037 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332038 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572039
2040 // Signal job 2, which should service request 3.
2041
2042 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012043 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572044
Raul Tambre8335a6d2019-02-21 16:57:432045 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132046 EXPECT_EQ(&req1, request_order[0]);
2047 EXPECT_EQ(&req2, request_order[1]);
2048 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392049 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572050}
2051
2052// The requests are not coupled to the jobs. So, the requests should finish in
2053// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292054TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532055 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572056 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322057 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572058
[email protected]2431756e2010-09-29 20:26:132059 std::vector<TestSocketRequest*> request_order;
2060 size_t completion_count; // unused
2061 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502062 int rv = req1.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392063 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502064 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2065 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012066 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572067
[email protected]2431756e2010-09-29 20:26:132068 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502069 rv = req2.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392070 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502071 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2072 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012073 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572074
2075 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322076 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572077
[email protected]2431756e2010-09-29 20:26:132078 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502079 rv = req3.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392080 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502081 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2082 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012083 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572084
robpercival214763f2016-07-01 23:27:012085 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2086 EXPECT_THAT(req2.WaitForResult(), IsOk());
2087 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572088
Raul Tambre8335a6d2019-02-21 16:57:432089 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132090 EXPECT_EQ(&req1, request_order[0]);
2091 EXPECT_EQ(&req2, request_order[1]);
2092 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572093}
2094
[email protected]03b7c8c2013-07-20 04:38:552095// Test GetLoadState in the case there's only one socket request.
2096TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532097 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552098 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572099
[email protected]2431756e2010-09-29 20:26:132100 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522101 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502102 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392103 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502104 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2105 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012106 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552107 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572108
[email protected]03b7c8c2013-07-20 04:38:552109 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2110 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2111
2112 // No point in completing the connection, since ClientSocketHandles only
2113 // expect the LoadState to be checked while connecting.
2114}
2115
2116// Test GetLoadState in the case there are two socket requests.
2117TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2118 CreatePool(2, 2);
2119 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2120
2121 ClientSocketHandle handle;
2122 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502123 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392124 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502125 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2126 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012127 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002128 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2129
2130 ClientSocketHandle handle2;
2131 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392132 rv = handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152133 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502134 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2135 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012136 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002137 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2138
Matt Menke4b69f932019-03-04 16:20:012139 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002140 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2141 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2142
Matt Menke4b69f932019-03-04 16:20:012143 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002144 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2145
Matt Menke4b69f932019-03-04 16:20:012146 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002147 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002148 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012149
2150 // Update the state of the second job.
2151 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2152
2153 // Only the state of the second request should have changed.
2154 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2155 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2156
2157 // Second job connects and the first request gets the socket. The
2158 // second handle switches to the state of the remaining ConnectJob.
2159 client_socket_factory_.SignalJob(1);
2160 EXPECT_THAT(callback.WaitForResult(), IsOk());
2161 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552162}
2163
2164// Test GetLoadState in the case the per-group limit is reached.
2165TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2166 CreatePool(2, 1);
2167 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2168
2169 ClientSocketHandle handle;
2170 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502171 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392172 TestGroupId("a"), params_, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502173 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2174 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012175 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552176 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2177
2178 // Request another socket from the same pool, buth with a higher priority.
2179 // The first request should now be stalled at the socket group limit.
2180 ClientSocketHandle handle2;
2181 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392182 rv = handle2.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152183 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502184 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2185 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012186 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552187 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2188 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2189
2190 // The first handle should remain stalled as the other socket goes through
2191 // the connect process.
2192
2193 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2194 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2195 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2196
2197 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012198 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552199 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2200
2201 // Closing the second socket should cause the stalled handle to finally get a
2202 // ConnectJob.
2203 handle2.socket()->Disconnect();
2204 handle2.Reset();
2205 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2206}
2207
2208// Test GetLoadState in the case the per-pool limit is reached.
2209TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2210 CreatePool(2, 2);
2211 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2212
2213 ClientSocketHandle handle;
2214 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502215 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392216 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502217 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2218 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012219 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552220
2221 // Request for socket from another pool.
2222 ClientSocketHandle handle2;
2223 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392224 rv = handle2.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152225 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502226 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2227 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012228 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552229
2230 // Request another socket from the first pool. Request should stall at the
2231 // socket pool limit.
2232 ClientSocketHandle handle3;
2233 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392234 rv = handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152235 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502236 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2237 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012238 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552239
2240 // The third handle should remain stalled as the other sockets in its group
2241 // goes through the connect process.
2242
2243 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2244 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2245
2246 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2247 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2248 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2249
2250 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012251 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552252 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2253
2254 // Closing a socket should allow the stalled handle to finally get a new
2255 // ConnectJob.
2256 handle.socket()->Disconnect();
2257 handle.Reset();
2258 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572259}
2260
Matt Menkeb57663b32019-03-01 17:17:102261TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132262 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102263 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132264
[email protected]2431756e2010-09-29 20:26:132265 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522266 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502267 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102268 ERR_CERT_COMMON_NAME_INVALID,
Matt Menkec6b3edf72019-03-19 17:00:392269 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502270 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2271 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2272 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132273 EXPECT_TRUE(handle.is_initialized());
2274 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132275}
2276
Matt Menkeb57663b32019-03-01 17:17:102277TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132278 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2279
Matt Menkeb57663b32019-03-01 17:17:102280 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132281 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522282 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502283 EXPECT_EQ(
2284 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392285 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502286 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2287 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2288 NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392289 EXPECT_EQ(LOAD_STATE_CONNECTING,
2290 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102291 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132292 EXPECT_TRUE(handle.is_initialized());
2293 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132294}
2295
[email protected]e60e47a2010-07-14 03:37:182296TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2297 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2298 connect_job_factory_->set_job_type(
2299 TestConnectJob::kMockAdditionalErrorStateJob);
2300
[email protected]2431756e2010-09-29 20:26:132301 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522302 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502303 EXPECT_EQ(
2304 ERR_CONNECTION_FAILED,
Matt Menkec6b3edf72019-03-19 17:00:392305 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502306 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2307 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2308 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132309 EXPECT_FALSE(handle.is_initialized());
2310 EXPECT_FALSE(handle.socket());
2311 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512312 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182313}
2314
2315TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2316 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2317
2318 connect_job_factory_->set_job_type(
2319 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132320 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522321 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502322 EXPECT_EQ(
2323 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392324 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502325 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2326 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2327 NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392328 EXPECT_EQ(LOAD_STATE_CONNECTING,
2329 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012330 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132331 EXPECT_FALSE(handle.is_initialized());
2332 EXPECT_FALSE(handle.socket());
2333 EXPECT_TRUE(handle.is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512334 EXPECT_TRUE(handle.ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182335}
2336
martijn003cd612016-05-19 22:24:382337// Make sure we can reuse sockets.
2338TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412339 CreatePoolWithIdleTimeouts(
2340 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032341 base::TimeDelta(), // Time out unused sockets immediately.
2342 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2343
2344 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2345
2346 ClientSocketHandle handle;
2347 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502348 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392349 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502350 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2351 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012352 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392353 EXPECT_EQ(LOAD_STATE_CONNECTING,
2354 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012355 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032356
2357 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352358 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382359 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482360 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032361 handle.Reset();
2362
2363 // Should now have one idle socket.
2364 ASSERT_EQ(1, pool_->IdleSocketCount());
2365
2366 // Request a new socket. This should reuse the old socket and complete
2367 // synchronously.
vishal.b62985ca92015-04-17 08:45:512368 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502369 rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392370 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502371 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2372 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012373 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032374 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482375 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032376
Matt Menke9fa17d52019-03-25 19:12:262377 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392378 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262379 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032380
mmenke43758e62015-05-04 21:09:462381 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032382 log.GetEntries(&entries);
Matt Menke9fa17d52019-03-25 19:12:262383 EXPECT_TRUE(LogContainsEvent(
2384 entries, 0, NetLogEventType::TCP_CLIENT_SOCKET_POOL_REQUESTED_SOCKET,
2385 NetLogEventPhase::NONE));
2386 EXPECT_TRUE(LogContainsBeginEvent(entries, 1, NetLogEventType::SOCKET_POOL));
[email protected]e7b1c6d2c2012-05-05 00:54:032387 EXPECT_TRUE(LogContainsEntryWithType(
Matt Menke9fa17d52019-03-25 19:12:262388 entries, 2, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032389}
2390
martijn003cd612016-05-19 22:24:382391// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172392TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032393 CreatePoolWithIdleTimeouts(
2394 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2395 base::TimeDelta(), // Time out unused sockets immediately
2396 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412397
2398 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2399
2400 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2401
2402 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522403 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502404 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392405 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502406 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2407 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012408 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392409 EXPECT_EQ(LOAD_STATE_CONNECTING,
2410 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412411
2412 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522413 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392414 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152415 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502416 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2417 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012418 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392419 EXPECT_EQ(LOAD_STATE_CONNECTING,
2420 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412421
2422 // Cancel one of the requests. Wait for the other, which will get the first
2423 // job. Release the socket. Run the loop again to make sure the second
2424 // socket is sitting idle and the first one is released (since ReleaseSocket()
2425 // just posts a DoReleaseSocket() task).
2426
2427 handle.Reset();
robpercival214763f2016-07-01 23:27:012428 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412429 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352430 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382431 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412432 handle2.Reset();
2433
[email protected]e7b1c6d2c2012-05-05 00:54:032434 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2435 // actually become pending until 2ms after they have been created. In order
2436 // to flush all tasks, we need to wait so that we know there are no
2437 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452438 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412439
[email protected]e7b1c6d2c2012-05-05 00:54:032440 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412441 ASSERT_EQ(2, pool_->IdleSocketCount());
2442
2443 // Request a new socket. This should cleanup the unused and timed out ones.
2444 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512445 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522446 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392447 rv = handle.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152448 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502449 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2450 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012451 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2452 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412453 EXPECT_FALSE(handle.is_reused());
2454
[email protected]e7b1c6d2c2012-05-05 00:54:032455 // Make sure the idle socket is closed.
Matt Menke9fa17d52019-03-25 19:12:262456 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:392457 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:262458 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412459
mmenke43758e62015-05-04 21:09:462460 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412461 log.GetEntries(&entries);
2462 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002463 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412464}
2465
[email protected]2041cf342010-02-19 03:15:592466// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162467// because of multiple releasing disconnected sockets.
2468TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2469 CreatePoolWithIdleTimeouts(
2470 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2471 base::TimeDelta(), // Time out unused sockets immediately.
2472 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2473
2474 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2475
2476 // Startup 4 connect jobs. Two of them will be pending.
2477
[email protected]2431756e2010-09-29 20:26:132478 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522479 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502480 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392481 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502482 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2483 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012484 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162485
[email protected]2431756e2010-09-29 20:26:132486 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522487 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392488 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152489 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502490 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2491 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012492 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162493
[email protected]2431756e2010-09-29 20:26:132494 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522495 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392496 rv = handle3.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152497 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502498 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2499 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012500 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162501
[email protected]2431756e2010-09-29 20:26:132502 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522503 TestCompletionCallback callback4;
Matt Menkec6b3edf72019-03-19 17:00:392504 rv = handle4.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152505 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502506 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2507 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012508 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162509
2510 // Release two disconnected sockets.
2511
[email protected]2431756e2010-09-29 20:26:132512 handle.socket()->Disconnect();
2513 handle.Reset();
2514 handle2.socket()->Disconnect();
2515 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162516
robpercival214763f2016-07-01 23:27:012517 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132518 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012519 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132520 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162521}
2522
[email protected]d7027bb2010-05-10 18:58:542523// Regression test for http://crbug.com/42267.
2524// When DoReleaseSocket() is processed for one socket, it is blocked because the
2525// other stalled groups all have releasing sockets, so no progress can be made.
2526TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2527 CreatePoolWithIdleTimeouts(
2528 4 /* socket limit */, 4 /* socket limit per group */,
2529 base::TimeDelta(), // Time out unused sockets immediately.
2530 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2531
2532 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2533
2534 // Max out the socket limit with 2 per group.
2535
[email protected]2431756e2010-09-29 20:26:132536 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522537 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132538 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522539 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542540
2541 for (int i = 0; i < 2; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:392542 EXPECT_EQ(
2543 OK, handle_a[i].Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
2544 ClientSocketPool::RespectLimits::ENABLED,
2545 callback_a[i].callback(),
2546 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2547 NetLogWithSource()));
2548 EXPECT_EQ(
2549 OK, handle_b[i].Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
2550 ClientSocketPool::RespectLimits::ENABLED,
2551 callback_b[i].callback(),
2552 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2553 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542554 }
[email protected]b89f7e42010-05-20 20:37:002555
[email protected]d7027bb2010-05-10 18:58:542556 // Make 4 pending requests, 2 per group.
2557
2558 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202559 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392560 handle_a[i].Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202561 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502562 callback_a[i].callback(),
2563 ClientSocketPool::ProxyAuthCallback(),
2564 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:202565 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392566 handle_b[i].Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202567 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502568 callback_b[i].callback(),
2569 ClientSocketPool::ProxyAuthCallback(),
2570 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542571 }
2572
2573 // Release b's socket first. The order is important, because in
2574 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2575 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2576 // first, which has a releasing socket, so it refuses to start up another
2577 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132578 handle_b[0].socket()->Disconnect();
2579 handle_b[0].Reset();
2580 handle_a[0].socket()->Disconnect();
2581 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542582
2583 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282584 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542585
[email protected]2431756e2010-09-29 20:26:132586 handle_b[1].socket()->Disconnect();
2587 handle_b[1].Reset();
2588 handle_a[1].socket()->Disconnect();
2589 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542590
2591 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012592 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2593 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542594 }
2595}
2596
[email protected]fd4fe0b2010-02-08 23:02:152597TEST_F(ClientSocketPoolBaseTest,
2598 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2599 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2600
2601 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2602
Matt Menkec6b3edf72019-03-19 17:00:392603 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2604 IsError(ERR_IO_PENDING));
2605 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2606 IsError(ERR_IO_PENDING));
2607 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2608 IsError(ERR_IO_PENDING));
2609 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2610 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152611
robpercival214763f2016-07-01 23:27:012612 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2613 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132614 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152615
2616 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132617 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012618 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152619
[email protected]2431756e2010-09-29 20:26:132620 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012621 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132622 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152623
2624 EXPECT_EQ(1, GetOrderOfRequest(1));
2625 EXPECT_EQ(2, GetOrderOfRequest(2));
2626 EXPECT_EQ(3, GetOrderOfRequest(3));
2627 EXPECT_EQ(4, GetOrderOfRequest(4));
2628
2629 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132630 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152631}
2632
[email protected]6ecf2b92011-12-15 01:14:522633class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042634 public:
Matt Menke9fa17d52019-03-25 19:12:262635 TestReleasingSocketRequest(TransportClientSocketPool* pool,
[email protected]2431756e2010-09-29 20:26:132636 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182637 bool reset_releasing_handle)
2638 : pool_(pool),
2639 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042640 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522641
Chris Watkins7a41d3552017-12-01 02:13:272642 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042643
2644 ClientSocketHandle* handle() { return &handle_; }
2645
Bence Béky8ddc2492018-06-13 01:02:042646 CompletionOnceCallback callback() {
2647 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2648 base::Unretained(this));
2649 }
[email protected]4f1e4982010-03-02 18:31:042650
2651 private:
[email protected]6ecf2b92011-12-15 01:14:522652 void OnComplete(int result) {
2653 SetResult(result);
2654 if (reset_releasing_handle_)
2655 handle_.Reset();
2656
Matt Menkec6b3edf72019-03-19 17:00:392657 EXPECT_EQ(
2658 expected_result_,
Matt Menke9fa17d52019-03-25 19:12:262659 handle2_.Init(TestGroupId("a"), CreateDummyParams(), DEFAULT_PRIORITY,
2660 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
2661 CompletionOnceCallback(),
2662 ClientSocketPool::ProxyAuthCallback(), pool_,
2663 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522664 }
2665
Matt Menke9fa17d52019-03-25 19:12:262666 TransportClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182667 int expected_result_;
2668 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042669 ClientSocketHandle handle_;
2670 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042671};
2672
[email protected]e60e47a2010-07-14 03:37:182673
2674TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2675 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2676
Matt Menkec6b3edf72019-03-19 17:00:392677 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2678 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2679 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182680
[email protected]2431756e2010-09-29 20:26:132681 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182682 client_socket_factory_.allocation_count());
2683
2684 connect_job_factory_->set_job_type(
2685 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2686 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202687 EXPECT_EQ(
2688 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392689 req.handle()->Init(TestGroupId("a"), params_, DEFAULT_PRIORITY,
2690 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502691 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2692 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182693 // The next job should complete synchronously
2694 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2695
robpercival214763f2016-07-01 23:27:012696 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182697 EXPECT_FALSE(req.handle()->is_initialized());
2698 EXPECT_FALSE(req.handle()->socket());
2699 EXPECT_TRUE(req.handle()->is_ssl_error());
Matt Menke39b7c5a2019-04-10 19:47:512700 EXPECT_TRUE(req.handle()->ssl_cert_request_info());
[email protected]e60e47a2010-07-14 03:37:182701}
2702
[email protected]b6501d3d2010-06-03 23:53:342703// http://crbug.com/44724 regression test.
2704// We start releasing the pool when we flush on network change. When that
2705// happens, the only active references are in the ClientSocketHandles. When a
2706// ConnectJob completes and calls back into the last ClientSocketHandle, that
2707// callback can release the last reference and delete the pool. After the
2708// callback finishes, we go back to the stack frame within the now-deleted pool.
2709// Executing any code that refers to members of the now-deleted pool can cause
2710// crashes.
2711TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2712 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2713 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2714
2715 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522716 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502717 EXPECT_EQ(
2718 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392719 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502720 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2721 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2722 NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342723
[email protected]7af985a2012-12-14 22:40:422724 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342725
2726 // We'll call back into this now.
2727 callback.WaitForResult();
2728}
2729
[email protected]a7e38572010-06-07 18:22:242730TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2731 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2732 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2733
2734 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522735 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502736 EXPECT_EQ(
2737 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392738 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502739 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2740 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2741 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012742 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242743 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2744
[email protected]7af985a2012-12-14 22:40:422745 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242746
2747 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282748 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242749
Matt Menke28ac03e2019-02-25 22:25:502750 EXPECT_EQ(
2751 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392752 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502753 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2754 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2755 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012756 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242757 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2758}
2759
[email protected]6ecf2b92011-12-15 01:14:522760class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142761 public:
Matt Menke9fa17d52019-03-25 19:12:262762 ConnectWithinCallback(
2763 const ClientSocketPool::GroupId& group_id,
Matt Menke84d11e562019-03-27 00:11:192764 const scoped_refptr<ClientSocketPool::SocketParams>& params,
Matt Menke9fa17d52019-03-25 19:12:262765 TransportClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:392766 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142767
Chris Watkins7a41d3552017-12-01 02:13:272768 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142769
2770 int WaitForNestedResult() {
2771 return nested_callback_.WaitForResult();
2772 }
2773
Bence Béky8ddc2492018-06-13 01:02:042774 CompletionOnceCallback callback() {
2775 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2776 base::Unretained(this));
2777 }
[email protected]6ecf2b92011-12-15 01:14:522778
[email protected]06f92462010-08-31 19:24:142779 private:
[email protected]6ecf2b92011-12-15 01:14:522780 void OnComplete(int result) {
2781 SetResult(result);
Matt Menke28ac03e2019-02-25 22:25:502782 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392783 handle_.Init(group_id_, params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502784 ClientSocketPool::RespectLimits::ENABLED,
2785 nested_callback_.callback(),
2786 ClientSocketPool::ProxyAuthCallback(), pool_,
2787 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522788 }
2789
Matt Menkec6b3edf72019-03-19 17:00:392790 const ClientSocketPool::GroupId group_id_;
Matt Menke84d11e562019-03-27 00:11:192791 const scoped_refptr<ClientSocketPool::SocketParams> params_;
Matt Menke9fa17d52019-03-25 19:12:262792 TransportClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142793 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522794 TestCompletionCallback nested_callback_;
2795
2796 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142797};
2798
2799TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2800 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2801
2802 // First job will be waiting until it gets aborted.
2803 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2804
2805 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:392806 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:502807 EXPECT_EQ(
2808 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392809 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502810 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2811 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2812 NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142813
2814 // Second job will be started during the first callback, and will
2815 // asynchronously complete with OK.
2816 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422817 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012818 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2819 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142820}
2821
Matt Menke141b87f22019-01-30 02:43:032822TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
Matt Menke9fa17d52019-03-25 19:12:262823 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2824 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:032825
2826 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2827 ClientSocketHandle handle;
2828 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502829 EXPECT_EQ(
2830 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392831 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502832 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2833 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2834 NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:032835 // The backup timer fires but doesn't start a new ConnectJob while resolving
2836 // the hostname.
2837 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2838 FastForwardBy(base::TimeDelta::FromMilliseconds(
2839 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2840 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2841
2842 // Once the ConnectJob has finished resolving the hostname, the backup timer
2843 // will create a ConnectJob when it fires.
2844 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2845 FastForwardBy(base::TimeDelta::FromMilliseconds(
2846 ClientSocketPool::kMaxConnectRetryIntervalMs));
2847 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2848}
2849
2850// Test that no backup socket is created when a ConnectJob connects before it
2851// completes.
2852TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
Matt Menke9fa17d52019-03-25 19:12:262853 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2854 true /* enable_backup_connect_jobs */);
Matt Menke141b87f22019-01-30 02:43:032855
2856 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2857 ClientSocketHandle handle;
2858 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502859 EXPECT_EQ(
2860 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392861 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502862 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2863 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2864 NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:032865 // The backup timer fires but doesn't start a new ConnectJob while resolving
2866 // the hostname.
2867 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2868 FastForwardBy(base::TimeDelta::FromMilliseconds(
2869 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2870 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2871
2872 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2873 client_socket_factory_.SetJobHasEstablishedConnection(0);
2874 FastForwardBy(base::TimeDelta::FromMilliseconds(
2875 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2876 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2877}
2878
[email protected]25eea382010-07-10 23:55:262879// Cancel a pending socket request while we're at max sockets,
2880// and verify that the backup socket firing doesn't cause a crash.
2881TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2882 // Max 4 sockets globally, max 4 sockets per group.
Matt Menke9fa17d52019-03-25 19:12:262883 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2884 true /* enable_backup_connect_jobs */);
[email protected]25eea382010-07-10 23:55:262885
[email protected]4baaf9d2010-08-31 15:15:442886 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2887 // timer.
[email protected]25eea382010-07-10 23:55:262888 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2889 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522890 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502891 EXPECT_EQ(
2892 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392893 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502894 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2895 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2896 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262897
2898 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2899 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2900 ClientSocketHandle handles[kDefaultMaxSockets];
2901 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522902 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:392903 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY,
2904 SocketTag(),
tfarina428341112016-09-22 13:38:202905 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502906 callback.callback(),
2907 ClientSocketPool::ProxyAuthCallback(),
2908 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262909 }
2910
fdoray5eeb7642016-06-22 16:11:282911 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262912
2913 // Cancel the pending request.
2914 handle.Reset();
2915
2916 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452917 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002918 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262919
[email protected]25eea382010-07-10 23:55:262920 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2921}
2922
[email protected]3f00be82010-09-27 19:50:022923TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:262924 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2925 true /* enable_backup_connect_jobs */);
[email protected]4baaf9d2010-08-31 15:15:442926
2927 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2928 // timer.
2929 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2930 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522931 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502932 EXPECT_EQ(
2933 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392934 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502935 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2936 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2937 NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:262938 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
2939 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
2940 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
2941 TestGroupId("bar")));
2942 EXPECT_EQ(
2943 0u, pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:442944
2945 // Cancel the socket request. This should cancel the backup timer. Wait for
2946 // the backup time to see if it indeed got canceled.
2947 handle.Reset();
2948 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452949 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002950 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menke9fa17d52019-03-25 19:12:262951 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
2952 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:442953}
2954
[email protected]3f00be82010-09-27 19:50:022955TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
Matt Menke9fa17d52019-03-25 19:12:262956 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets,
2957 true /* enable_backup_connect_jobs */);
[email protected]3f00be82010-09-27 19:50:022958
2959 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2960 // timer.
2961 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2962 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522963 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502964 EXPECT_EQ(
2965 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392966 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502967 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2968 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2969 NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022970 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2971 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522972 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202973 EXPECT_EQ(
2974 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392975 handle2.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202976 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502977 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2978 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:262979 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("bar")));
2980 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:022981
2982 // Cancel request 1 and then complete request 2. With the requests finished,
2983 // the backup timer should be cancelled.
2984 handle.Reset();
robpercival214763f2016-07-01 23:27:012985 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022986 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452987 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002988 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:022989}
2990
[email protected]eb5a99382010-07-11 03:18:262991// Test delayed socket binding for the case where we have two connects,
2992// and while one is waiting on a connect, the other frees up.
2993// The socket waiting on a connect should switch immediately to the freed
2994// up socket.
2995TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2996 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2997 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2998
2999 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523000 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503001 EXPECT_EQ(
3002 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393003 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503004 ClientSocketPool::RespectLimits::ENABLED,
3005 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3006 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013007 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263008
3009 // No idle sockets, no pending jobs.
3010 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263011 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263012
3013 // Create a second socket to the same host, but this one will wait.
3014 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3015 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503016 EXPECT_EQ(
3017 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393018 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503019 ClientSocketPool::RespectLimits::ENABLED,
3020 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3021 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263022 // No idle sockets, and one connecting job.
3023 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263024 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263025
3026 // Return the first handle to the pool. This will initiate the delayed
3027 // binding.
3028 handle1.Reset();
3029
fdoray5eeb7642016-06-22 16:11:283030 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263031
3032 // Still no idle sockets, still one pending connect job.
3033 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263034 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263035
3036 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013037 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263038
3039 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263040 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263041
3042 // Finally, signal the waiting Connect.
3043 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263044 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263045
fdoray5eeb7642016-06-22 16:11:283046 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263047}
3048
3049// Test delayed socket binding when a group is at capacity and one
3050// of the group's sockets frees up.
3051TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3052 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3053 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3054
3055 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523056 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503057 EXPECT_EQ(
3058 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393059 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503060 ClientSocketPool::RespectLimits::ENABLED,
3061 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3062 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013063 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263064
3065 // No idle sockets, no pending jobs.
3066 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263067 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263068
3069 // Create a second socket to the same host, but this one will wait.
3070 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3071 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503072 EXPECT_EQ(
3073 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393074 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503075 ClientSocketPool::RespectLimits::ENABLED,
3076 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3077 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263078 // No idle sockets, and one connecting job.
3079 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263080 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263081
3082 // Return the first handle to the pool. This will initiate the delayed
3083 // binding.
3084 handle1.Reset();
3085
fdoray5eeb7642016-06-22 16:11:283086 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263087
3088 // Still no idle sockets, still one pending connect job.
3089 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263090 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263091
3092 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013093 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263094
3095 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263096 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263097
3098 // Finally, signal the waiting Connect.
3099 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263100 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263101
fdoray5eeb7642016-06-22 16:11:283102 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263103}
3104
3105// Test out the case where we have one socket connected, one
3106// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513107// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263108// should complete, by taking the first socket's idle socket.
3109TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3110 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3111 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3112
3113 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523114 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503115 EXPECT_EQ(
3116 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393117 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503118 ClientSocketPool::RespectLimits::ENABLED,
3119 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3120 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013121 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263122
3123 // No idle sockets, no pending jobs.
3124 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263125 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263126
3127 // Create a second socket to the same host, but this one will wait.
3128 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3129 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503130 EXPECT_EQ(
3131 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393132 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503133 ClientSocketPool::RespectLimits::ENABLED,
3134 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3135 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263136 // No idle sockets, and one connecting job.
3137 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263138 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263139
3140 // Return the first handle to the pool. This will initiate the delayed
3141 // binding.
3142 handle1.Reset();
3143
fdoray5eeb7642016-06-22 16:11:283144 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263145
3146 // Still no idle sockets, still one pending connect job.
3147 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menke9fa17d52019-03-25 19:12:263148 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263149
3150 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013151 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263152
3153 // And we can see there is still one job waiting.
Matt Menke9fa17d52019-03-25 19:12:263154 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263155
3156 // Finally, signal the waiting Connect.
3157 client_socket_factory_.SignalJobs();
Matt Menke9fa17d52019-03-25 19:12:263158 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263159
fdoray5eeb7642016-06-22 16:11:283160 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263161}
3162
[email protected]2abfe90a2010-08-25 17:49:513163// Cover the case where on an available socket slot, we have one pending
3164// request that completes synchronously, thereby making the Group empty.
3165TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3166 const int kUnlimitedSockets = 100;
3167 const int kOneSocketPerGroup = 1;
3168 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3169
3170 // Make the first request asynchronous fail.
3171 // This will free up a socket slot later.
3172 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3173
3174 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523175 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203176 EXPECT_EQ(
3177 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393178 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203179 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503180 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3181 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263182 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513183
3184 // Make the second request synchronously fail. This should make the Group
3185 // empty.
3186 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3187 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523188 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513189 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3190 // when created.
tfarina428341112016-09-22 13:38:203191 EXPECT_EQ(
3192 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393193 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203194 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503195 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3196 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513197
Matt Menke9fa17d52019-03-25 19:12:263198 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513199
robpercival214763f2016-07-01 23:27:013200 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3201 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menke9fa17d52019-03-25 19:12:263202 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513203}
3204
[email protected]e1b54dc2010-10-06 21:27:223205TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3206 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3207
3208 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3209
3210 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523211 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203212 EXPECT_EQ(
3213 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393214 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203215 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503216 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3217 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223218
3219 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523220 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203221 EXPECT_EQ(
3222 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393223 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203224 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503225 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3226 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223227 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523228 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203229 EXPECT_EQ(
3230 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393231 handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203232 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503233 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3234 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223235
robpercival214763f2016-07-01 23:27:013236 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3237 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3238 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223239
3240 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353241 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383242 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353243 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383244 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223245
3246 handle1.Reset();
3247 handle2.Reset();
3248 handle3.Reset();
3249
Matt Menkec6b3edf72019-03-19 17:00:393250 EXPECT_EQ(OK, handle1.Init(
3251 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3252 ClientSocketPool::RespectLimits::ENABLED,
3253 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3254 pool_.get(), NetLogWithSource()));
3255 EXPECT_EQ(OK, handle2.Init(
3256 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3257 ClientSocketPool::RespectLimits::ENABLED,
3258 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3259 pool_.get(), NetLogWithSource()));
3260 EXPECT_EQ(OK, handle3.Init(
3261 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3262 ClientSocketPool::RespectLimits::ENABLED,
3263 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3264 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223265
3266 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3267 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3268 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3269}
3270
[email protected]2c2bef152010-10-13 00:55:033271TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3272 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3273 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3274
Matt Menkebd12b7e2019-03-25 21:12:033275 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033276
Matt Menke9fa17d52019-03-25 19:12:263277 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3278 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3279 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3280 TestGroupId("a")));
3281 EXPECT_EQ(2u,
3282 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393283 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033284
3285 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523286 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203287 EXPECT_EQ(
3288 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393289 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203290 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503291 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3292 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033293
3294 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523295 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203296 EXPECT_EQ(
3297 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393298 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203299 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503300 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3301 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033302
Matt Menke9fa17d52019-03-25 19:12:263303 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3304 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3305 TestGroupId("a")));
3306 EXPECT_EQ(0u,
3307 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393308 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033309
robpercival214763f2016-07-01 23:27:013310 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3311 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033312 handle1.Reset();
3313 handle2.Reset();
3314
Matt Menke9fa17d52019-03-25 19:12:263315 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3316 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3317 TestGroupId("a")));
3318 EXPECT_EQ(0u,
3319 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393320 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033321}
3322
3323TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3324 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3325 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3326
3327 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523328 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203329 EXPECT_EQ(
3330 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393331 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203332 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503333 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3334 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033335
Matt Menke9fa17d52019-03-25 19:12:263336 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3337 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3338 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3339 TestGroupId("a")));
3340 EXPECT_EQ(0u,
3341 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393342 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033343
Matt Menkebd12b7e2019-03-25 21:12:033344 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033345
Matt Menke9fa17d52019-03-25 19:12:263346 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3347 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3348 TestGroupId("a")));
3349 EXPECT_EQ(1u,
3350 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393351 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033352
3353 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523354 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203355 EXPECT_EQ(
3356 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393357 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203358 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503359 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3360 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033361
Matt Menke9fa17d52019-03-25 19:12:263362 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3363 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3364 TestGroupId("a")));
3365 EXPECT_EQ(0u,
3366 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393367 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033368
robpercival214763f2016-07-01 23:27:013369 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3370 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033371 handle1.Reset();
3372 handle2.Reset();
3373
Matt Menke9fa17d52019-03-25 19:12:263374 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3375 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3376 TestGroupId("a")));
3377 EXPECT_EQ(0u,
3378 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393379 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033380}
3381
3382TEST_F(ClientSocketPoolBaseTest,
3383 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3384 CreatePool(4, 4);
3385 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3386
3387 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523388 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203389 EXPECT_EQ(
3390 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393391 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203392 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503393 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3394 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033395
3396 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523397 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203398 EXPECT_EQ(
3399 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393400 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203401 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503402 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3403 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033404
3405 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523406 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203407 EXPECT_EQ(
3408 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393409 handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203410 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503411 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3412 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033413
Matt Menke9fa17d52019-03-25 19:12:263414 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3415 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3416 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3417 TestGroupId("a")));
3418 EXPECT_EQ(0u,
3419 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393420 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033421
Matt Menkebd12b7e2019-03-25 21:12:033422 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033423
Matt Menke9fa17d52019-03-25 19:12:263424 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3425 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3426 TestGroupId("a")));
3427 EXPECT_EQ(0u,
3428 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393429 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033430
robpercival214763f2016-07-01 23:27:013431 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3432 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3433 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033434 handle1.Reset();
3435 handle2.Reset();
3436 handle3.Reset();
3437
Matt Menke9fa17d52019-03-25 19:12:263438 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3439 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3440 TestGroupId("a")));
3441 EXPECT_EQ(0u,
3442 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393443 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033444}
3445
3446TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3447 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3448 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3449
Matt Menke9fa17d52019-03-25 19:12:263450 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033451
Matt Menkebd12b7e2019-03-25 21:12:033452 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393453 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033454
Matt Menke9fa17d52019-03-25 19:12:263455 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433456 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393457 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263458 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3459 EXPECT_EQ(
3460 kDefaultMaxSockets,
3461 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3462 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433463 EXPECT_EQ(kDefaultMaxSockets,
Matt Menke9fa17d52019-03-25 19:12:263464 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3465 TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033466
Matt Menke9fa17d52019-03-25 19:12:263467 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033468
Matt Menkebd12b7e2019-03-25 21:12:033469 pool_->RequestSockets(TestGroupId("b"), params_, kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393470 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033471
Matt Menke9fa17d52019-03-25 19:12:263472 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033473}
3474
3475TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3476 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3477 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3478
Matt Menke9fa17d52019-03-25 19:12:263479 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033480
Matt Menkebd12b7e2019-03-25 21:12:033481 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573482 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033483
Matt Menke9fa17d52019-03-25 19:12:263484 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433485 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393486 static_cast<int>(
Matt Menke9fa17d52019-03-25 19:12:263487 pool_->NumConnectJobsInGroupForTesting(TestGroupId("a"))));
3488 EXPECT_EQ(
3489 kDefaultMaxSockets - 1,
3490 static_cast<int>(pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3491 TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433492 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menke9fa17d52019-03-25 19:12:263493 static_cast<int>(pool_->NumUnassignedConnectJobsInGroupForTesting(
3494 TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483495 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033496
Matt Menke9fa17d52019-03-25 19:12:263497 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033498
Matt Menkebd12b7e2019-03-25 21:12:033499 pool_->RequestSockets(TestGroupId("b"), params_, kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393500 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033501
Matt Menke9fa17d52019-03-25 19:12:263502 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3503 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483504 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033505}
3506
3507TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3508 CreatePool(4, 4);
3509 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3510
3511 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523512 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203513 EXPECT_EQ(
3514 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393515 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203516 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503517 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3518 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013519 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033520 handle1.Reset();
3521
Matt Menke9fa17d52019-03-25 19:12:263522 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3523 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3524 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3525 TestGroupId("a")));
3526 EXPECT_EQ(0u,
3527 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393528 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033529
Matt Menkebd12b7e2019-03-25 21:12:033530 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033531
Matt Menke9fa17d52019-03-25 19:12:263532 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3533 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3534 TestGroupId("a")));
3535 EXPECT_EQ(1u,
3536 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393537 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033538}
3539
3540TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3541 CreatePool(4, 4);
3542 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3543
3544 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523545 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203546 EXPECT_EQ(
3547 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393548 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203549 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503550 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3551 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013552 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033553
Matt Menke9fa17d52019-03-25 19:12:263554 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3555 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3556 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3557 TestGroupId("a")));
3558 EXPECT_EQ(0u,
3559 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393560 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263561 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033562
Matt Menkebd12b7e2019-03-25 21:12:033563 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033564
Matt Menke9fa17d52019-03-25 19:12:263565 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3566 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3567 TestGroupId("a")));
3568 EXPECT_EQ(1u,
3569 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393570 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263571 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033572}
3573
3574TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3575 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3576 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3577
Matt Menkebd12b7e2019-03-25 21:12:033578 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573579 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033580
Matt Menke9fa17d52019-03-25 19:12:263581 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3582 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3583 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3584 TestGroupId("a")));
3585 EXPECT_EQ(0u,
3586 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433587 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393588 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033589
Matt Menkebd12b7e2019-03-25 21:12:033590 pool_->RequestSockets(TestGroupId("b"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573591 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033592
Matt Menke9fa17d52019-03-25 19:12:263593 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3594 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3595 TestGroupId("b")));
3596 EXPECT_EQ(0u,
3597 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433598 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393599 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033600}
3601
[email protected]3c819f522010-12-02 02:03:123602TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3603 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3604 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3605
Matt Menkebd12b7e2019-03-25 21:12:033606 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573607 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123608
Matt Menke9fa17d52019-03-25 19:12:263609 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523610
3611 connect_job_factory_->set_job_type(
3612 TestConnectJob::kMockAdditionalErrorStateJob);
Matt Menkebd12b7e2019-03-25 21:12:033613 pool_->RequestSockets(TestGroupId("a"), params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573614 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523615
Matt Menke9fa17d52019-03-25 19:12:263616 ASSERT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123617}
3618
[email protected]8159a1c2012-06-07 00:00:103619TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033620 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433621 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033622
Matt Menkebd12b7e2019-03-25 21:12:033623 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033624
Matt Menke9fa17d52019-03-25 19:12:263625 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3626 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3627 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3628 TestGroupId("a")));
3629 EXPECT_EQ(2u,
3630 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3631 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393632 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033633
Matt Menkebd12b7e2019-03-25 21:12:033634 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263635 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3636 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3637 TestGroupId("a")));
3638 EXPECT_EQ(2u,
3639 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3640 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393641 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033642
3643 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523644 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203645 EXPECT_EQ(
3646 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393647 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203648 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503649 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3650 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433651
3652 client_socket_factory_.SignalJob(0);
3653 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3654
Matt Menke9fa17d52019-03-25 19:12:263655 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3656 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3657 TestGroupId("a")));
3658 EXPECT_EQ(1u,
3659 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3660 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393661 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033662
3663 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523664 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433665 EXPECT_EQ(
3666 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393667 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:433668 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503669 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3670 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433671 client_socket_factory_.SignalJob(0);
3672 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033673
Matt Menke9fa17d52019-03-25 19:12:263674 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3675 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3676 TestGroupId("a")));
3677 EXPECT_EQ(0u,
3678 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3679 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393680 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103681
[email protected]2c2bef152010-10-13 00:55:033682 handle1.Reset();
3683 handle2.Reset();
3684
Matt Menke9fa17d52019-03-25 19:12:263685 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3686 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3687 TestGroupId("a")));
3688 EXPECT_EQ(0u,
3689 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3690 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393691 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033692
Matt Menkebd12b7e2019-03-25 21:12:033693 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263694 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3695 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3696 TestGroupId("a")));
3697 EXPECT_EQ(0u,
3698 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3699 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393700 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033701}
3702
3703TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3704 CreatePool(4, 4);
3705 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3706
Matt Menkebd12b7e2019-03-25 21:12:033707 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033708
Matt Menke9fa17d52019-03-25 19:12:263709 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3710 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3711 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3712 TestGroupId("a")));
3713 EXPECT_EQ(1u,
3714 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393715 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033716
Matt Menkebd12b7e2019-03-25 21:12:033717 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263718 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3719 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3720 TestGroupId("a")));
3721 EXPECT_EQ(2u,
3722 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393723 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033724
Matt Menkebd12b7e2019-03-25 21:12:033725 pool_->RequestSockets(TestGroupId("a"), params_, 3, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263726 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3727 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3728 TestGroupId("a")));
3729 EXPECT_EQ(3u,
3730 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393731 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033732
Matt Menkebd12b7e2019-03-25 21:12:033733 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263734 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3735 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3736 TestGroupId("a")));
3737 EXPECT_EQ(3u,
3738 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393739 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033740}
3741
3742TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3743 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433744 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033745
Matt Menkebd12b7e2019-03-25 21:12:033746 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033747
Matt Menke9fa17d52019-03-25 19:12:263748 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3749 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3750 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3751 TestGroupId("a")));
3752 EXPECT_EQ(1u,
3753 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393754 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033755
3756 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523757 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203758 EXPECT_EQ(
3759 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393760 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203761 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503762 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3763 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033764
Matt Menke9fa17d52019-03-25 19:12:263765 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3766 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3767 TestGroupId("a")));
3768 EXPECT_EQ(0u,
3769 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393770 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033771
Lily Chenecebf932018-11-02 17:15:433772 client_socket_factory_.SignalJobs();
3773 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3774
Matt Menke9fa17d52019-03-25 19:12:263775 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3776 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3777 TestGroupId("a")));
3778 EXPECT_EQ(0u,
3779 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393780 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263781 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033782
[email protected]0dc88b32014-03-26 20:12:283783 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483784 // starts, it has a connect start time.
3785 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033786 handle1.Reset();
3787
Matt Menkec6b3edf72019-03-19 17:00:393788 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033789}
3790
[email protected]034df0f32013-01-07 23:17:483791// Checks that fully connected preconnect jobs have no connect times, and are
3792// marked as reused.
3793TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3794 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3795 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkebd12b7e2019-03-25 21:12:033796 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483797
Matt Menke9fa17d52019-03-25 19:12:263798 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3799 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3800 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3801 TestGroupId("a")));
3802 EXPECT_EQ(0u,
3803 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393804 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483805
3806 ClientSocketHandle handle;
3807 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:393808 EXPECT_EQ(OK, handle.Init(
3809 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3810 ClientSocketPool::RespectLimits::ENABLED,
3811 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3812 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483813
3814 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:393815 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483816
3817 TestLoadTimingInfoConnectedReused(handle);
3818 handle.Reset();
3819 TestLoadTimingInfoNotConnected(handle);
3820}
3821
[email protected]dcbe168a2010-12-02 03:14:463822// http://crbug.com/64940 regression test.
3823TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3824 const int kMaxTotalSockets = 3;
3825 const int kMaxSocketsPerGroup = 2;
3826 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433827 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:463828
Matt Menkef6edce752019-03-19 17:21:563829 // Note that group id ordering matters here. "a" comes before "b", so
[email protected]dcbe168a2010-12-02 03:14:463830 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3831
3832 // Set up one idle socket in "a".
3833 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523834 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203835 EXPECT_EQ(
3836 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393837 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203838 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503839 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3840 pool_.get(), NetLogWithSource()));
Matt Menke9fa17d52019-03-25 19:12:263841 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
3842 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3843 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3844 TestGroupId("a")));
3845 EXPECT_EQ(0u,
3846 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393847 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:463848
Lily Chenecebf932018-11-02 17:15:433849 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013850 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:263851 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3852 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3853 TestGroupId("a")));
3854 EXPECT_EQ(0u,
3855 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
3856 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433857
[email protected]dcbe168a2010-12-02 03:14:463858 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:393859 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:463860
3861 // Set up two active sockets in "b".
3862 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523863 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203864 EXPECT_EQ(
3865 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393866 handle1.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203867 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503868 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3869 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:203870 EXPECT_EQ(
3871 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393872 handle2.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203873 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503874 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3875 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463876
Matt Menke9fa17d52019-03-25 19:12:263877 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("b")));
3878 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3879 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3880 TestGroupId("b")));
3881 EXPECT_EQ(0u,
3882 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:393883 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:433884
3885 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013886 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3887 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:393888 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263889 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3890 TestGroupId("b")));
3891 EXPECT_EQ(0u,
3892 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
3893 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463894
3895 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3896 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3897 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3898 // sockets for "a", and "b" should still have 2 active sockets.
3899
Matt Menkebd12b7e2019-03-25 21:12:033900 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263901 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3902 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3903 TestGroupId("a")));
3904 EXPECT_EQ(0u,
3905 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393906 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263907 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
3908 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3909 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3910 TestGroupId("b")));
3911 EXPECT_EQ(0u,
3912 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:393913 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263914 EXPECT_EQ(2, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463915
3916 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3917 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3918 // "a" should result in closing 1 for "b".
3919 handle1.Reset();
3920 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:393921 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263922 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463923
Matt Menkebd12b7e2019-03-25 21:12:033924 pool_->RequestSockets(TestGroupId("a"), params_, 2, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263925 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3926 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3927 TestGroupId("a")));
3928 EXPECT_EQ(1u,
3929 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393930 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:263931 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
3932 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
3933 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3934 TestGroupId("b")));
3935 EXPECT_EQ(0u,
3936 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:393937 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menke9fa17d52019-03-25 19:12:263938 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463939}
3940
[email protected]b7b8be42011-07-12 12:46:413941TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:263942 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
3943 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:073944
3945 // Make the ConnectJob hang until it times out, shorten the timeout.
3946 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3947 connect_job_factory_->set_timeout_duration(
3948 base::TimeDelta::FromMilliseconds(500));
Matt Menkebd12b7e2019-03-25 21:12:033949 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263950 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3951 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3952 TestGroupId("a")));
3953 EXPECT_EQ(1u,
3954 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393955 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:073956
[email protected]b7b8be42011-07-12 12:46:413957 // Verify the backup timer doesn't create a backup job, by making
3958 // the backup job a pending job instead of a waiting job, so it
3959 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073960 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453961 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443962 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343963 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283964 base::RunLoop().Run();
Matt Menke9fa17d52019-03-25 19:12:263965 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:073966}
3967
[email protected]b7b8be42011-07-12 12:46:413968TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
Matt Menke9fa17d52019-03-25 19:12:263969 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
3970 true /* enable_backup_connect_jobs */);
[email protected]a9fc8fc2011-05-10 02:41:073971
3972 // Make the ConnectJob hang forever.
3973 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Matt Menkebd12b7e2019-03-25 21:12:033974 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Matt Menke9fa17d52019-03-25 19:12:263975 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3976 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3977 TestGroupId("a")));
3978 EXPECT_EQ(1u,
3979 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393980 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:283981 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073982
3983 // Make the backup job be a pending job, so it completes normally.
3984 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3985 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523986 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503987 EXPECT_EQ(
3988 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393989 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503990 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
3991 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
3992 NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413993 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menke9fa17d52019-03-25 19:12:263994 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
3995 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
3996 TestGroupId("a")));
3997 EXPECT_EQ(0u,
3998 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:393999 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264000 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:014001 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:074002
4003 // The hung connect job should still be there, but everything else should be
4004 // complete.
Matt Menke9fa17d52019-03-25 19:12:264005 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4006 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4007 TestGroupId("a")));
4008 EXPECT_EQ(1u,
4009 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394010 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264011 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:074012}
4013
[email protected]0dc88b32014-03-26 20:12:284014// Tests that a preconnect that starts out with unread data can still be used.
4015// http://crbug.com/334467
4016TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
4017 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4018 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
4019
Matt Menkebd12b7e2019-03-25 21:12:034020 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:284021
Matt Menke9fa17d52019-03-25 19:12:264022 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4023 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4024 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4025 TestGroupId("a")));
4026 EXPECT_EQ(0u,
4027 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394028 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284029
4030 // Fail future jobs to be sure that handle receives the preconnected socket
4031 // rather than closing it and making a new one.
4032 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
4033 ClientSocketHandle handle;
4034 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:394035 EXPECT_EQ(OK, handle.Init(
4036 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
4037 ClientSocketPool::RespectLimits::ENABLED,
4038 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
4039 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:284040
Matt Menke9fa17d52019-03-25 19:12:264041 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4042 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4043 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4044 TestGroupId("a")));
4045 EXPECT_EQ(0u,
4046 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394047 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:264048 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284049
4050 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:354051 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:284052
4053 TestLoadTimingInfoConnectedReused(handle);
4054 handle.Reset();
4055
4056 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:394057 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:284058}
4059
Lily Chenecebf932018-11-02 17:15:434060TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
4061 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4062 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4063
4064 ClientSocketHandle handle1;
4065 TestCompletionCallback callback1;
4066 EXPECT_EQ(
4067 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394068 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434069 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504070 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4071 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434072
Matt Menke9fa17d52019-03-25 19:12:264073 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4074 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4075 TestGroupId("a")));
4076 EXPECT_EQ(0u,
4077 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394078 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434079
Matt Menkec6b3edf72019-03-19 17:00:394080 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4081 &handle1));
Lily Chenecebf932018-11-02 17:15:434082}
4083
4084TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4085 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4086 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4087
4088 ClientSocketHandle handle1;
4089 TestCompletionCallback callback1;
4090 EXPECT_EQ(
4091 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394092 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434093 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504094 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4095 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434096
Matt Menke9fa17d52019-03-25 19:12:264097 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4098 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4099 TestGroupId("a")));
4100 EXPECT_EQ(0u,
4101 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394102 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434103
4104 ClientSocketHandle handle2;
4105 TestCompletionCallback callback2;
4106 EXPECT_EQ(
4107 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394108 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434109 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504110 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4111 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434112
Matt Menke9fa17d52019-03-25 19:12:264113 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4114 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4115 TestGroupId("a")));
4116 EXPECT_EQ(0u,
4117 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394118 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434119
Matt Menkec6b3edf72019-03-19 17:00:394120 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4121 &handle1));
4122 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4123 &handle2));
Lily Chenecebf932018-11-02 17:15:434124
4125 // One job completes. The other request should still have its job.
4126 client_socket_factory_.SignalJob(0);
4127 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4128
Matt Menke9fa17d52019-03-25 19:12:264129 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4130 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4131 TestGroupId("a")));
4132 EXPECT_EQ(0u,
4133 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4134 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394135 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434136
Matt Menkec6b3edf72019-03-19 17:00:394137 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4138 &handle2));
Lily Chenecebf932018-11-02 17:15:434139}
4140
4141TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4142 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4143 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4144
Matt Menkebd12b7e2019-03-25 21:12:034145 pool_->RequestSockets(TestGroupId("a"), params_, 1, NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434146
Matt Menke9fa17d52019-03-25 19:12:264147 ASSERT_TRUE(pool_->HasGroupForTesting(TestGroupId("a")));
4148 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4149 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4150 TestGroupId("a")));
4151 EXPECT_EQ(1u,
4152 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394153 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434154
4155 ClientSocketHandle handle1;
4156 TestCompletionCallback callback1;
4157 EXPECT_EQ(
4158 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394159 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434160 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504161 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4162 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434163
Matt Menke9fa17d52019-03-25 19:12:264164 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4165 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4166 TestGroupId("a")));
4167 EXPECT_EQ(0u,
4168 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394169 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434170
Matt Menkec6b3edf72019-03-19 17:00:394171 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4172 &handle1));
Lily Chenecebf932018-11-02 17:15:434173}
4174
4175TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4176 CreatePool(kDefaultMaxSockets, 1);
4177 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4178
4179 ClientSocketHandle handle1;
4180 TestCompletionCallback callback1;
4181 EXPECT_EQ(
4182 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394183 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434184 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504185 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4186 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434187
Matt Menke9fa17d52019-03-25 19:12:264188 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4189 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4190 TestGroupId("a")));
4191 EXPECT_EQ(0u,
4192 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394193 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434194
Matt Menkec6b3edf72019-03-19 17:00:394195 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4196 &handle1));
Lily Chenecebf932018-11-02 17:15:434197
4198 // Insert a higher priority request
4199 ClientSocketHandle handle2;
4200 TestCompletionCallback callback2;
4201 EXPECT_EQ(
4202 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394203 handle2.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434204 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504205 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4206 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434207
Matt Menke9fa17d52019-03-25 19:12:264208 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4209 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4210 TestGroupId("a")));
4211 EXPECT_EQ(0u,
4212 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394213 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434214
4215 // The highest priority request should steal the job from the default priority
4216 // request.
Matt Menkec6b3edf72019-03-19 17:00:394217 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4218 &handle2));
4219 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4220 &handle1));
Lily Chenecebf932018-11-02 17:15:434221}
4222
4223TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4224 CreatePool(3, 3);
4225 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4226
4227 ClientSocketHandle handle_lowest;
4228 TestCompletionCallback callback_lowest;
4229 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394230 handle_lowest.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434231 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504232 callback_lowest.callback(),
4233 ClientSocketPool::ProxyAuthCallback(),
4234 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434235
Matt Menke9fa17d52019-03-25 19:12:264236 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4237 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4238 TestGroupId("a")));
4239 EXPECT_EQ(0u,
4240 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394241 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434242
4243 ClientSocketHandle handle_highest;
4244 TestCompletionCallback callback_highest;
4245 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394246 handle_highest.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434247 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504248 callback_highest.callback(),
4249 ClientSocketPool::ProxyAuthCallback(),
4250 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434251
Matt Menke9fa17d52019-03-25 19:12:264252 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4253 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4254 TestGroupId("a")));
4255 EXPECT_EQ(0u,
4256 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394257 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434258
4259 ClientSocketHandle handle_low;
4260 TestCompletionCallback callback_low;
4261 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394262 handle_low.Init(TestGroupId("a"), params_, LOW, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434263 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504264 callback_low.callback(),
4265 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
Lily Chenecebf932018-11-02 17:15:434266 NetLogWithSource()));
4267
Matt Menke9fa17d52019-03-25 19:12:264268 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4269 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4270 TestGroupId("a")));
4271 EXPECT_EQ(0u,
4272 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394273 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434274
4275 ClientSocketHandle handle_lowest2;
4276 TestCompletionCallback callback_lowest2;
4277 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394278 handle_lowest2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434279 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504280 callback_lowest2.callback(),
4281 ClientSocketPool::ProxyAuthCallback(),
4282 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434283
Matt Menke9fa17d52019-03-25 19:12:264284 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4285 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4286 TestGroupId("a")));
4287 EXPECT_EQ(0u,
4288 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394289 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434290
4291 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394292 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4293 &handle_highest));
4294 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4295 &handle_low));
4296 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4297 &handle_lowest));
4298 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4299 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434300
4301 // Add another request with medium priority. It should steal the job from the
4302 // lowest priority request with a job.
4303 ClientSocketHandle handle_medium;
4304 TestCompletionCallback callback_medium;
4305 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394306 handle_medium.Init(TestGroupId("a"), params_, MEDIUM, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434307 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504308 callback_medium.callback(),
4309 ClientSocketPool::ProxyAuthCallback(),
4310 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434311
Matt Menke9fa17d52019-03-25 19:12:264312 EXPECT_EQ(3u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4313 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4314 TestGroupId("a")));
4315 EXPECT_EQ(0u,
4316 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394317 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4318 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4319 &handle_highest));
4320 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4321 &handle_medium));
4322 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4323 &handle_low));
4324 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4325 &handle_lowest));
4326 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4327 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434328}
4329
4330TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4331 CreatePool(kDefaultMaxSockets, 1);
4332 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4333
4334 ClientSocketHandle handle1;
4335 TestCompletionCallback callback1;
4336 EXPECT_EQ(
4337 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394338 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434339 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504340 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4341 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434342
Matt Menke9fa17d52019-03-25 19:12:264343 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4344 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4345 TestGroupId("a")));
4346 EXPECT_EQ(0u,
4347 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394348 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434349
4350 ClientSocketHandle handle2;
4351 TestCompletionCallback callback2;
4352 EXPECT_EQ(
4353 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394354 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434355 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504356 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4357 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434358
Matt Menke9fa17d52019-03-25 19:12:264359 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4360 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4361 TestGroupId("a")));
4362 EXPECT_EQ(0u,
4363 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394364 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434365
4366 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394367 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4368 &handle1));
4369 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4370 &handle2));
Lily Chenecebf932018-11-02 17:15:434371
4372 // Reprioritizing the second request places it above the first, and it steals
4373 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394374 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4375 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4376 &handle2));
4377 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4378 &handle1));
Lily Chenecebf932018-11-02 17:15:434379}
4380
4381TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4382 CreatePool(kDefaultMaxSockets, 1);
4383 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4384
4385 ClientSocketHandle handle1;
4386 TestCompletionCallback callback1;
4387 EXPECT_EQ(
4388 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394389 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434390 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504391 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4392 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434393
Matt Menke9fa17d52019-03-25 19:12:264394 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4395 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4396 TestGroupId("a")));
4397 EXPECT_EQ(0u,
4398 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394399 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434400
Matt Menkec6b3edf72019-03-19 17:00:394401 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4402 &handle1));
Lily Chenecebf932018-11-02 17:15:434403
4404 ClientSocketHandle handle2;
4405 TestCompletionCallback callback2;
4406 EXPECT_EQ(
4407 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394408 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434409 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504410 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4411 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434412
Matt Menke9fa17d52019-03-25 19:12:264413 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4414 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4415 TestGroupId("a")));
4416 EXPECT_EQ(0u,
4417 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394418 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434419
4420 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394421 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4422 &handle1));
4423 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4424 &handle2));
Lily Chenecebf932018-11-02 17:15:434425
4426 // The second request should get a job upon cancelling the first request.
4427 handle1.Reset();
Matt Menke9fa17d52019-03-25 19:12:264428 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4429 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4430 TestGroupId("a")));
4431 EXPECT_EQ(0u,
4432 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394433 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434434
Matt Menkec6b3edf72019-03-19 17:00:394435 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4436 &handle2));
Lily Chenecebf932018-11-02 17:15:434437}
4438
4439TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4440 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4441 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4442
4443 ClientSocketHandle handle1;
4444 TestCompletionCallback callback1;
4445 EXPECT_EQ(
4446 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394447 handle1.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434448 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504449 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4450 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434451
Matt Menke9fa17d52019-03-25 19:12:264452 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4453 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4454 TestGroupId("a")));
4455 EXPECT_EQ(0u,
4456 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394457 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434458
4459 ClientSocketHandle handle2;
4460 TestCompletionCallback callback2;
4461 EXPECT_EQ(
4462 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394463 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434464 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504465 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4466 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434467
Matt Menke9fa17d52019-03-25 19:12:264468 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4469 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4470 TestGroupId("a")));
4471 EXPECT_EQ(0u,
4472 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394473 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434474
Matt Menkec6b3edf72019-03-19 17:00:394475 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4476 &handle1));
4477 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4478 &handle2));
Lily Chenecebf932018-11-02 17:15:434479
4480 // The lower-priority job completes first. The higher-priority request should
4481 // get the socket, and the lower-priority request should get the remaining
4482 // job.
4483 client_socket_factory_.SignalJob(1);
4484 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menke9fa17d52019-03-25 19:12:264485 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4486 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroupForTesting(
4487 TestGroupId("a")));
4488 EXPECT_EQ(0u,
4489 pool_->NumUnassignedConnectJobsInGroupForTesting(TestGroupId("a")));
4490 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394491 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434492 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394493 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4494 &handle2));
Lily Chenecebf932018-11-02 17:15:434495}
4496
[email protected]043b68c82013-08-22 23:41:524497class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204498 public:
Matt Menke9fa17d52019-03-25 19:12:264499 MockLayeredPool(TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394500 const ClientSocketPool::GroupId& group_id)
4501 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524502 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204503 }
4504
Daniel Cheng4496d0822018-04-26 21:52:154505 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204506
Matt Menke9fa17d52019-03-25 19:12:264507 int RequestSocket(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504508 return handle_.Init(
Matt Menke9fa17d52019-03-25 19:12:264509 group_id_, CreateDummyParams(), DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504510 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4511 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204512 }
4513
Matt Menke9fa17d52019-03-25 19:12:264514 int RequestSocketWithoutLimits(TransportClientSocketPool* pool) {
Matt Menke28ac03e2019-02-25 22:25:504515 return handle_.Init(
Matt Menke9fa17d52019-03-25 19:12:264516 group_id_, CreateDummyParams(), MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504517 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4518 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204519 }
4520
4521 bool ReleaseOneConnection() {
4522 if (!handle_.is_initialized() || !can_release_connection_) {
4523 return false;
4524 }
4525 handle_.socket()->Disconnect();
4526 handle_.Reset();
4527 return true;
4528 }
4529
4530 void set_can_release_connection(bool can_release_connection) {
4531 can_release_connection_ = can_release_connection;
4532 }
4533
4534 MOCK_METHOD0(CloseOneIdleConnection, bool());
4535
4536 private:
Matt Menke9fa17d52019-03-25 19:12:264537 TransportClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204538 ClientSocketHandle handle_;
4539 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394540 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204541 bool can_release_connection_;
4542};
4543
[email protected]58e562f2013-04-22 17:32:204544// Tests the basic case of closing an idle socket in a higher layered pool when
4545// a new request is issued and the lower layer pool is stalled.
4546TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4547 CreatePool(1, 1);
4548 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4549
Matt Menkec6b3edf72019-03-19 17:00:394550 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014551 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204552 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4553 .WillOnce(Invoke(&mock_layered_pool,
4554 &MockLayeredPool::ReleaseOneConnection));
4555 ClientSocketHandle handle;
4556 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504557 EXPECT_EQ(
4558 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394559 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504560 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4561 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4562 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014563 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204564}
4565
Matt Menke833678642019-03-05 22:05:514566// Tests the case that trying to close an idle socket in a higher layered pool
4567// fails.
4568TEST_F(ClientSocketPoolBaseTest,
4569 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4570 CreatePool(1, 1);
4571 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4572
Matt Menkec6b3edf72019-03-19 17:00:394573 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514574 mock_layered_pool.set_can_release_connection(false);
4575 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4576 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4577 .WillOnce(Invoke(&mock_layered_pool,
4578 &MockLayeredPool::ReleaseOneConnection));
4579 ClientSocketHandle handle;
4580 TestCompletionCallback callback;
4581 EXPECT_EQ(
4582 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394583 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke833678642019-03-05 22:05:514584 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4585 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4586 NetLogWithSource()));
4587 base::RunLoop().RunUntilIdle();
4588 EXPECT_FALSE(callback.have_result());
4589}
4590
[email protected]58e562f2013-04-22 17:32:204591// Same as above, but the idle socket is in the same group as the stalled
4592// socket, and closes the only other request in its group when closing requests
4593// in higher layered pools. This generally shouldn't happen, but it may be
4594// possible if a higher level pool issues a request and the request is
4595// subsequently cancelled. Even if it's not possible, best not to crash.
4596TEST_F(ClientSocketPoolBaseTest,
4597 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4598 CreatePool(2, 2);
4599 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4600
4601 // Need a socket in another group for the pool to be stalled (If a group
4602 // has the maximum number of connections already, it's not stalled).
4603 ClientSocketHandle handle1;
4604 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394605 EXPECT_EQ(OK, handle1.Init(
4606 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4607 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4608 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4609 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204610
Matt Menkec6b3edf72019-03-19 17:00:394611 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014612 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204613 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4614 .WillOnce(Invoke(&mock_layered_pool,
4615 &MockLayeredPool::ReleaseOneConnection));
4616 ClientSocketHandle handle;
4617 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:504618 EXPECT_EQ(
4619 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394620 handle.Init(TestGroupId("group2"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504621 ClientSocketPool::RespectLimits::ENABLED,
4622 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4623 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014624 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204625}
4626
4627// Tests the case when an idle socket can be closed when a new request is
4628// issued, and the new request belongs to a group that was previously stalled.
4629TEST_F(ClientSocketPoolBaseTest,
4630 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4631 CreatePool(2, 2);
4632 std::list<TestConnectJob::JobType> job_types;
4633 job_types.push_back(TestConnectJob::kMockJob);
4634 job_types.push_back(TestConnectJob::kMockJob);
4635 job_types.push_back(TestConnectJob::kMockJob);
4636 job_types.push_back(TestConnectJob::kMockJob);
4637 connect_job_factory_->set_job_types(&job_types);
4638
4639 ClientSocketHandle handle1;
4640 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394641 EXPECT_EQ(OK, handle1.Init(
4642 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4643 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4644 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4645 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204646
Matt Menkec6b3edf72019-03-19 17:00:394647 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014648 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204649 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4650 .WillRepeatedly(Invoke(&mock_layered_pool,
4651 &MockLayeredPool::ReleaseOneConnection));
4652 mock_layered_pool.set_can_release_connection(false);
4653
4654 // The third request is made when the socket pool is in a stalled state.
4655 ClientSocketHandle handle3;
4656 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204657 EXPECT_EQ(
4658 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394659 handle3.Init(TestGroupId("group3"), params_, DEFAULT_PRIORITY,
4660 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504661 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4662 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204663
4664 base::RunLoop().RunUntilIdle();
4665 EXPECT_FALSE(callback3.have_result());
4666
4667 // The fourth request is made when the pool is no longer stalled. The third
4668 // request should be serviced first, since it was issued first and has the
4669 // same priority.
4670 mock_layered_pool.set_can_release_connection(true);
4671 ClientSocketHandle handle4;
4672 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204673 EXPECT_EQ(
4674 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394675 handle4.Init(TestGroupId("group3"), params_, DEFAULT_PRIORITY,
4676 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504677 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4678 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014679 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204680 EXPECT_FALSE(callback4.have_result());
4681
4682 // Closing a handle should free up another socket slot.
4683 handle1.Reset();
robpercival214763f2016-07-01 23:27:014684 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204685}
4686
4687// Tests the case when an idle socket can be closed when a new request is
4688// issued, and the new request belongs to a group that was previously stalled.
4689//
4690// The two differences from the above test are that the stalled requests are not
4691// in the same group as the layered pool's request, and the the fourth request
4692// has a higher priority than the third one, so gets a socket first.
4693TEST_F(ClientSocketPoolBaseTest,
4694 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4695 CreatePool(2, 2);
4696 std::list<TestConnectJob::JobType> job_types;
4697 job_types.push_back(TestConnectJob::kMockJob);
4698 job_types.push_back(TestConnectJob::kMockJob);
4699 job_types.push_back(TestConnectJob::kMockJob);
4700 job_types.push_back(TestConnectJob::kMockJob);
4701 connect_job_factory_->set_job_types(&job_types);
4702
4703 ClientSocketHandle handle1;
4704 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394705 EXPECT_EQ(OK, handle1.Init(
4706 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4707 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4708 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4709 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204710
Matt Menkec6b3edf72019-03-19 17:00:394711 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014712 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204713 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4714 .WillRepeatedly(Invoke(&mock_layered_pool,
4715 &MockLayeredPool::ReleaseOneConnection));
4716 mock_layered_pool.set_can_release_connection(false);
4717
4718 // The third request is made when the socket pool is in a stalled state.
4719 ClientSocketHandle handle3;
4720 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204721 EXPECT_EQ(
4722 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394723 handle3.Init(TestGroupId("group3"), params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:204724 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504725 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4726 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204727
4728 base::RunLoop().RunUntilIdle();
4729 EXPECT_FALSE(callback3.have_result());
4730
4731 // The fourth request is made when the pool is no longer stalled. This
4732 // request has a higher priority than the third request, so is serviced first.
4733 mock_layered_pool.set_can_release_connection(true);
4734 ClientSocketHandle handle4;
4735 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204736 EXPECT_EQ(
4737 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394738 handle4.Init(TestGroupId("group3"), params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:204739 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504740 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4741 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014742 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204743 EXPECT_FALSE(callback3.have_result());
4744
4745 // Closing a handle should free up another socket slot.
4746 handle1.Reset();
robpercival214763f2016-07-01 23:27:014747 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204748}
4749
4750TEST_F(ClientSocketPoolBaseTest,
4751 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4752 CreatePool(1, 1);
4753 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4754
Matt Menkec6b3edf72019-03-19 17:00:394755 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014756 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204757 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4758 .WillRepeatedly(Invoke(&mock_layered_pool1,
4759 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:394760 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:014761 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4762 IsOk());
[email protected]58e562f2013-04-22 17:32:204763 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4764 .WillRepeatedly(Invoke(&mock_layered_pool2,
4765 &MockLayeredPool::ReleaseOneConnection));
4766 ClientSocketHandle handle;
4767 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504768 EXPECT_EQ(
4769 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394770 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504771 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4772 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4773 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014774 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204775}
4776
[email protected]b021ece62013-06-11 11:06:334777// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154778// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4779// socket instead of a request with the same priority that was issued earlier,
4780// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334781TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334782 CreatePool(1, 1);
4783
4784 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:394785 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
4786 TestGroupId("a"), MAXIMUM_PRIORITY,
4787 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264788 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334789
4790 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4791
mmenked3641e12016-01-28 16:06:154792 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394793 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154794 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264795 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334796
mmenked3641e12016-01-28 16:06:154797 // Issue a request that ignores the limits, so a new ConnectJob is
4798 // created.
4799 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394800 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154801 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:264802 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334803
robpercival214763f2016-07-01 23:27:014804 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334805 EXPECT_FALSE(request(1)->have_result());
4806}
4807
[email protected]c55fabd2013-11-04 23:26:564808// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154809// issued for a request with RespectLimits::DISABLED is not cancelled when a
4810// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564811TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564812 CreatePool(1, 1);
4813
4814 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:394815 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
4816 TestGroupId("a"), MAXIMUM_PRIORITY,
4817 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264818 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:564819
4820 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4821
mmenked3641e12016-01-28 16:06:154822 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394823 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154824 ClientSocketPool::RespectLimits::ENABLED));
Matt Menke9fa17d52019-03-25 19:12:264825 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:564826
mmenked3641e12016-01-28 16:06:154827 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4828 // created.
4829 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394830 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154831 ClientSocketPool::RespectLimits::DISABLED));
Matt Menke9fa17d52019-03-25 19:12:264832 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334833
mmenked3641e12016-01-28 16:06:154834 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334835 // should not be cancelled.
4836 request(1)->handle()->Reset();
Matt Menke9fa17d52019-03-25 19:12:264837 ASSERT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334838
robpercival214763f2016-07-01 23:27:014839 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334840 EXPECT_FALSE(request(1)->have_result());
4841}
4842
Matt Menkeb57663b32019-03-01 17:17:104843TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
4844 CreatePool(1, 1);
4845
4846 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4847
4848 ClientSocketHandle handle;
4849 TestCompletionCallback callback;
4850 EXPECT_EQ(
4851 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394852 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menkeb57663b32019-03-01 17:17:104853 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4854 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4855 NetLogWithSource()));
4856
Matt Menke9fa17d52019-03-25 19:12:264857 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104858
4859 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
4860 EXPECT_FALSE(handle.is_initialized());
4861 EXPECT_FALSE(handle.socket());
4862
4863 // The group should now be empty, and thus be deleted.
Matt Menke9fa17d52019-03-25 19:12:264864 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104865}
4866
4867class TestAuthHelper {
4868 public:
4869 TestAuthHelper() = default;
4870 ~TestAuthHelper() = default;
4871
Matt Menkec6b3edf72019-03-19 17:00:394872 void InitHandle(
Matt Menke84d11e562019-03-27 00:11:194873 scoped_refptr<ClientSocketPool::SocketParams> params,
Matt Menke9fa17d52019-03-25 19:12:264874 TransportClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394875 RequestPriority priority = DEFAULT_PRIORITY,
4876 ClientSocketPool::RespectLimits respect_limits =
4877 ClientSocketPool::RespectLimits::ENABLED,
4878 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:104879 EXPECT_EQ(ERR_IO_PENDING,
Matt Menke9fa17d52019-03-25 19:12:264880 handle_.Init(group_id_in, params, priority, SocketTag(),
Matt Menkeb57663b32019-03-01 17:17:104881 respect_limits, callback_.callback(),
4882 base::BindRepeating(&TestAuthHelper::AuthCallback,
4883 base::Unretained(this)),
4884 pool, NetLogWithSource()));
4885 }
4886
4887 void WaitForAuth() {
4888 run_loop_ = std::make_unique<base::RunLoop>();
4889 run_loop_->Run();
4890 run_loop_.reset();
4891 }
4892
4893 void WaitForAuthAndRestartSync() {
4894 restart_sync_ = true;
4895 WaitForAuth();
4896 restart_sync_ = false;
4897 }
4898
4899 void WaitForAuthAndResetHandleSync() {
4900 reset_handle_sync_ = true;
4901 WaitForAuth();
4902 reset_handle_sync_ = false;
4903 }
4904
4905 void RestartWithAuth() {
4906 DCHECK(restart_with_auth_callback_);
4907 std::move(restart_with_auth_callback_).Run();
4908 }
4909
4910 int WaitForResult() {
4911 int result = callback_.WaitForResult();
4912 // There shouldn't be any callback waiting to be invoked once the request is
4913 // complete.
4914 EXPECT_FALSE(restart_with_auth_callback_);
4915 // The socket should only be initialized on success.
4916 EXPECT_EQ(result == OK, handle_.is_initialized());
4917 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
4918 return result;
4919 }
4920
4921 ClientSocketHandle* handle() { return &handle_; }
4922 int auth_count() const { return auth_count_; }
4923 int have_result() const { return callback_.have_result(); }
4924
4925 private:
4926 void AuthCallback(const HttpResponseInfo& response,
4927 HttpAuthController* auth_controller,
4928 base::OnceClosure restart_with_auth_callback) {
4929 EXPECT_FALSE(restart_with_auth_callback_);
4930 EXPECT_TRUE(restart_with_auth_callback);
4931
4932 // Once there's a result, this method shouldn't be invoked again.
4933 EXPECT_FALSE(callback_.have_result());
4934
4935 ++auth_count_;
4936 run_loop_->Quit();
4937 if (restart_sync_) {
4938 std::move(restart_with_auth_callback).Run();
4939 return;
4940 }
4941
4942 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
4943
4944 if (reset_handle_sync_) {
4945 handle_.Reset();
4946 return;
4947 }
4948 }
4949
4950 std::unique_ptr<base::RunLoop> run_loop_;
4951 base::OnceClosure restart_with_auth_callback_;
4952
4953 bool restart_sync_ = false;
4954 bool reset_handle_sync_ = false;
4955
4956 ClientSocketHandle handle_;
4957 int auth_count_ = 0;
4958 TestCompletionCallback callback_;
4959
4960 DISALLOW_COPY_AND_ASSIGN(TestAuthHelper);
4961};
4962
4963TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
4964 CreatePool(1, 1);
4965 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4966
4967 TestAuthHelper auth_helper;
4968 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:264969 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014970 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:394971 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104972
4973 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:264974 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014975 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:394976 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104977
4978 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:264979 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014980 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:394981 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104982
4983 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
4984 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:264985 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
4986 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:394987 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104988 EXPECT_EQ(0, pool_->IdleSocketCount());
4989}
4990
4991TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
4992 CreatePool(1, 1);
4993 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4994
4995 TestAuthHelper auth_helper;
4996 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:264997 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014998 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:394999 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105000
5001 auth_helper.WaitForAuthAndRestartSync();
Matt Menke9fa17d52019-03-25 19:12:265002 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015003 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395004 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105005
5006 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5007 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265008 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5009 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395010 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105011 EXPECT_EQ(0, pool_->IdleSocketCount());
5012}
5013
5014TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
5015 CreatePool(1, 1);
5016 connect_job_factory_->set_job_type(
5017 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5018
5019 TestAuthHelper auth_helper;
5020 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265021 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105022
5023 auth_helper.WaitForAuth();
5024 auth_helper.RestartWithAuth();
5025 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5026
5027 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265028 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105029 EXPECT_EQ(0, pool_->IdleSocketCount());
5030}
5031
5032TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
5033 CreatePool(1, 1);
5034 connect_job_factory_->set_job_type(
5035 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5036
5037 TestAuthHelper auth_helper;
5038 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265039 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105040
5041 auth_helper.WaitForAuthAndRestartSync();
5042 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5043
5044 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265045 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105046 EXPECT_EQ(0, pool_->IdleSocketCount());
5047}
5048
5049TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
5050 CreatePool(1, 1);
5051 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5052
5053 TestAuthHelper auth_helper;
5054 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265055 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105056
5057 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265058 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105059
5060 auth_helper.handle()->Reset();
5061
5062 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265063 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105064 EXPECT_EQ(0, pool_->IdleSocketCount());
5065 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5066 EXPECT_FALSE(auth_helper.handle()->socket());
5067}
5068
5069TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
5070 CreatePool(1, 1);
5071 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5072
5073 TestAuthHelper auth_helper;
5074 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265075 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105076
5077 auth_helper.WaitForAuthAndResetHandleSync();
5078 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265079 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105080 EXPECT_EQ(0, pool_->IdleSocketCount());
5081 EXPECT_FALSE(auth_helper.handle()->is_initialized());
5082 EXPECT_FALSE(auth_helper.handle()->socket());
5083}
5084
5085TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
5086 CreatePool(1, 1);
5087 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
5088
5089 TestAuthHelper auth_helper;
5090 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265091 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105092
5093 auth_helper.WaitForAuth();
5094
5095 pool_->FlushWithError(ERR_FAILED);
5096 base::RunLoop().RunUntilIdle();
5097
5098 // When flushing the socket pool, bound sockets should delay returning the
5099 // error until completion.
5100 EXPECT_FALSE(auth_helper.have_result());
Matt Menke9fa17d52019-03-25 19:12:265101 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105102 EXPECT_EQ(0, pool_->IdleSocketCount());
5103
5104 auth_helper.RestartWithAuth();
5105 // The callback should be called asynchronously.
5106 EXPECT_FALSE(auth_helper.have_result());
5107
5108 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menke9fa17d52019-03-25 19:12:265109 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105110 EXPECT_EQ(0, pool_->IdleSocketCount());
5111}
5112
5113TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5114 CreatePool(1, 1);
5115 connect_job_factory_->set_job_type(
5116 TestConnectJob::kMockAuthChallengeTwiceJob);
5117
5118 TestAuthHelper auth_helper;
5119 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265120 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015121 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395122 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105123
5124 auth_helper.WaitForAuth();
5125 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265126 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105127 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015128 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395129 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105130
5131 auth_helper.WaitForAuth();
Matt Menke9fa17d52019-03-25 19:12:265132 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015133 EXPECT_EQ(2, auth_helper.auth_count());
5134 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395135 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015136
Matt Menkeb57663b32019-03-01 17:17:105137 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265138 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105139 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015140 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395141 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105142
5143 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5144 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265145 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5146 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395147 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105148 EXPECT_EQ(0, pool_->IdleSocketCount());
5149}
5150
5151TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5152 CreatePool(1, 1);
5153 connect_job_factory_->set_job_type(
5154 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5155
5156 TestAuthHelper auth_helper;
5157 auth_helper.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265158 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105159
5160 auth_helper.WaitForAuth();
5161 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265162 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105163 EXPECT_EQ(1, auth_helper.auth_count());
5164
5165 auth_helper.WaitForAuth();
5166 auth_helper.RestartWithAuth();
Matt Menke9fa17d52019-03-25 19:12:265167 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105168 EXPECT_EQ(2, auth_helper.auth_count());
5169
5170 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5171 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265172 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105173 EXPECT_EQ(0, pool_->IdleSocketCount());
5174}
5175
5176// Makes sure that when a bound request is destroyed, a new ConnectJob is
5177// created, if needed.
5178TEST_F(ClientSocketPoolBaseTest,
5179 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5180 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5181 connect_job_factory_->set_job_type(
5182 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5183
5184 // First request creates a ConnectJob.
5185 TestAuthHelper auth_helper1;
5186 auth_helper1.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265187 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105188
5189 // A second request come in, but no new ConnectJob is needed, since the limit
5190 // has been reached.
5191 TestAuthHelper auth_helper2;
5192 auth_helper2.InitHandle(params_, pool_.get());
Matt Menke9fa17d52019-03-25 19:12:265193 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105194
5195 // Run until the auth callback for the first request is invoked.
5196 auth_helper1.WaitForAuth();
5197 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265198 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5199 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395200 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105201
5202 // Make connect jobs succeed, then cancel the first request, which should
5203 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5204 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5205 auth_helper1.handle()->Reset();
5206 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265207 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105208
5209 // The second ConnectJob should succeed.
5210 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5211 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265212 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105213}
5214
5215// Makes sure that when a bound request is destroyed, a new ConnectJob is
5216// created for another group, if needed.
5217TEST_F(ClientSocketPoolBaseTest,
5218 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5219 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5220 connect_job_factory_->set_job_type(
5221 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5222
5223 // First request creates a ConnectJob.
5224 TestAuthHelper auth_helper1;
5225 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menke9fa17d52019-03-25 19:12:265226 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105227
5228 // A second request come in, but no new ConnectJob is needed, since the limit
5229 // has been reached.
5230 TestAuthHelper auth_helper2;
5231 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395232 ClientSocketPool::RespectLimits::ENABLED,
5233 TestGroupId("b"));
Matt Menke9fa17d52019-03-25 19:12:265234 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5235 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105236
5237 // Run until the auth callback for the first request is invoked.
5238 auth_helper1.WaitForAuth();
5239 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265240 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5241 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395242 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menke9fa17d52019-03-25 19:12:265243 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
5244 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("b")));
Matt Menkec6b3edf72019-03-19 17:00:395245 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105246
5247 // Make connect jobs succeed, then cancel the first request, which should
5248 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5249 // other group.
5250 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5251 auth_helper1.handle()->Reset();
5252 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265253 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5254 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105255
5256 // The second ConnectJob should succeed.
5257 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5258 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265259 EXPECT_FALSE(pool_->HasGroupForTesting(TestGroupId("a")));
5260 EXPECT_EQ(0u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105261}
5262
5263// Test that once an auth challenge is bound, that's the request that gets all
5264// subsequent calls and the socket itself.
5265TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5266 CreatePool(1, 1);
5267 connect_job_factory_->set_job_type(
5268 TestConnectJob::kMockAuthChallengeTwiceJob);
5269
5270 // First request creates a ConnectJob.
5271 TestAuthHelper auth_helper1;
5272 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menke9fa17d52019-03-25 19:12:265273 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105274
5275 // A second, higher priority request is made.
5276 TestAuthHelper auth_helper2;
5277 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menke9fa17d52019-03-25 19:12:265278 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105279
5280 // Run until the auth callback for the second request is invoked.
5281 auth_helper2.WaitForAuth();
5282 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menke9fa17d52019-03-25 19:12:265283 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5284 EXPECT_EQ(0, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkec6b3edf72019-03-19 17:00:395285 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105286
5287 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5288 // ConnectJob.
5289 TestAuthHelper auth_helper3;
5290 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menke9fa17d52019-03-25 19:12:265291 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105292
5293 // Start a higher job that ignores limits, creating a hanging socket. It
5294 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5295 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5296 TestAuthHelper auth_helper4;
5297 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5298 ClientSocketPool::RespectLimits::DISABLED);
Matt Menke9fa17d52019-03-25 19:12:265299 EXPECT_EQ(2u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105300
5301 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5302 // again.
5303 auth_helper2.RestartWithAuth();
5304 auth_helper2.WaitForAuth();
5305 EXPECT_EQ(0, auth_helper1.auth_count());
5306 EXPECT_FALSE(auth_helper1.have_result());
5307 EXPECT_EQ(2, auth_helper2.auth_count());
5308 EXPECT_FALSE(auth_helper2.have_result());
5309 EXPECT_EQ(0, auth_helper3.auth_count());
5310 EXPECT_FALSE(auth_helper3.have_result());
5311 EXPECT_EQ(0, auth_helper4.auth_count());
5312 EXPECT_FALSE(auth_helper4.have_result());
5313
5314 // Advance auth again, and |auth_helper2| should get the socket.
5315 auth_helper2.RestartWithAuth();
5316 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5317 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5318 // socket pool.
Matt Menke9fa17d52019-03-25 19:12:265319 EXPECT_EQ(1u, pool_->NumConnectJobsInGroupForTesting(TestGroupId("a")));
5320 EXPECT_EQ(1, pool_->NumActiveSocketsInGroupForTesting(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105321 EXPECT_EQ(0, auth_helper1.auth_count());
5322 EXPECT_FALSE(auth_helper1.have_result());
5323 EXPECT_EQ(0, auth_helper3.auth_count());
5324 EXPECT_FALSE(auth_helper3.have_result());
5325 EXPECT_EQ(0, auth_helper4.auth_count());
5326 EXPECT_FALSE(auth_helper4.have_result());
5327
5328 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5329 // socket request should be able to claim it.
5330 auth_helper2.handle()->Reset();
5331 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5332 EXPECT_EQ(0, auth_helper1.auth_count());
5333 EXPECT_FALSE(auth_helper1.have_result());
5334 EXPECT_EQ(0, auth_helper3.auth_count());
5335 EXPECT_FALSE(auth_helper3.have_result());
5336 EXPECT_EQ(0, auth_helper4.auth_count());
5337}
5338
[email protected]f6d1d6eb2009-06-24 20:16:095339} // namespace
5340
5341} // namespace net