blob: 0b175dcf0a720a1791507bd129af212ef901c6ff [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
[email protected]ab838892009-06-30 18:49:055#include "net/socket/client_socket_pool_base.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"
eroman87c53d62015-04-02 06:51:0733#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0034#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1935#include "net/log/net_log_source.h"
mikecirone8b85c432016-09-08 19:11:0036#include "net/log/net_log_source_type.h"
mmenke16a7cbdd2015-04-24 23:00:5637#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4638#include "net/log/test_net_log_entry.h"
39#include "net/log/test_net_log_util.h"
[email protected]f6d1d6eb2009-06-24 20:16:0940#include "net/socket/client_socket_factory.h"
41#include "net/socket/client_socket_handle.h"
tfarina5dd13c22016-11-16 12:08:2642#include "net/socket/datagram_client_socket.h"
tbansalca83c002016-04-28 20:56:2843#include "net/socket/socket_performance_watcher.h"
Paul Jensen8d6f87ec2018-01-13 00:46:5444#include "net/socket/socket_tag.h"
[email protected]75439d3b2009-07-23 22:11:1745#include "net/socket/socket_test_util.h"
[email protected]18ccfdb2013-08-15 00:13:4446#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1047#include "net/socket/stream_socket.h"
robpercival214763f2016-07-01 23:27:0148#include "net/test/gtest_util.h"
Bence Béky98447b12018-05-08 03:14:0149#include "net/test/test_with_scoped_task_environment.h"
Ramin Halavati0a08cc82018-02-06 07:46:3850#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]51fdc7c2012-04-10 19:19:4851#include "testing/gmock/include/gmock/gmock.h"
[email protected]f6d1d6eb2009-06-24 20:16:0952#include "testing/gtest/include/gtest/gtest.h"
53
robpercival214763f2016-07-01 23:27:0154using net::test::IsError;
55using net::test::IsOk;
56
[email protected]51fdc7c2012-04-10 19:19:4857using ::testing::Invoke;
58using ::testing::Return;
59
[email protected]f6d1d6eb2009-06-24 20:16:0960namespace net {
61
62namespace {
63
[email protected]211d21722009-07-22 15:48:5364const int kDefaultMaxSockets = 4;
[email protected]c9d6a1d2009-07-14 16:15:2065const int kDefaultMaxSocketsPerGroup = 2;
Tarun Bansala7635092019-02-20 10:00:5966constexpr base::TimeDelta kUnusedIdleSocketTimeout =
67 base::TimeDelta::FromSeconds(10);
[email protected]0b7648c2009-07-06 20:14:0168
Matt Menkec6b3edf72019-03-19 17:00:3969ClientSocketPool::GroupId TestGroupId(const std::string& host,
70 int port = 80,
71 ClientSocketPool::SocketType socket_type =
72 ClientSocketPool::SocketType::kHttp,
73 bool privacy_mode = false) {
74 return ClientSocketPool::GroupId(HostPortPair(host, port), socket_type,
75 privacy_mode);
76}
77
[email protected]034df0f32013-01-07 23:17:4878// Make sure |handle| sets load times correctly when it has been assigned a
79// reused socket.
80void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
81 LoadTimingInfo load_timing_info;
82 // Only pass true in as |is_reused|, as in general, HttpStream types should
83 // have stricter concepts of reuse than socket pools.
84 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
85
86 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1987 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4888
[email protected]b258e0792013-01-12 07:11:5989 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
90 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4891}
92
93// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3394// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4895// of a connection where |is_reused| is false may consider the connection
96// reused.
97void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
98 EXPECT_FALSE(handle.is_reused());
99
100 LoadTimingInfo load_timing_info;
101 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
102
103 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19104 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48105
[email protected]b258e0792013-01-12 07:11:59106 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
107 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
108 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48109
110 TestLoadTimingInfoConnectedReused(handle);
111}
112
113// Make sure |handle| sets load times correctly, in the case that it does not
114// currently have a socket.
115void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
116 // Should only be set to true once a socket is assigned, if at all.
117 EXPECT_FALSE(handle.is_reused());
118
119 LoadTimingInfo load_timing_info;
120 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
121
122 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19123 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48124
[email protected]b258e0792013-01-12 07:11:59125 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
126 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48127}
128
[email protected]df4b4ef2010-07-12 18:25:21129class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20130 public:
Chris Watkins7a41d3552017-12-01 02:13:27131 explicit TestSocketParams() = default;
[email protected]51fdc7c2012-04-10 19:19:48132
[email protected]df4b4ef2010-07-12 18:25:21133 private:
134 friend class base::RefCounted<TestSocketParams>;
Chris Watkins7a41d3552017-12-01 02:13:27135 ~TestSocketParams() = default;
[email protected]df4b4ef2010-07-12 18:25:21136};
[email protected]7fc5b09a2010-02-27 00:07:38137typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49138
[email protected]3268023f2011-05-05 00:08:10139class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09140 public:
[email protected]034df0f32013-01-07 23:17:48141 explicit MockClientSocket(net::NetLog* net_log)
142 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28143 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20144 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30145 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09146
[email protected]0dc88b32014-03-26 20:12:28147 // Sets whether the socket has unread data. If true, the next call to Read()
148 // will return 1 byte and IsConnectedAndIdle() will return false.
149 void set_has_unread_data(bool has_unread_data) {
150 has_unread_data_ = has_unread_data;
151 }
152
[email protected]3f55aa12011-12-07 02:03:33153 // Socket implementation.
dchengb03027d2014-10-21 12:00:20154 int Read(IOBuffer* /* buf */,
155 int len,
Brad Lassey3a814172018-04-26 03:30:21156 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28157 if (has_unread_data_ && len > 0) {
158 has_unread_data_ = false;
159 was_used_to_convey_data_ = true;
160 return 1;
161 }
[email protected]e86df8dc2013-03-30 13:18:28162 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33163 }
[email protected]ab838892009-06-30 18:49:05164
[email protected]a2b2cfc2017-12-06 09:06:08165 int Write(
166 IOBuffer* /* buf */,
167 int len,
Brad Lassey3a814172018-04-26 03:30:21168 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08169 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01170 was_used_to_convey_data_ = true;
171 return len;
[email protected]ab838892009-06-30 18:49:05172 }
Avi Drissman13fc8932015-12-20 04:40:46173 int SetReceiveBufferSize(int32_t size) override { return OK; }
174 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05175
[email protected]dbf036f2011-12-06 23:33:24176 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21177 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24178 connected_ = true;
179 return OK;
180 }
[email protected]f6d1d6eb2009-06-24 20:16:09181
dchengb03027d2014-10-21 12:00:20182 void Disconnect() override { connected_ = false; }
183 bool IsConnected() const override { return connected_; }
184 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28185 return connected_ && !has_unread_data_;
186 }
[email protected]0b7648c2009-07-06 20:14:01187
dchengb03027d2014-10-21 12:00:20188 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16189 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09190 }
[email protected]f6d1d6eb2009-06-24 20:16:09191
dchengb03027d2014-10-21 12:00:20192 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35193 return ERR_UNEXPECTED;
194 }
195
tfarina428341112016-09-22 13:38:20196 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02197
dchengb03027d2014-10-21 12:00:20198 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37199 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20200 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
201 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03202 void GetConnectionAttempts(ConnectionAttempts* out) const override {
203 out->clear();
204 }
205 void ClearConnectionAttempts() override {}
206 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49207 int64_t GetTotalReceivedBytes() const override {
208 NOTIMPLEMENTED();
209 return 0;
210 }
Paul Jensen0f49dec2017-12-12 23:39:58211 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45212
[email protected]f6d1d6eb2009-06-24 20:16:09213 private:
214 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28215 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20216 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01217 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09218
[email protected]ab838892009-06-30 18:49:05219 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09220};
221
[email protected]5fc08e32009-07-15 17:09:57222class TestConnectJob;
223
[email protected]f6d1d6eb2009-06-24 20:16:09224class MockClientSocketFactory : public ClientSocketFactory {
225 public:
[email protected]ab838892009-06-30 18:49:05226 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09227
danakj655b66c2016-04-16 00:51:38228 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04229 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41230 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19231 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41232 NOTREACHED();
danakj655b66c2016-04-16 00:51:38233 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41234 }
235
Helen Lid5bb9222018-04-12 15:33:09236 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07237 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38238 std::unique_ptr<
239 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07240 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19241 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09242 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09243 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09244 }
245
danakj655b66c2016-04-16 00:51:38246 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
Matt Menke841fc412019-03-05 23:20:12247 std::unique_ptr<StreamSocket> stream_socket,
[email protected]4f4de7e62010-11-12 19:55:27248 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21249 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13250 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09251 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38252 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09253 }
Matt Menkefd956922019-02-04 23:44:03254
Matt Menke52cd95a2019-02-08 06:16:27255 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
256 std::unique_ptr<StreamSocket> stream_socket,
257 const std::string& user_agent,
258 const HostPortPair& endpoint,
259 const ProxyServer& proxy_server,
260 HttpAuthController* http_auth_controller,
261 bool tunnel,
262 bool using_spdy,
263 NextProto negotiated_protocol,
264 ProxyDelegate* proxy_delegate,
265 bool is_https_proxy,
266 const NetworkTrafficAnnotationTag& traffic_annotation) override {
267 NOTIMPLEMENTED();
268 return nullptr;
269 }
270
[email protected]5fc08e32009-07-15 17:09:57271 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55272
[email protected]5fc08e32009-07-15 17:09:57273 void SignalJobs();
274
[email protected]03b7c8c2013-07-20 04:38:55275 void SignalJob(size_t job);
276
277 void SetJobLoadState(size_t job, LoadState load_state);
278
Matt Menke141b87f22019-01-30 02:43:03279 // Sets the HasConnectionEstablished value of the specified job to true,
280 // without invoking the callback.
281 void SetJobHasEstablishedConnection(size_t job);
282
[email protected]f6d1d6eb2009-06-24 20:16:09283 int allocation_count() const { return allocation_count_; }
284
[email protected]f6d1d6eb2009-06-24 20:16:09285 private:
286 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57287 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09288};
289
[email protected]ab838892009-06-30 18:49:05290class TestConnectJob : public ConnectJob {
291 public:
292 enum JobType {
293 kMockJob,
294 kMockFailingJob,
295 kMockPendingJob,
296 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57297 kMockWaitingJob,
Matt Menkeb57663b32019-03-01 17:17:10298
299 // Certificate errors return a socket in addition to an error code.
300 kMockCertErrorJob,
301 kMockPendingCertErrorJob,
302
[email protected]e60e47a2010-07-14 03:37:18303 kMockAdditionalErrorStateJob,
304 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28305 kMockUnreadDataJob,
Matt Menkeb57663b32019-03-01 17:17:10306
307 kMockAuthChallengeOnceJob,
308 kMockAuthChallengeTwiceJob,
309 kMockAuthChallengeOnceFailingJob,
310 kMockAuthChallengeTwiceFailingJob,
[email protected]ab838892009-06-30 18:49:05311 };
312
[email protected]994d4932010-07-12 17:55:13313 // The kMockPendingJob uses a slight delay before allowing the connect
314 // to complete.
315 static const int kPendingConnectDelay = 2;
316
[email protected]ab838892009-06-30 18:49:05317 TestConnectJob(JobType job_type,
[email protected]d80a4322009-08-14 07:07:49318 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34319 base::TimeDelta timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43320 const CommonConnectJobParams* common_connect_job_params,
[email protected]ab838892009-06-30 18:49:05321 ConnectJob::Delegate* delegate,
Matt Menkea6f99ad2019-03-08 02:26:43322 MockClientSocketFactory* client_socket_factory)
Matt Menke1a6c92d2019-02-23 00:25:38323 : ConnectJob(request.priority(),
Matt Menkea6f99ad2019-03-08 02:26:43324 request.socket_tag(),
Matt Menke1a6c92d2019-02-23 00:25:38325 timeout_duration,
Matt Menkea6f99ad2019-03-08 02:26:43326 common_connect_job_params,
Matt Menke1a6c92d2019-02-23 00:25:38327 delegate,
328 nullptr /* net_log */,
329 NetLogSourceType::TRANSPORT_CONNECT_JOB,
330 NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT),
[email protected]2ab05b52009-07-01 23:57:58331 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05332 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18333 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03334 has_established_connection_(false),
[email protected]d5492c52013-11-10 20:44:39335 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15336 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05337
[email protected]974ebd62009-08-03 23:14:34338 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13339 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34340 }
341
[email protected]03b7c8c2013-07-20 04:38:55342 void set_load_state(LoadState load_state) { load_state_ = load_state; }
343
Matt Menke141b87f22019-01-30 02:43:03344 void set_has_established_connection() {
345 DCHECK(!has_established_connection_);
346 has_established_connection_ = true;
347 }
348
[email protected]03b7c8c2013-07-20 04:38:55349 // From ConnectJob:
350
dchengb03027d2014-10-21 12:00:20351 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21352
Matt Menke141b87f22019-01-30 02:43:03353 bool HasEstablishedConnection() const override {
354 return has_established_connection_;
355 }
356
dchengb03027d2014-10-21 12:00:20357 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18358 if (store_additional_error_state_) {
359 // Set all of the additional error state fields in some way.
360 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43361 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45362 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43363 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18364 }
365 }
366
[email protected]974ebd62009-08-03 23:14:34367 private:
[email protected]03b7c8c2013-07-20 04:38:55368 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05369
dchengb03027d2014-10-21 12:00:20370 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05371 AddressList ignored;
Raul Tambre94493c652019-03-11 17:18:35372 client_socket_factory_->CreateTransportClientSocket(
373 ignored, nullptr, nullptr, NetLogSource());
[email protected]ab838892009-06-30 18:49:05374 switch (job_type_) {
375 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13376 return DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10377 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05378 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13379 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10380 false /* cert_error */);
[email protected]ab838892009-06-30 18:49:05381 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57382 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47383
384 // Depending on execution timings, posting a delayed task can result
385 // in the task getting executed the at the earliest possible
386 // opportunity or only after returning once from the message loop and
387 // then a second call into the message loop. In order to make behavior
388 // more deterministic, we change the default delay to 2ms. This should
389 // always require us to wait for the second call into the message loop.
390 //
391 // N.B. The correct fix for this and similar timing problems is to
392 // abstract time for the purpose of unittests. Unfortunately, we have
393 // a lot of third-party components that directly call the various
394 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45395 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05396 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49397 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
398 weak_factory_.GetWeakPtr(), true /* successful */,
Matt Menkeb57663b32019-03-01 17:17:10399 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53400 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05401 return ERR_IO_PENDING;
402 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57403 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45404 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05405 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49406 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
407 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10408 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53409 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05410 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57411 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55412 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57413 client_socket_factory_->WaitForSignal(this);
414 waiting_success_ = true;
415 return ERR_IO_PENDING;
Matt Menkeb57663b32019-03-01 17:17:10416 case kMockCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13417 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10418 true /* cert_error */);
419 case kMockPendingCertErrorJob:
[email protected]e772db3f2010-07-12 18:11:13420 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45421 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13422 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49423 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
424 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10425 true /* async */, true /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53426 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13427 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18428 case kMockAdditionalErrorStateJob:
429 store_additional_error_state_ = true;
430 return DoConnect(false /* error */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10431 false /* cert_error */);
[email protected]e60e47a2010-07-14 03:37:18432 case kMockPendingAdditionalErrorStateJob:
433 set_load_state(LOAD_STATE_CONNECTING);
434 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45435 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18436 FROM_HERE,
kylecharf4fe5172019-02-15 18:53:49437 base::BindOnce(base::IgnoreResult(&TestConnectJob::DoConnect),
438 weak_factory_.GetWeakPtr(), false /* error */,
Matt Menkeb57663b32019-03-01 17:17:10439 true /* async */, false /* cert_error */),
[email protected]5761ab9c2012-02-04 16:44:53440 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18441 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28442 case kMockUnreadDataJob: {
443 int ret = DoConnect(true /* successful */, false /* sync */,
Matt Menkeb57663b32019-03-01 17:17:10444 false /* cert_error */);
[email protected]0dc88b32014-03-26 20:12:28445 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
446 return ret;
447 }
Matt Menkeb57663b32019-03-01 17:17:10448 case kMockAuthChallengeOnceJob:
Matt Menke4b69f932019-03-04 16:20:01449 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10450 DoAdvanceAuthChallenge(1, true /* succeed_after_last_challenge */);
451 return ERR_IO_PENDING;
452 case kMockAuthChallengeTwiceJob:
Matt Menke4b69f932019-03-04 16:20:01453 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10454 DoAdvanceAuthChallenge(2, true /* succeed_after_last_challenge */);
455 return ERR_IO_PENDING;
456 case kMockAuthChallengeOnceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01457 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10458 DoAdvanceAuthChallenge(1, false /* succeed_after_last_challenge */);
459 return ERR_IO_PENDING;
460 case kMockAuthChallengeTwiceFailingJob:
Matt Menke4b69f932019-03-04 16:20:01461 set_load_state(LOAD_STATE_CONNECTING);
Matt Menkeb57663b32019-03-01 17:17:10462 DoAdvanceAuthChallenge(2, false /* succeed_after_last_challenge */);
463 return ERR_IO_PENDING;
[email protected]ab838892009-06-30 18:49:05464 default:
465 NOTREACHED();
danakj655b66c2016-04-16 00:51:38466 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05467 return ERR_FAILED;
468 }
469 }
470
Lily Chen02ef29a2018-11-30 16:31:43471 void ChangePriorityInternal(RequestPriority priority) override {}
472
Matt Menkeb57663b32019-03-01 17:17:10473 int DoConnect(bool succeed, bool was_async, bool cert_error) {
[email protected]e772db3f2010-07-12 18:11:13474 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03475 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05476 if (succeed) {
Matt Menkeb57663b32019-03-01 17:17:10477 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
Bence Békybdbb0e72018-08-07 21:42:59478 socket()->Connect(CompletionOnceCallback());
Matt Menkeb57663b32019-03-01 17:17:10479 } else if (cert_error) {
480 SetSocket(std::make_unique<MockClientSocket>(net_log().net_log()));
481 result = ERR_CERT_COMMON_NAME_INVALID;
[email protected]6e713f02009-08-06 02:56:40482 } else {
[email protected]e772db3f2010-07-12 18:11:13483 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38484 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05485 }
[email protected]2ab05b52009-07-01 23:57:58486
487 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30488 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05489 return result;
490 }
491
Matt Menkeb57663b32019-03-01 17:17:10492 void DoAdvanceAuthChallenge(int remaining_challenges,
493 bool succeed_after_last_challenge) {
494 base::ThreadTaskRunnerHandle::Get()->PostTask(
495 FROM_HERE,
496 base::BindOnce(&TestConnectJob::InvokeNextProxyAuthCallback,
497 weak_factory_.GetWeakPtr(), remaining_challenges,
498 succeed_after_last_challenge));
499 }
500
501 void InvokeNextProxyAuthCallback(int remaining_challenges,
502 bool succeed_after_last_challenge) {
Matt Menke4b69f932019-03-04 16:20:01503 set_load_state(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL);
Matt Menkeb57663b32019-03-01 17:17:10504 if (remaining_challenges == 0) {
505 DoConnect(succeed_after_last_challenge, true /* was_async */,
506 false /* cert_error */);
507 return;
508 }
509
510 // Integration tests make sure HttpResponseInfo and HttpAuthController work.
511 // The auth tests here are just focused on ConnectJob bookkeeping.
512 HttpResponseInfo info;
513 NotifyDelegateOfProxyAuth(
514 info, nullptr /* http_auth_controller */,
515 base::BindOnce(&TestConnectJob::DoAdvanceAuthChallenge,
516 weak_factory_.GetWeakPtr(), remaining_challenges - 1,
517 succeed_after_last_challenge));
518 }
519
[email protected]5fc08e32009-07-15 17:09:57520 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05521 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57522 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21523 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03524 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18525 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05526
[email protected]d5492c52013-11-10 20:44:39527 base::WeakPtrFactory<TestConnectJob> weak_factory_;
528
[email protected]ab838892009-06-30 18:49:05529 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
530};
531
[email protected]d80a4322009-08-14 07:07:49532class TestConnectJobFactory
533 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05534 public:
[email protected]034df0f32013-01-07 23:17:48535 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
536 NetLog* net_log)
Matt Menkea6f99ad2019-03-08 02:26:43537 : common_connect_job_params_(
538 nullptr /* client_socket_factory */,
539 nullptr /* host_resolver */,
540 nullptr /* proxy_delegate */,
Matt Menked732ea42019-03-08 12:05:00541 nullptr /* http_user_agent_settings */,
Matt Menkea6f99ad2019-03-08 02:26:43542 SSLClientSocketContext(),
543 SSLClientSocketContext(),
544 nullptr /* socket_performance_watcher_factory */,
545 nullptr /* network_quality_estimator */,
546 net_log,
547 nullptr /* websocket_endpoint_lock_manager */),
548 job_type_(TestConnectJob::kMockJob),
Raul Tambre94493c652019-03-11 17:18:35549 job_types_(nullptr),
Matt Menkea6f99ad2019-03-08 02:26:43550 client_socket_factory_(client_socket_factory) {}
[email protected]ab838892009-06-30 18:49:05551
Chris Watkins7a41d3552017-12-01 02:13:27552 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05553
554 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
555
[email protected]51fdc7c2012-04-10 19:19:48556 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
557 job_types_ = job_types;
558 CHECK(!job_types_->empty());
559 }
560
[email protected]974ebd62009-08-03 23:14:34561 void set_timeout_duration(base::TimeDelta timeout_duration) {
562 timeout_duration_ = timeout_duration;
563 }
564
[email protected]3f55aa12011-12-07 02:03:33565 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55566
danakj655b66c2016-04-16 00:51:38567 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]d80a4322009-08-14 07:07:49568 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13569 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48570 EXPECT_TRUE(!job_types_ || !job_types_->empty());
571 TestConnectJob::JobType job_type = job_type_;
572 if (job_types_ && !job_types_->empty()) {
573 job_type = job_types_->front();
574 job_types_->pop_front();
575 }
Matt Menkea6f99ad2019-03-08 02:26:43576 return std::make_unique<TestConnectJob>(
577 job_type, request, timeout_duration_, &common_connect_job_params_,
578 delegate, client_socket_factory_);
[email protected]ab838892009-06-30 18:49:05579 }
580
581 private:
Matt Menkea6f99ad2019-03-08 02:26:43582 const CommonConnectJobParams common_connect_job_params_;
[email protected]ab838892009-06-30 18:49:05583 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48584 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34585 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57586 MockClientSocketFactory* const client_socket_factory_;
[email protected]ab838892009-06-30 18:49:05587
588 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
589};
590
591class TestClientSocketPool : public ClientSocketPool {
592 public:
[email protected]12322e7e2013-08-15 17:49:26593 typedef TestSocketParams SocketParams;
594
[email protected]ab838892009-06-30 18:49:05595 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53596 int max_sockets,
[email protected]ab838892009-06-30 18:49:05597 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16598 base::TimeDelta unused_idle_socket_timeout,
599 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49600 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
Matt Menke833678642019-03-05 22:05:51601 : base_(max_sockets,
rkaplowd90695c2015-03-25 22:12:41602 max_sockets_per_group,
603 unused_idle_socket_timeout,
604 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38605 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05606
Chris Watkins7a41d3552017-12-01 02:13:27607 ~TestClientSocketPool() override = default;
[email protected]2431756e2010-09-29 20:26:13608
dchengb03027d2014-10-21 12:00:20609 int RequestSocket(const std::string& group_name,
610 const void* params,
ttuttle859dc7a2015-04-23 19:42:29611 RequestPriority priority,
Paul Jensen8d6f87ec2018-01-13 00:46:54612 const SocketTag& socket_tag,
mmenked3641e12016-01-28 16:06:15613 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20614 ClientSocketHandle* handle,
Bence Béky5a8662b2018-07-03 13:04:03615 CompletionOnceCallback callback,
Matt Menke28ac03e2019-02-25 22:25:50616 const ProxyAuthCallback& proxy_auth_callback,
tfarina428341112016-09-22 13:38:20617 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21618 const scoped_refptr<TestSocketParams>* casted_socket_params =
619 static_cast<const scoped_refptr<TestSocketParams>*>(params);
Matt Menke28ac03e2019-02-25 22:25:50620 return base_.RequestSocket(
621 group_name, *casted_socket_params, priority, socket_tag, respect_limits,
622 handle, std::move(callback), proxy_auth_callback, net_log);
[email protected]ab838892009-06-30 18:49:05623 }
624
dchengb03027d2014-10-21 12:00:20625 void RequestSockets(const std::string& group_name,
626 const void* params,
627 int num_sockets,
Charlie Harrison55ce6082018-05-14 02:25:57628 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03629 const scoped_refptr<TestSocketParams>* casted_params =
630 static_cast<const scoped_refptr<TestSocketParams>*>(params);
631
Charlie Harrison55ce6082018-05-14 02:25:57632 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
[email protected]2c2bef152010-10-13 00:55:03633 }
634
rdsmith29dbad12017-02-17 02:22:18635 void SetPriority(const std::string& group_name,
636 ClientSocketHandle* handle,
637 RequestPriority priority) override {
638 base_.SetPriority(group_name, handle, priority);
639 }
640
dchengb03027d2014-10-21 12:00:20641 void CancelRequest(const std::string& group_name,
642 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49643 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05644 }
645
dchengb03027d2014-10-21 12:00:20646 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38647 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20648 int id) override {
dchengc7eeda422015-12-26 03:56:48649 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24650 }
651
dchengb03027d2014-10-21 12:00:20652 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05653
dchengb03027d2014-10-21 12:00:20654 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48655
dchengb03027d2014-10-21 12:00:20656 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05657
xunjieli92feb332017-03-03 17:19:23658 void CloseIdleSocketsInGroup(const std::string& group_name) override {
659 base_.CloseIdleSocketsInGroup(group_name);
660 }
661
dchengb03027d2014-10-21 12:00:20662 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05663
Raul Tambre8335a6d2019-02-21 16:57:43664 size_t IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49665 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05666 }
667
dchengb03027d2014-10-21 12:00:20668 LoadState GetLoadState(const std::string& group_name,
669 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49670 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05671 }
672
dchengb03027d2014-10-21 12:00:20673 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52674 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48675 }
676
dchengb03027d2014-10-21 12:00:20677 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52678 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48679 }
680
danakj655b66c2016-04-16 00:51:38681 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59682 const std::string& name,
Matt Menke833678642019-03-05 22:05:51683 const std::string& type) const override {
[email protected]59d7a5a2010-08-30 16:44:27684 return base_.GetInfoAsValue(name, type);
685 }
686
[email protected]d80a4322009-08-14 07:07:49687 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20688
Raul Tambre8335a6d2019-02-21 16:57:43689 size_t NumNeverAssignedConnectJobsInGroup(
690 const std::string& group_name) const {
Lily Chenecebf932018-11-02 17:15:43691 return base_.NumNeverAssignedConnectJobsInGroup(group_name);
692 }
693
Raul Tambre8335a6d2019-02-21 16:57:43694 size_t NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
[email protected]8159a1c2012-06-07 00:00:10695 return base_.NumUnassignedConnectJobsInGroup(group_name);
696 }
697
Raul Tambre8335a6d2019-02-21 16:57:43698 size_t NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49699 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34700 }
701
[email protected]2c2bef152010-10-13 00:55:03702 int NumActiveSocketsInGroup(const std::string& group_name) const {
703 return base_.NumActiveSocketsInGroup(group_name);
704 }
705
Lily Chenecebf932018-11-02 17:15:43706 bool RequestInGroupWithHandleHasJobForTesting(
707 const std::string& group_name,
708 const ClientSocketHandle* handle) const {
709 return base_.RequestInGroupWithHandleHasJobForTesting(group_name, handle);
710 }
711
[email protected]2abfe90a2010-08-25 17:49:51712 bool HasGroup(const std::string& group_name) const {
713 return base_.HasGroup(group_name);
714 }
715
[email protected]9bf28db2009-08-29 01:35:16716 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
717
[email protected]06d94042010-08-25 01:45:22718 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54719
[email protected]ab838892009-06-30 18:49:05720 private:
[email protected]d80a4322009-08-14 07:07:49721 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05722
723 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
724};
725
[email protected]a937a06d2009-08-19 21:19:24726} // namespace
727
[email protected]a937a06d2009-08-19 21:19:24728namespace {
729
[email protected]5fc08e32009-07-15 17:09:57730void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26731 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57732 (*it)->Signal();
733 }
734 waiting_jobs_.clear();
735}
736
[email protected]03b7c8c2013-07-20 04:38:55737void MockClientSocketFactory::SignalJob(size_t job) {
738 ASSERT_LT(job, waiting_jobs_.size());
739 waiting_jobs_[job]->Signal();
740 waiting_jobs_.erase(waiting_jobs_.begin() + job);
741}
742
743void MockClientSocketFactory::SetJobLoadState(size_t job,
744 LoadState load_state) {
745 ASSERT_LT(job, waiting_jobs_.size());
746 waiting_jobs_[job]->set_load_state(load_state);
747}
748
Matt Menke141b87f22019-01-30 02:43:03749void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
750 ASSERT_LT(job, waiting_jobs_.size());
751 waiting_jobs_[job]->set_has_established_connection();
752}
753
Bence Béky98447b12018-05-08 03:14:01754class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09755 protected:
Alex Clarke0def2092018-12-10 12:01:45756 ClientSocketPoolBaseTest()
757 : TestWithScopedTaskEnvironment(
758 base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
759 params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54760 connect_backup_jobs_enabled_ =
761 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
762 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
763 }
[email protected]2431756e2010-09-29 20:26:13764
dcheng67be2b1f2014-10-27 21:47:29765 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54766 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
767 connect_backup_jobs_enabled_);
768 }
[email protected]c9d6a1d2009-07-14 16:15:20769
[email protected]211d21722009-07-22 15:48:53770 void CreatePool(int max_sockets, int max_sockets_per_group) {
Tarun Bansala7635092019-02-20 10:00:59771 CreatePoolWithIdleTimeouts(max_sockets, max_sockets_per_group,
772 kUnusedIdleSocketTimeout,
773 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16774 }
775
776 void CreatePoolWithIdleTimeouts(
777 int max_sockets, int max_sockets_per_group,
778 base::TimeDelta unused_idle_socket_timeout,
779 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20780 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48781 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
782 &net_log_);
[email protected]2431756e2010-09-29 20:26:13783 pool_.reset(new TestClientSocketPool(max_sockets,
784 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13785 unused_idle_socket_timeout,
786 used_idle_socket_timeout,
787 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20788 }
[email protected]f6d1d6eb2009-06-24 20:16:09789
mmenked3641e12016-01-28 16:06:15790 int StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39791 const ClientSocketPool::GroupId& group_id,
[email protected]b021ece62013-06-11 11:06:33792 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15793 ClientSocketPool::RespectLimits respect_limits) {
Matt Menkec6b3edf72019-03-19 17:00:39794 return test_base_.StartRequestUsingPool(pool_.get(), group_id, priority,
mmenked3641e12016-01-28 16:06:15795 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33796 }
797
Matt Menkec6b3edf72019-03-19 17:00:39798 int StartRequest(const ClientSocketPool::GroupId& group_id,
799 RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15800 return StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:39801 group_id, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09802 }
803
[email protected]2431756e2010-09-29 20:26:13804 int GetOrderOfRequest(size_t index) const {
805 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09806 }
807
[email protected]2431756e2010-09-29 20:26:13808 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
809 return test_base_.ReleaseOneConnection(keep_alive);
810 }
811
812 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
813 test_base_.ReleaseAllConnections(keep_alive);
814 }
815
816 TestSocketRequest* request(int i) { return test_base_.request(i); }
817 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38818 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42819 return test_base_.requests();
820 }
rdsmith29dbad12017-02-17 02:22:18821 // Only counts the requests that get sockets asynchronously;
822 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13823 size_t completion_count() const { return test_base_.completion_count(); }
824
vishal.b62985ca92015-04-17 08:45:51825 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54826 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09827 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04828 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21829 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38830 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13831 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09832};
833
[email protected]5fc08e32009-07-15 17:09:57834TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53835 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20836
[email protected]6ecf2b92011-12-15 01:14:52837 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06838 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51839 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48840 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53841
Matt Menkec6b3edf72019-03-19 17:00:39842 EXPECT_EQ(
843 OK, handle.Init(
844 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
845 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
846 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09847 EXPECT_TRUE(handle.is_initialized());
848 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48849 TestLoadTimingInfoConnectedNotReused(handle);
850
[email protected]f6d1d6eb2009-06-24 20:16:09851 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48852 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30853
mmenke43758e62015-05-04 21:09:46854 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40855 log.GetEntries(&entries);
856
857 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00858 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53859 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00860 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
861 NetLogEventPhase::NONE));
862 EXPECT_TRUE(LogContainsEvent(entries, 2,
863 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
864 NetLogEventPhase::NONE));
865 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09866}
867
[email protected]ab838892009-06-30 18:49:05868TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53869 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20870
[email protected]ab838892009-06-30 18:49:05871 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51872 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53873
[email protected]2431756e2010-09-29 20:26:13874 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52875 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18876 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13877 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43878 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45879 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13880 handle.set_ssl_error_response_info(info);
Matt Menke28ac03e2019-02-25 22:25:50881 EXPECT_EQ(
882 ERR_CONNECTION_FAILED,
Matt Menkec6b3edf72019-03-19 17:00:39883 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:50884 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
885 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
886 log.bound()));
[email protected]2431756e2010-09-29 20:26:13887 EXPECT_FALSE(handle.socket());
888 EXPECT_FALSE(handle.is_ssl_error());
Raul Tambre94493c652019-03-11 17:18:35889 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == nullptr);
[email protected]034df0f32013-01-07 23:17:48890 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30891
mmenke43758e62015-05-04 21:09:46892 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40893 log.GetEntries(&entries);
894
895 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00896 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17897 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00898 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
899 NetLogEventPhase::NONE));
900 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09901}
902
[email protected]211d21722009-07-22 15:48:53903TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
904 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
905
[email protected]9e743cd2010-03-16 07:03:53906 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30907
Matt Menkec6b3edf72019-03-19 17:00:39908 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
909 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
910 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
911 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53912
[email protected]2431756e2010-09-29 20:26:13913 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53914 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13915 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53916
Matt Menkec6b3edf72019-03-19 17:00:39917 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
918 IsError(ERR_IO_PENDING));
919 EXPECT_THAT(StartRequest(TestGroupId("f"), DEFAULT_PRIORITY),
920 IsError(ERR_IO_PENDING));
921 EXPECT_THAT(StartRequest(TestGroupId("g"), DEFAULT_PRIORITY),
922 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53923
[email protected]2431756e2010-09-29 20:26:13924 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53925
[email protected]2431756e2010-09-29 20:26:13926 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53927 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13928 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53929
930 EXPECT_EQ(1, GetOrderOfRequest(1));
931 EXPECT_EQ(2, GetOrderOfRequest(2));
932 EXPECT_EQ(3, GetOrderOfRequest(3));
933 EXPECT_EQ(4, GetOrderOfRequest(4));
934 EXPECT_EQ(5, GetOrderOfRequest(5));
935 EXPECT_EQ(6, GetOrderOfRequest(6));
936 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17937
938 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13939 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53940}
941
942TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
943 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
944
[email protected]9e743cd2010-03-16 07:03:53945 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30946
[email protected]211d21722009-07-22 15:48:53947 // Reach all limits: max total sockets, and max sockets per group.
Matt Menkec6b3edf72019-03-19 17:00:39948 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
949 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
950 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
951 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53952
[email protected]2431756e2010-09-29 20:26:13953 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53954 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13955 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53956
957 // Now create a new group and verify that we don't starve it.
Matt Menkec6b3edf72019-03-19 17:00:39958 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
959 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53960
[email protected]2431756e2010-09-29 20:26:13961 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53962
[email protected]2431756e2010-09-29 20:26:13963 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53964 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13965 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53966
967 EXPECT_EQ(1, GetOrderOfRequest(1));
968 EXPECT_EQ(2, GetOrderOfRequest(2));
969 EXPECT_EQ(3, GetOrderOfRequest(3));
970 EXPECT_EQ(4, GetOrderOfRequest(4));
971 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17972
973 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13974 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53975}
976
977TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
978 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
979
Matt Menkec6b3edf72019-03-19 17:00:39980 EXPECT_THAT(StartRequest(TestGroupId("b"), LOWEST), IsOk());
981 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsOk());
982 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
983 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53984
[email protected]2431756e2010-09-29 20:26:13985 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53986 client_socket_factory_.allocation_count());
987
Matt Menkec6b3edf72019-03-19 17:00:39988 EXPECT_THAT(StartRequest(TestGroupId("c"), LOWEST), IsError(ERR_IO_PENDING));
989 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
990 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53991
[email protected]2431756e2010-09-29 20:26:13992 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53993
[email protected]2431756e2010-09-29 20:26:13994 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53995
996 // First 4 requests don't have to wait, and finish in order.
997 EXPECT_EQ(1, GetOrderOfRequest(1));
998 EXPECT_EQ(2, GetOrderOfRequest(2));
999 EXPECT_EQ(3, GetOrderOfRequest(3));
1000 EXPECT_EQ(4, GetOrderOfRequest(4));
1001
Matt Menkec6b3edf72019-03-19 17:00:391002 // Request ("b", HIGHEST) has the highest priority, then (TestGroupId("a"),
1003 // MEDIUM), and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:531004 EXPECT_EQ(7, GetOrderOfRequest(5));
1005 EXPECT_EQ(6, GetOrderOfRequest(6));
1006 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171007
1008 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131009 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:531010}
1011
rdsmith29dbad12017-02-17 02:22:181012// Test reprioritizing a request before completion doesn't interfere with
1013// its completion.
1014TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
1015 CreatePool(kDefaultMaxSockets, 1);
1016
Matt Menkec6b3edf72019-03-19 17:00:391017 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1018 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181019 EXPECT_TRUE(request(0)->handle()->socket());
1020 EXPECT_FALSE(request(1)->handle()->socket());
1021
Lily Chenecebf932018-11-02 17:15:431022 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:181023
1024 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
1025
1026 EXPECT_TRUE(request(1)->handle()->socket());
1027}
1028
1029// Reprioritize a request up past another one and make sure that changes the
1030// completion order.
1031TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
1032 CreatePool(kDefaultMaxSockets, 1);
1033
Matt Menkec6b3edf72019-03-19 17:00:391034 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1035 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1036 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181037 EXPECT_TRUE(request(0)->handle()->socket());
1038 EXPECT_FALSE(request(1)->handle()->socket());
1039 EXPECT_FALSE(request(2)->handle()->socket());
1040
1041 request(2)->handle()->SetPriority(HIGHEST);
1042
1043 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1044
1045 EXPECT_EQ(1, GetOrderOfRequest(1));
1046 EXPECT_EQ(3, GetOrderOfRequest(2));
1047 EXPECT_EQ(2, GetOrderOfRequest(3));
1048}
1049
1050// Reprioritize a request without changing relative priorities and check
1051// that the order doesn't change.
1052TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1053 CreatePool(kDefaultMaxSockets, 1);
1054
Matt Menkec6b3edf72019-03-19 17:00:391055 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1056 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1057 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181058 EXPECT_TRUE(request(0)->handle()->socket());
1059 EXPECT_FALSE(request(1)->handle()->socket());
1060 EXPECT_FALSE(request(2)->handle()->socket());
1061
1062 request(2)->handle()->SetPriority(MEDIUM);
1063
1064 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1065
1066 EXPECT_EQ(1, GetOrderOfRequest(1));
1067 EXPECT_EQ(2, GetOrderOfRequest(2));
1068 EXPECT_EQ(3, GetOrderOfRequest(3));
1069}
1070
1071// Reprioritize a request past down another one and make sure that changes the
1072// completion order.
1073TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1074 CreatePool(kDefaultMaxSockets, 1);
1075
Matt Menkec6b3edf72019-03-19 17:00:391076 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1077 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1078 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181079 EXPECT_TRUE(request(0)->handle()->socket());
1080 EXPECT_FALSE(request(1)->handle()->socket());
1081 EXPECT_FALSE(request(2)->handle()->socket());
1082
1083 request(1)->handle()->SetPriority(LOW);
1084
1085 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1086
1087 EXPECT_EQ(1, GetOrderOfRequest(1));
1088 EXPECT_EQ(3, GetOrderOfRequest(2));
1089 EXPECT_EQ(2, GetOrderOfRequest(3));
1090}
1091
1092// Reprioritize a request to the same level as another and confirm it is
1093// put after the old request.
1094TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1095 CreatePool(kDefaultMaxSockets, 1);
1096
Matt Menkec6b3edf72019-03-19 17:00:391097 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(OK));
1098 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1099 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
rdsmith29dbad12017-02-17 02:22:181100 EXPECT_TRUE(request(0)->handle()->socket());
1101 EXPECT_FALSE(request(1)->handle()->socket());
1102 EXPECT_FALSE(request(2)->handle()->socket());
1103
1104 request(1)->handle()->SetPriority(MEDIUM);
1105
1106 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1107
1108 EXPECT_EQ(1, GetOrderOfRequest(1));
1109 EXPECT_EQ(3, GetOrderOfRequest(2));
1110 EXPECT_EQ(2, GetOrderOfRequest(3));
1111}
1112
[email protected]211d21722009-07-22 15:48:531113TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1114 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1115
Matt Menkec6b3edf72019-03-19 17:00:391116 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsOk());
1117 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsOk());
1118 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsOk());
1119 EXPECT_THAT(StartRequest(TestGroupId("b"), MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531120
[email protected]2431756e2010-09-29 20:26:131121 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531122 client_socket_factory_.allocation_count());
1123
Matt Menkec6b3edf72019-03-19 17:00:391124 EXPECT_THAT(StartRequest(TestGroupId("c"), MEDIUM), IsError(ERR_IO_PENDING));
1125 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1126 EXPECT_THAT(StartRequest(TestGroupId("b"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531127
[email protected]2431756e2010-09-29 20:26:131128 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531129
[email protected]2431756e2010-09-29 20:26:131130 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531131 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131132 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531133
1134 // First 4 requests don't have to wait, and finish in order.
1135 EXPECT_EQ(1, GetOrderOfRequest(1));
1136 EXPECT_EQ(2, GetOrderOfRequest(2));
1137 EXPECT_EQ(3, GetOrderOfRequest(3));
1138 EXPECT_EQ(4, GetOrderOfRequest(4));
1139
1140 // Request ("b", 7) has the highest priority, but we can't make new socket for
1141 // group "b", because it has reached the per-group limit. Then we make
1142 // socket for ("c", 6), because it has higher priority than ("a", 4),
1143 // and we still can't make a socket for group "b".
1144 EXPECT_EQ(5, GetOrderOfRequest(5));
1145 EXPECT_EQ(6, GetOrderOfRequest(6));
1146 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171147
1148 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131149 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531150}
1151
1152// Make sure that we count connecting sockets against the total limit.
1153TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1154 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1155
Matt Menkec6b3edf72019-03-19 17:00:391156 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1157 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
1158 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531159
1160 // Create one asynchronous request.
1161 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
Matt Menkec6b3edf72019-03-19 17:00:391162 EXPECT_THAT(StartRequest(TestGroupId("d"), DEFAULT_PRIORITY),
1163 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531164
[email protected]6b175382009-10-13 06:47:471165 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1166 // actually become pending until 2ms after they have been created. In order
1167 // to flush all tasks, we need to wait so that we know there are no
1168 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451169 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471170
[email protected]211d21722009-07-22 15:48:531171 // The next synchronous request should wait for its turn.
1172 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:391173 EXPECT_THAT(StartRequest(TestGroupId("e"), DEFAULT_PRIORITY),
1174 IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531175
[email protected]2431756e2010-09-29 20:26:131176 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531177
[email protected]2431756e2010-09-29 20:26:131178 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531179 client_socket_factory_.allocation_count());
1180
1181 EXPECT_EQ(1, GetOrderOfRequest(1));
1182 EXPECT_EQ(2, GetOrderOfRequest(2));
1183 EXPECT_EQ(3, GetOrderOfRequest(3));
1184 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171185 EXPECT_EQ(5, GetOrderOfRequest(5));
1186
1187 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131188 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531189}
1190
[email protected]6427fe22010-04-16 22:27:411191TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1192 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1193 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1194
Matt Menkec6b3edf72019-03-19 17:00:391195 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1196 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1197 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1198 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411199
1200 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1201
1202 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1203
Matt Menkec6b3edf72019-03-19 17:00:391204 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY),
1205 IsError(ERR_IO_PENDING));
1206 EXPECT_THAT(StartRequest(TestGroupId("c"), DEFAULT_PRIORITY),
1207 IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411208
1209 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1210
[email protected]2431756e2010-09-29 20:26:131211 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411212 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131213 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411214 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131215 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1216 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411217 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1218}
1219
[email protected]d7027bb2010-05-10 18:58:541220TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1221 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1222 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1223
1224 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521225 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501226 EXPECT_EQ(
1227 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391228 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501229 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1230 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1231 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541232
1233 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241234 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521235 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501236 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391237 handles[i].Init(
1238 TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
1239 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1240 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1241 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541242 }
1243
1244 // One will be stalled, cancel all the handles now.
1245 // This should hit the OnAvailableSocketSlot() code where we previously had
1246 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241247 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541248 handles[i].Reset();
1249}
1250
[email protected]eb5a99382010-07-11 03:18:261251TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541252 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1253 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1254
[email protected]eb5a99382010-07-11 03:18:261255 {
1256 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521257 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261258 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:391259 EXPECT_EQ(OK, handles[i].Init(TestGroupId(base::NumberToString(i)),
1260 params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541261 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501262 callbacks[i].callback(),
1263 ClientSocketPool::ProxyAuthCallback(),
1264 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261265 }
1266
1267 // Force a stalled group.
1268 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521269 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201270 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391271 stalled_handle.Init(
1272 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1273 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1274 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1275 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261276
1277 // Cancel the stalled request.
1278 stalled_handle.Reset();
1279
1280 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1281 EXPECT_EQ(0, pool_->IdleSocketCount());
1282
1283 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541284 }
1285
[email protected]43a21b82010-06-10 21:30:541286 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1287 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261288}
[email protected]43a21b82010-06-10 21:30:541289
[email protected]eb5a99382010-07-11 03:18:261290TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1291 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1292 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1293
1294 {
1295 ClientSocketHandle handles[kDefaultMaxSockets];
1296 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521297 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201298 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391299 handles[i].Init(TestGroupId(base::NumberToString(i)), params_,
1300 DEFAULT_PRIORITY, SocketTag(),
1301 ClientSocketPool::RespectLimits::ENABLED,
1302 callback.callback(),
1303 ClientSocketPool::ProxyAuthCallback(),
1304 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261305 }
1306
1307 // Force a stalled group.
1308 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1309 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521310 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201311 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391312 stalled_handle.Init(
1313 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1314 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1315 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1316 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261317
1318 // Since it is stalled, it should have no connect jobs.
Matt Menkec6b3edf72019-03-19 17:00:391319 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("foo")));
1320 EXPECT_EQ(0u,
1321 pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("foo")));
1322 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261323
1324 // Cancel the stalled request.
1325 handles[0].Reset();
1326
[email protected]eb5a99382010-07-11 03:18:261327 // Now we should have a connect job.
Matt Menkec6b3edf72019-03-19 17:00:391328 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("foo")));
1329 EXPECT_EQ(0u,
1330 pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("foo")));
1331 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261332
1333 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011334 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261335
1336 EXPECT_EQ(kDefaultMaxSockets + 1,
1337 client_socket_factory_.allocation_count());
1338 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:391339 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("foo")));
1340 EXPECT_EQ(0u,
1341 pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("foo")));
1342 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("foo")));
[email protected]eb5a99382010-07-11 03:18:261343
1344 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541345 }
1346
[email protected]eb5a99382010-07-11 03:18:261347 EXPECT_EQ(1, pool_->IdleSocketCount());
1348}
[email protected]43a21b82010-06-10 21:30:541349
[email protected]eb5a99382010-07-11 03:18:261350TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1351 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1352 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541353
[email protected]eb5a99382010-07-11 03:18:261354 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521355 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261356 {
[email protected]51fdc7c2012-04-10 19:19:481357 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261358 ClientSocketHandle handles[kDefaultMaxSockets];
1359 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521360 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391361 EXPECT_EQ(
1362 OK, handles[i].Init(TestGroupId(base::StringPrintf("Take 2: %d", i)),
1363 params_, DEFAULT_PRIORITY, SocketTag(),
1364 ClientSocketPool::RespectLimits::ENABLED,
1365 callback.callback(),
1366 ClientSocketPool::ProxyAuthCallback(),
1367 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261368 }
1369
1370 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1371 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481372 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261373
1374 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201375 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391376 stalled_handle.Init(
1377 TestGroupId("foo"), params_, DEFAULT_PRIORITY, SocketTag(),
1378 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1379 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1380 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481381 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261382
1383 // Dropping out of scope will close all handles and return them to idle.
1384 }
[email protected]43a21b82010-06-10 21:30:541385
1386 // But if we wait for it, the released idle sockets will be closed in
1387 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011388 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261389
1390 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1391 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541392}
1393
1394// Regression test for http://crbug.com/40952.
1395TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1396 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221397 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541398 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1399
1400 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1401 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521402 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:391403 EXPECT_EQ(OK, handle.Init(TestGroupId(base::NumberToString(i)), params_,
1404 DEFAULT_PRIORITY, SocketTag(),
1405 ClientSocketPool::RespectLimits::ENABLED,
1406 callback.callback(),
1407 ClientSocketPool::ProxyAuthCallback(),
1408 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541409 }
1410
1411 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281412 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541413
1414 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1415 // reuse a socket.
1416 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1417 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521418 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541419
1420 // "0" is special here, since it should be the first entry in the sorted map,
1421 // which is the one which we would close an idle socket for. We shouldn't
1422 // close an idle socket though, since we should reuse the idle socket.
Matt Menkec6b3edf72019-03-19 17:00:391423 EXPECT_EQ(OK, handle.Init(
1424 TestGroupId("0"), params_, DEFAULT_PRIORITY, SocketTag(),
1425 ClientSocketPool::RespectLimits::ENABLED,
1426 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1427 pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541428
1429 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1430 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1431}
1432
[email protected]ab838892009-06-30 18:49:051433TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[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"), IDLE), IsError(ERR_IO_PENDING));
1439 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1440 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1441 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1442 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1443 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091444
[email protected]2431756e2010-09-29 20:26:131445 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201446 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1447 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131448 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1449 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091450
[email protected]c9d6a1d2009-07-14 16:15:201451 EXPECT_EQ(1, GetOrderOfRequest(1));
1452 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031453 EXPECT_EQ(8, GetOrderOfRequest(3));
1454 EXPECT_EQ(6, GetOrderOfRequest(4));
1455 EXPECT_EQ(4, GetOrderOfRequest(5));
1456 EXPECT_EQ(3, GetOrderOfRequest(6));
1457 EXPECT_EQ(5, GetOrderOfRequest(7));
1458 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171459
1460 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131461 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091462}
1463
[email protected]ab838892009-06-30 18:49:051464TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531465 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091466
Matt Menkec6b3edf72019-03-19 17:00:391467 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1468 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1469 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1470 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1471 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1472 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1473 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091474
[email protected]2431756e2010-09-29 20:26:131475 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091476
[email protected]2431756e2010-09-29 20:26:131477 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011478 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201479
[email protected]2431756e2010-09-29 20:26:131480 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201481 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131482 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1483 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091484}
1485
1486// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051487// The pending connect job will be cancelled and should not call back into
1488// ClientSocketPoolBase.
1489TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531490 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201491
[email protected]ab838892009-06-30 18:49:051492 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131493 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521494 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501495 EXPECT_EQ(
1496 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391497 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501498 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1499 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1500 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131501 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091502}
1503
[email protected]ab838892009-06-30 18:49:051504TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531505 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201506
[email protected]ab838892009-06-30 18:49:051507 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061508 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521509 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091510
Matt Menke28ac03e2019-02-25 22:25:501511 EXPECT_EQ(
1512 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391513 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501514 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1515 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1516 NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091517
1518 handle.Reset();
1519
[email protected]6ecf2b92011-12-15 01:14:521520 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:501521 EXPECT_EQ(
1522 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391523 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501524 ClientSocketPool::RespectLimits::ENABLED,
1525 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1526 pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091527
robpercival214763f2016-07-01 23:27:011528 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091529 EXPECT_FALSE(callback.have_result());
1530
1531 handle.Reset();
1532}
1533
[email protected]ab838892009-06-30 18:49:051534TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531535 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091536
Matt Menkec6b3edf72019-03-19 17:00:391537 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1538 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1539 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
1540 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
1541 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
1542 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
1543 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091544
1545 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201546 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131547 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1548 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091549
[email protected]2431756e2010-09-29 20:26:131550 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091551
[email protected]c9d6a1d2009-07-14 16:15:201552 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1553 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131554 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1555 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091556
[email protected]c9d6a1d2009-07-14 16:15:201557 EXPECT_EQ(1, GetOrderOfRequest(1));
1558 EXPECT_EQ(2, GetOrderOfRequest(2));
1559 EXPECT_EQ(5, GetOrderOfRequest(3));
1560 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131561 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1562 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201563 EXPECT_EQ(4, GetOrderOfRequest(6));
1564 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171565
1566 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131567 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091568}
1569
mmenke33d24423d2015-05-19 19:41:091570// Function to be used as a callback on socket request completion. It first
1571// disconnects the successfully connected socket from the first request, and
1572// then reuses the ClientSocketHandle to request another socket.
1573//
1574// |nested_callback| is called with the result of the second socket request.
1575void RequestSocketOnComplete(ClientSocketHandle* handle,
1576 TestClientSocketPool* pool,
1577 TestConnectJobFactory* test_connect_job_factory,
1578 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411579 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091580 int first_request_result) {
robpercival214763f2016-07-01 23:27:011581 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091582
1583 test_connect_job_factory->set_job_type(next_job_type);
1584
1585 // Don't allow reuse of the socket. Disconnect it and then release it.
1586 if (handle->socket())
1587 handle->socket()->Disconnect();
1588 handle->Reset();
1589
mmenked3641e12016-01-28 16:06:151590 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091591 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501592 int rv = handle->Init(
Matt Menkec6b3edf72019-03-19 17:00:391593 TestGroupId("a"), params, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501594 ClientSocketPool::RespectLimits::ENABLED, nested_callback->callback(),
1595 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091596 if (rv != ERR_IO_PENDING) {
1597 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411598 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091599 } else {
1600 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521601 }
mmenke33d24423d2015-05-19 19:41:091602}
[email protected]f6d1d6eb2009-06-24 20:16:091603
mmenke33d24423d2015-05-19 19:41:091604// Tests the case where a second socket is requested in a completion callback,
1605// and the second socket connects asynchronously. Reuses the same
1606// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581607TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531608 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201609
[email protected]0b7648c2009-07-06 20:14:011610 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061611 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091612 TestCompletionCallback second_result_callback;
1613 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391614 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541615 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501616 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1617 connect_job_factory_, TestConnectJob::kMockPendingJob,
1618 &second_result_callback),
1619 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011620 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091621
robpercival214763f2016-07-01 23:27:011622 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581623}
[email protected]f6d1d6eb2009-06-24 20:16:091624
mmenke33d24423d2015-05-19 19:41:091625// Tests the case where a second socket is requested in a completion callback,
1626// and the second socket connects synchronously. Reuses the same
1627// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581628TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531629 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201630
[email protected]0b7648c2009-07-06 20:14:011631 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061632 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091633 TestCompletionCallback second_result_callback;
1634 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391635 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Paul Jensen8d6f87ec2018-01-13 00:46:541636 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501637 base::BindOnce(&RequestSocketOnComplete, &handle, pool_.get(),
1638 connect_job_factory_, TestConnectJob::kMockPendingJob,
1639 &second_result_callback),
1640 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011641 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581642
robpercival214763f2016-07-01 23:27:011643 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091644}
1645
1646// Make sure that pending requests get serviced after active requests get
1647// cancelled.
[email protected]ab838892009-06-30 18:49:051648TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531649 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201650
[email protected]0b7648c2009-07-06 20:14:011651 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091652
Matt Menkec6b3edf72019-03-19 17:00:391653 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1654 IsError(ERR_IO_PENDING));
1655 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1656 IsError(ERR_IO_PENDING));
1657 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1658 IsError(ERR_IO_PENDING));
1659 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1660 IsError(ERR_IO_PENDING));
1661 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1662 IsError(ERR_IO_PENDING));
1663 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1664 IsError(ERR_IO_PENDING));
1665 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1666 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091667
[email protected]c9d6a1d2009-07-14 16:15:201668 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1669 // Let's cancel them.
1670 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131671 ASSERT_FALSE(request(i)->handle()->is_initialized());
1672 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091673 }
1674
[email protected]f6d1d6eb2009-06-24 20:16:091675 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131676 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011677 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131678 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091679 }
1680
[email protected]2431756e2010-09-29 20:26:131681 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1682 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091683}
1684
1685// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051686TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531687 const size_t kMaxSockets = 5;
1688 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201689
[email protected]0b7648c2009-07-06 20:14:011690 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091691
[email protected]211d21722009-07-22 15:48:531692 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1693 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091694
1695 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531696 for (size_t i = 0; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391697 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1698 IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091699
[email protected]211d21722009-07-22 15:48:531700 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011701 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091702}
1703
mmenke9d72fe42017-05-18 22:36:071704// Make sure that pending requests that complete synchronously get serviced
1705// after active requests fail. See https://crbug.com/723748
1706TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1707 const size_t kNumberOfRequests = 10;
1708 const size_t kMaxSockets = 1;
1709 CreatePool(kMaxSockets, kMaxSockets);
1710
1711 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1712
Matt Menkec6b3edf72019-03-19 17:00:391713 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1714 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071715
1716 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1717
1718 // Queue up all the other requests
1719 for (size_t i = 1; i < kNumberOfRequests; ++i)
Matt Menkec6b3edf72019-03-19 17:00:391720 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1721 IsError(ERR_IO_PENDING));
mmenke9d72fe42017-05-18 22:36:071722
1723 // Make sure all requests fail, instead of hanging.
1724 for (size_t i = 0; i < kNumberOfRequests; ++i)
1725 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1726}
1727
[email protected]5fc08e32009-07-15 17:09:571728TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531729 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571730
1731 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1732
[email protected]2431756e2010-09-29 20:26:131733 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521734 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:501735 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391736 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501737 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1738 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011739 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571740
1741 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131742 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571743
Matt Menkec6b3edf72019-03-19 17:00:391744 rv = handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151745 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501746 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1747 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011748 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1749 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571750
[email protected]2431756e2010-09-29 20:26:131751 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481752 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571753 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1754}
1755
xunjieli26619e72016-11-23 19:39:551756TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551757 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1758 ClientSocketHandle handle;
1759 TestCompletionCallback callback;
1760 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501761 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391762 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501763 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1764 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551765 EXPECT_THAT(rv, IsOk());
1766 handle.Reset();
1767 EXPECT_EQ(1, pool_->IdleSocketCount());
1768 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551769}
1770
xunjieli92feb332017-03-03 17:19:231771TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231772 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1773 TestCompletionCallback callback;
1774 BoundTestNetLog log;
1775 ClientSocketHandle handle1;
Matt Menke28ac03e2019-02-25 22:25:501776 int rv = handle1.Init(
Matt Menkec6b3edf72019-03-19 17:00:391777 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501778 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1779 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231780 EXPECT_THAT(rv, IsOk());
1781 ClientSocketHandle handle2;
Matt Menkec6b3edf72019-03-19 17:00:391782 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231783 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501784 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1785 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231786 ClientSocketHandle handle3;
Matt Menkec6b3edf72019-03-19 17:00:391787 rv = handle3.Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231788 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501789 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1790 pool_.get(), log.bound());
xunjieli92feb332017-03-03 17:19:231791 EXPECT_THAT(rv, IsOk());
1792 handle1.Reset();
1793 handle2.Reset();
1794 handle3.Reset();
1795 EXPECT_EQ(3, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:391796 pool_->CloseIdleSocketsInGroup(TestGroupId("a"));
xunjieli92feb332017-03-03 17:19:231797 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231798}
1799
xunjieli26619e72016-11-23 19:39:551800TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551801 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1802 ClientSocketHandle handle;
1803 TestCompletionCallback callback;
1804 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501805 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391806 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501807 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1808 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551809 EXPECT_THAT(rv, IsOk());
1810 StreamSocket* socket = handle.socket();
1811 handle.Reset();
1812 EXPECT_EQ(1, pool_->IdleSocketCount());
1813
1814 // Disconnect socket now to make the socket unusable.
1815 socket->Disconnect();
1816 ClientSocketHandle handle2;
Matt Menkec6b3edf72019-03-19 17:00:391817 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551818 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501819 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
1820 pool_.get(), log.bound());
xunjieli26619e72016-11-23 19:39:551821 EXPECT_THAT(rv, IsOk());
1822 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551823}
1824
[email protected]2b7523d2009-07-29 20:29:231825// Regression test for http://crbug.com/17985.
1826TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1827 const int kMaxSockets = 3;
1828 const int kMaxSocketsPerGroup = 2;
1829 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1830
[email protected]ac790b42009-12-02 04:31:311831 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231832
Matt Menkec6b3edf72019-03-19 17:00:391833 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
1834 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231835
1836 // This is going to be a pending request in an otherwise empty group.
Matt Menkec6b3edf72019-03-19 17:00:391837 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1838 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231839
1840 // Reach the maximum socket limit.
Matt Menkec6b3edf72019-03-19 17:00:391841 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231842
1843 // Create a stalled group with high priorities.
Matt Menkec6b3edf72019-03-19 17:00:391844 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1845 IsError(ERR_IO_PENDING));
1846 EXPECT_THAT(StartRequest(TestGroupId("c"), kHighPriority),
1847 IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231848
Matt Menkec6b3edf72019-03-19 17:00:391849 // Release the first two sockets from TestGroupId("a"). Because this is a
1850 // keepalive, the first release will unblock the pending request for
1851 // TestGroupId("a"). The second release will unblock a request for "c",
1852 // because it is the next high priority socket.
[email protected]2431756e2010-09-29 20:26:131853 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1854 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231855
1856 // Closing idle sockets should not get us into trouble, but in the bug
1857 // we were hitting a CHECK here.
Matt Menkec6b3edf72019-03-19 17:00:391858 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]43a21b82010-06-10 21:30:541859 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261860
[email protected]2da659e2013-05-23 20:51:341861 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281862 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231863}
1864
[email protected]4d3b05d2010-01-27 21:27:291865TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531866 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571867
1868 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131869 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521870 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511871 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:501872 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:391873 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501874 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1875 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011876 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:391877 EXPECT_EQ(LOAD_STATE_CONNECTING,
1878 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]034df0f32013-01-07 23:17:481879 TestLoadTimingInfoNotConnected(handle);
1880
robpercival214763f2016-07-01 23:27:011881 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131882 EXPECT_TRUE(handle.is_initialized());
1883 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481884 TestLoadTimingInfoConnectedNotReused(handle);
1885
[email protected]2431756e2010-09-29 20:26:131886 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481887 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301888
mmenke43758e62015-05-04 21:09:461889 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401890 log.GetEntries(&entries);
1891
1892 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001893 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171894 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001895 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1896 NetLogEventPhase::NONE));
1897 EXPECT_TRUE(LogContainsEvent(entries, 2,
1898 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1899 NetLogEventPhase::NONE));
1900 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571901}
1902
[email protected]4d3b05d2010-01-27 21:27:291903TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571904 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531905 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571906
1907 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131908 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521909 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511910 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181911 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131912 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431913 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451914 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131915 handle.set_ssl_error_response_info(info);
Matt Menke28ac03e2019-02-25 22:25:501916 EXPECT_EQ(
1917 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391918 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501919 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1920 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1921 log.bound()));
Matt Menkec6b3edf72019-03-19 17:00:391922 EXPECT_EQ(LOAD_STATE_CONNECTING,
1923 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:011924 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131925 EXPECT_FALSE(handle.is_ssl_error());
Raul Tambre94493c652019-03-11 17:18:351926 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == nullptr);
[email protected]fd7b7c92009-08-20 19:38:301927
mmenke43758e62015-05-04 21:09:461928 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401929 log.GetEntries(&entries);
1930
1931 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001932 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171933 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001934 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1935 NetLogEventPhase::NONE));
1936 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571937}
1938
mmenke6be122f2015-03-09 22:22:471939// Check that an async ConnectJob failure does not result in creation of a new
1940// ConnectJob when there's another pending request also waiting on its own
1941// ConnectJob. See http://crbug.com/463960.
1942TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1943 CreatePool(2, 2);
1944 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1945
Matt Menkec6b3edf72019-03-19 17:00:391946 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1947 IsError(ERR_IO_PENDING));
1948 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
1949 IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471950
robpercival214763f2016-07-01 23:27:011951 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1952 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471953
1954 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1955}
1956
[email protected]4d3b05d2010-01-27 21:27:291957TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101958 // TODO(eroman): Add back the log expectations! Removed them because the
1959 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531960 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571961
1962 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131963 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521964 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131965 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521966 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571967
Matt Menke28ac03e2019-02-25 22:25:501968 EXPECT_EQ(
1969 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391970 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:501971 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
1972 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
1973 NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511974 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201975 EXPECT_EQ(
1976 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:391977 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201978 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:501979 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
1980 pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571981
[email protected]2431756e2010-09-29 20:26:131982 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571983
[email protected]fd7b7c92009-08-20 19:38:301984
1985 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301986
robpercival214763f2016-07-01 23:27:011987 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131988 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301989
1990 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531991 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571992}
1993
[email protected]4d3b05d2010-01-27 21:27:291994TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341995 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1996
[email protected]17a0c6c2009-08-04 00:07:041997 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1998
Matt Menkec6b3edf72019-03-19 17:00:391999 EXPECT_THAT(StartRequest(TestGroupId("a"), LOWEST), IsError(ERR_IO_PENDING));
2000 EXPECT_THAT(StartRequest(TestGroupId("a"), LOW), IsError(ERR_IO_PENDING));
2001 EXPECT_THAT(StartRequest(TestGroupId("a"), MEDIUM), IsError(ERR_IO_PENDING));
2002 EXPECT_THAT(StartRequest(TestGroupId("a"), HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:342003
Raul Tambre8335a6d2019-02-21 16:57:432004 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:392005 static_cast<int>(pool_->NumConnectJobsInGroup(TestGroupId("a"))));
[email protected]2431756e2010-09-29 20:26:132006 (*requests())[2]->handle()->Reset();
2007 (*requests())[3]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432008 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:392009 static_cast<int>(pool_->NumConnectJobsInGroup(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342010
[email protected]2431756e2010-09-29 20:26:132011 (*requests())[1]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432012 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:392013 static_cast<int>(pool_->NumConnectJobsInGroup(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342014
[email protected]2431756e2010-09-29 20:26:132015 (*requests())[0]->handle()->Reset();
Raul Tambre8335a6d2019-02-21 16:57:432016 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:392017 static_cast<int>(pool_->NumConnectJobsInGroup(TestGroupId("a"))));
[email protected]974ebd62009-08-03 23:14:342018}
2019
[email protected]5fc08e32009-07-15 17:09:572020// When requests and ConnectJobs are not coupled, the request will get serviced
2021// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:292022TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:532023 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572024
2025 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:322026 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:572027
[email protected]2431756e2010-09-29 20:26:132028 std::vector<TestSocketRequest*> request_order;
2029 size_t completion_count; // unused
2030 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502031 int rv = req1.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392032 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502033 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2034 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012035 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2036 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572037
2038 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
2039 // without a job.
2040 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2041
[email protected]2431756e2010-09-29 20:26:132042 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502043 rv = req2.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392044 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502045 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2046 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012047 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:132048 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502049 rv = req3.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392050 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502051 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2052 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012053 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572054
2055 // Both Requests 2 and 3 are pending. We release socket 1 which should
2056 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:332057 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:342058 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:282059 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:332060 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:012061 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:332062 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:572063
2064 // Signal job 2, which should service request 3.
2065
2066 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:012067 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:572068
Raul Tambre8335a6d2019-02-21 16:57:432069 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132070 EXPECT_EQ(&req1, request_order[0]);
2071 EXPECT_EQ(&req2, request_order[1]);
2072 EXPECT_EQ(&req3, request_order[2]);
Matt Menkec6b3edf72019-03-19 17:00:392073 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]5fc08e32009-07-15 17:09:572074}
2075
2076// The requests are not coupled to the jobs. So, the requests should finish in
2077// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:292078TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:532079 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:572080 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:322081 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:572082
[email protected]2431756e2010-09-29 20:26:132083 std::vector<TestSocketRequest*> request_order;
2084 size_t completion_count; // unused
2085 TestSocketRequest req1(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502086 int rv = req1.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392087 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502088 ClientSocketPool::RespectLimits::ENABLED, req1.callback(),
2089 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012090 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572091
[email protected]2431756e2010-09-29 20:26:132092 TestSocketRequest req2(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502093 rv = req2.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392094 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502095 ClientSocketPool::RespectLimits::ENABLED, req2.callback(),
2096 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012097 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572098
2099 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:322100 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:572101
[email protected]2431756e2010-09-29 20:26:132102 TestSocketRequest req3(&request_order, &completion_count);
Matt Menke28ac03e2019-02-25 22:25:502103 rv = req3.handle()->Init(
Matt Menkec6b3edf72019-03-19 17:00:392104 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502105 ClientSocketPool::RespectLimits::ENABLED, req3.callback(),
2106 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012107 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572108
robpercival214763f2016-07-01 23:27:012109 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2110 EXPECT_THAT(req2.WaitForResult(), IsOk());
2111 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572112
Raul Tambre8335a6d2019-02-21 16:57:432113 ASSERT_EQ(3u, request_order.size());
[email protected]2431756e2010-09-29 20:26:132114 EXPECT_EQ(&req1, request_order[0]);
2115 EXPECT_EQ(&req2, request_order[1]);
2116 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572117}
2118
[email protected]03b7c8c2013-07-20 04:38:552119// Test GetLoadState in the case there's only one socket request.
2120TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532121 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552122 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572123
[email protected]2431756e2010-09-29 20:26:132124 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522125 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502126 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392127 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502128 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2129 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012130 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552131 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572132
[email protected]03b7c8c2013-07-20 04:38:552133 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2134 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2135
2136 // No point in completing the connection, since ClientSocketHandles only
2137 // expect the LoadState to be checked while connecting.
2138}
2139
2140// Test GetLoadState in the case there are two socket requests.
2141TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2142 CreatePool(2, 2);
2143 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2144
2145 ClientSocketHandle handle;
2146 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502147 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392148 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502149 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2150 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012151 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002152 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2153
2154 ClientSocketHandle handle2;
2155 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392156 rv = handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152157 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502158 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2159 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012160 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002161 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2162
Matt Menke4b69f932019-03-04 16:20:012163 // Each handle should reflect the state of its own job.
haavardm835c1d62015-04-22 08:18:002164 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2165 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2166
Matt Menke4b69f932019-03-04 16:20:012167 // Update the state of the first job.
haavardm835c1d62015-04-22 08:18:002168 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2169
Matt Menke4b69f932019-03-04 16:20:012170 // Only the state of the first request should have changed.
haavardm835c1d62015-04-22 08:18:002171 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
haavardm835c1d62015-04-22 08:18:002172 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
Matt Menke4b69f932019-03-04 16:20:012173
2174 // Update the state of the second job.
2175 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_SSL_HANDSHAKE);
2176
2177 // Only the state of the second request should have changed.
2178 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2179 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2180
2181 // Second job connects and the first request gets the socket. The
2182 // second handle switches to the state of the remaining ConnectJob.
2183 client_socket_factory_.SignalJob(1);
2184 EXPECT_THAT(callback.WaitForResult(), IsOk());
2185 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552186}
2187
2188// Test GetLoadState in the case the per-group limit is reached.
2189TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2190 CreatePool(2, 1);
2191 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2192
2193 ClientSocketHandle handle;
2194 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502195 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392196 TestGroupId("a"), params_, MEDIUM, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502197 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2198 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012199 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552200 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2201
2202 // Request another socket from the same pool, buth with a higher priority.
2203 // The first request should now be stalled at the socket group limit.
2204 ClientSocketHandle handle2;
2205 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392206 rv = handle2.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152207 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502208 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2209 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012210 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552211 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2212 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2213
2214 // The first handle should remain stalled as the other socket goes through
2215 // the connect process.
2216
2217 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2218 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2219 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2220
2221 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012222 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552223 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2224
2225 // Closing the second socket should cause the stalled handle to finally get a
2226 // ConnectJob.
2227 handle2.socket()->Disconnect();
2228 handle2.Reset();
2229 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2230}
2231
2232// Test GetLoadState in the case the per-pool limit is reached.
2233TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2234 CreatePool(2, 2);
2235 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2236
2237 ClientSocketHandle handle;
2238 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502239 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392240 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502241 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2242 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012243 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552244
2245 // Request for socket from another pool.
2246 ClientSocketHandle handle2;
2247 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392248 rv = handle2.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152249 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502250 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2251 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012252 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552253
2254 // Request another socket from the first pool. Request should stall at the
2255 // socket pool limit.
2256 ClientSocketHandle handle3;
2257 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392258 rv = handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152259 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502260 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2261 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012262 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552263
2264 // The third handle should remain stalled as the other sockets in its group
2265 // goes through the connect process.
2266
2267 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2268 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2269
2270 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2271 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2272 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2273
2274 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012275 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552276 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2277
2278 // Closing a socket should allow the stalled handle to finally get a new
2279 // ConnectJob.
2280 handle.socket()->Disconnect();
2281 handle.Reset();
2282 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572283}
2284
Matt Menkeb57663b32019-03-01 17:17:102285TEST_F(ClientSocketPoolBaseTest, CertError) {
[email protected]e772db3f2010-07-12 18:11:132286 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Matt Menkeb57663b32019-03-01 17:17:102287 connect_job_factory_->set_job_type(TestConnectJob::kMockCertErrorJob);
[email protected]e772db3f2010-07-12 18:11:132288
[email protected]2431756e2010-09-29 20:26:132289 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522290 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502291 EXPECT_EQ(
Matt Menkeb57663b32019-03-01 17:17:102292 ERR_CERT_COMMON_NAME_INVALID,
Matt Menkec6b3edf72019-03-19 17:00:392293 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502294 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2295 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2296 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132297 EXPECT_TRUE(handle.is_initialized());
2298 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132299}
2300
Matt Menkeb57663b32019-03-01 17:17:102301TEST_F(ClientSocketPoolBaseTest, AsyncCertError) {
[email protected]e772db3f2010-07-12 18:11:132302 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2303
Matt Menkeb57663b32019-03-01 17:17:102304 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingCertErrorJob);
[email protected]2431756e2010-09-29 20:26:132305 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522306 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502307 EXPECT_EQ(
2308 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392309 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502310 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2311 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2312 NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392313 EXPECT_EQ(LOAD_STATE_CONNECTING,
2314 pool_->GetLoadState(TestGroupId("a"), &handle));
Matt Menkeb57663b32019-03-01 17:17:102315 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CERT_COMMON_NAME_INVALID));
[email protected]2431756e2010-09-29 20:26:132316 EXPECT_TRUE(handle.is_initialized());
2317 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132318}
2319
[email protected]e60e47a2010-07-14 03:37:182320TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2321 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2322 connect_job_factory_->set_job_type(
2323 TestConnectJob::kMockAdditionalErrorStateJob);
2324
[email protected]2431756e2010-09-29 20:26:132325 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522326 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502327 EXPECT_EQ(
2328 ERR_CONNECTION_FAILED,
Matt Menkec6b3edf72019-03-19 17:00:392329 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502330 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2331 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2332 NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132333 EXPECT_FALSE(handle.is_initialized());
2334 EXPECT_FALSE(handle.socket());
2335 EXPECT_TRUE(handle.is_ssl_error());
Raul Tambre94493c652019-03-11 17:18:352336 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == nullptr);
[email protected]e60e47a2010-07-14 03:37:182337}
2338
2339TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2340 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2341
2342 connect_job_factory_->set_job_type(
2343 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132344 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522345 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502346 EXPECT_EQ(
2347 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392348 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502349 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2350 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2351 NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392352 EXPECT_EQ(LOAD_STATE_CONNECTING,
2353 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012354 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132355 EXPECT_FALSE(handle.is_initialized());
2356 EXPECT_FALSE(handle.socket());
2357 EXPECT_TRUE(handle.is_ssl_error());
Raul Tambre94493c652019-03-11 17:18:352358 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == nullptr);
[email protected]e60e47a2010-07-14 03:37:182359}
2360
martijn003cd612016-05-19 22:24:382361// Make sure we can reuse sockets.
2362TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412363 CreatePoolWithIdleTimeouts(
2364 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032365 base::TimeDelta(), // Time out unused sockets immediately.
2366 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2367
2368 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2369
2370 ClientSocketHandle handle;
2371 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502372 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392373 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502374 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2375 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012376 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392377 EXPECT_EQ(LOAD_STATE_CONNECTING,
2378 pool_->GetLoadState(TestGroupId("a"), &handle));
robpercival214763f2016-07-01 23:27:012379 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032380
2381 // Use and release the socket.
Raul Tambre94493c652019-03-11 17:18:352382 EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382383 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482384 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032385 handle.Reset();
2386
2387 // Should now have one idle socket.
2388 ASSERT_EQ(1, pool_->IdleSocketCount());
2389
2390 // Request a new socket. This should reuse the old socket and complete
2391 // synchronously.
vishal.b62985ca92015-04-17 08:45:512392 BoundTestNetLog log;
Matt Menke28ac03e2019-02-25 22:25:502393 rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392394 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502395 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2396 ClientSocketPool::ProxyAuthCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012397 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032398 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482399 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032400
Matt Menkec6b3edf72019-03-19 17:00:392401 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
2402 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
2403 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
[email protected]e7b1c6d2c2012-05-05 00:54:032404
mmenke43758e62015-05-04 21:09:462405 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032406 log.GetEntries(&entries);
2407 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002408 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032409}
2410
martijn003cd612016-05-19 22:24:382411// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172412TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032413 CreatePoolWithIdleTimeouts(
2414 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2415 base::TimeDelta(), // Time out unused sockets immediately
2416 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412417
2418 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2419
2420 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2421
2422 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522423 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502424 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392425 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502426 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2427 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012428 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392429 EXPECT_EQ(LOAD_STATE_CONNECTING,
2430 pool_->GetLoadState(TestGroupId("a"), &handle));
[email protected]64770b7d2011-11-16 04:30:412431
2432 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522433 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392434 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152435 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502436 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2437 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012438 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
Matt Menkec6b3edf72019-03-19 17:00:392439 EXPECT_EQ(LOAD_STATE_CONNECTING,
2440 pool_->GetLoadState(TestGroupId("a"), &handle2));
[email protected]64770b7d2011-11-16 04:30:412441
2442 // Cancel one of the requests. Wait for the other, which will get the first
2443 // job. Release the socket. Run the loop again to make sure the second
2444 // socket is sitting idle and the first one is released (since ReleaseSocket()
2445 // just posts a DoReleaseSocket() task).
2446
2447 handle.Reset();
robpercival214763f2016-07-01 23:27:012448 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412449 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:352450 EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382451 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412452 handle2.Reset();
2453
[email protected]e7b1c6d2c2012-05-05 00:54:032454 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2455 // actually become pending until 2ms after they have been created. In order
2456 // to flush all tasks, we need to wait so that we know there are no
2457 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452458 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412459
[email protected]e7b1c6d2c2012-05-05 00:54:032460 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412461 ASSERT_EQ(2, pool_->IdleSocketCount());
2462
2463 // Request a new socket. This should cleanup the unused and timed out ones.
2464 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512465 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522466 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392467 rv = handle.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152468 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502469 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2470 pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012471 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2472 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412473 EXPECT_FALSE(handle.is_reused());
2474
[email protected]e7b1c6d2c2012-05-05 00:54:032475 // Make sure the idle socket is closed.
Matt Menkec6b3edf72019-03-19 17:00:392476 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
2477 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
2478 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
[email protected]64770b7d2011-11-16 04:30:412479
mmenke43758e62015-05-04 21:09:462480 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412481 log.GetEntries(&entries);
2482 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002483 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412484}
2485
[email protected]2041cf342010-02-19 03:15:592486// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162487// because of multiple releasing disconnected sockets.
2488TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2489 CreatePoolWithIdleTimeouts(
2490 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2491 base::TimeDelta(), // Time out unused sockets immediately.
2492 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2493
2494 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2495
2496 // Startup 4 connect jobs. Two of them will be pending.
2497
[email protected]2431756e2010-09-29 20:26:132498 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522499 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502500 int rv = handle.Init(
Matt Menkec6b3edf72019-03-19 17:00:392501 TestGroupId("a"), params_, LOWEST, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502502 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2503 ClientSocketPool::ProxyAuthCallback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012504 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162505
[email protected]2431756e2010-09-29 20:26:132506 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522507 TestCompletionCallback callback2;
Matt Menkec6b3edf72019-03-19 17:00:392508 rv = handle2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152509 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502510 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2511 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012512 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162513
[email protected]2431756e2010-09-29 20:26:132514 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522515 TestCompletionCallback callback3;
Matt Menkec6b3edf72019-03-19 17:00:392516 rv = handle3.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152517 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502518 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
2519 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012520 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162521
[email protected]2431756e2010-09-29 20:26:132522 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522523 TestCompletionCallback callback4;
Matt Menkec6b3edf72019-03-19 17:00:392524 rv = handle4.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152525 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502526 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
2527 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012528 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162529
2530 // Release two disconnected sockets.
2531
[email protected]2431756e2010-09-29 20:26:132532 handle.socket()->Disconnect();
2533 handle.Reset();
2534 handle2.socket()->Disconnect();
2535 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162536
robpercival214763f2016-07-01 23:27:012537 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132538 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012539 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132540 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162541}
2542
[email protected]d7027bb2010-05-10 18:58:542543// Regression test for http://crbug.com/42267.
2544// When DoReleaseSocket() is processed for one socket, it is blocked because the
2545// other stalled groups all have releasing sockets, so no progress can be made.
2546TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2547 CreatePoolWithIdleTimeouts(
2548 4 /* socket limit */, 4 /* socket limit per group */,
2549 base::TimeDelta(), // Time out unused sockets immediately.
2550 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2551
2552 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2553
2554 // Max out the socket limit with 2 per group.
2555
[email protected]2431756e2010-09-29 20:26:132556 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522557 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132558 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522559 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542560
2561 for (int i = 0; i < 2; ++i) {
Matt Menkec6b3edf72019-03-19 17:00:392562 EXPECT_EQ(
2563 OK, handle_a[i].Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
2564 ClientSocketPool::RespectLimits::ENABLED,
2565 callback_a[i].callback(),
2566 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2567 NetLogWithSource()));
2568 EXPECT_EQ(
2569 OK, handle_b[i].Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
2570 ClientSocketPool::RespectLimits::ENABLED,
2571 callback_b[i].callback(),
2572 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2573 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542574 }
[email protected]b89f7e42010-05-20 20:37:002575
[email protected]d7027bb2010-05-10 18:58:542576 // Make 4 pending requests, 2 per group.
2577
2578 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202579 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392580 handle_a[i].Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202581 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502582 callback_a[i].callback(),
2583 ClientSocketPool::ProxyAuthCallback(),
2584 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:202585 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392586 handle_b[i].Init(TestGroupId("b"), params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202587 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502588 callback_b[i].callback(),
2589 ClientSocketPool::ProxyAuthCallback(),
2590 pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542591 }
2592
2593 // Release b's socket first. The order is important, because in
2594 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2595 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2596 // first, which has a releasing socket, so it refuses to start up another
2597 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132598 handle_b[0].socket()->Disconnect();
2599 handle_b[0].Reset();
2600 handle_a[0].socket()->Disconnect();
2601 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542602
2603 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282604 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542605
[email protected]2431756e2010-09-29 20:26:132606 handle_b[1].socket()->Disconnect();
2607 handle_b[1].Reset();
2608 handle_a[1].socket()->Disconnect();
2609 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542610
2611 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012612 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2613 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542614 }
2615}
2616
[email protected]fd4fe0b2010-02-08 23:02:152617TEST_F(ClientSocketPoolBaseTest,
2618 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2619 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2620
2621 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2622
Matt Menkec6b3edf72019-03-19 17:00:392623 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2624 IsError(ERR_IO_PENDING));
2625 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2626 IsError(ERR_IO_PENDING));
2627 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2628 IsError(ERR_IO_PENDING));
2629 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY),
2630 IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152631
robpercival214763f2016-07-01 23:27:012632 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2633 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132634 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152635
2636 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132637 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012638 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152639
[email protected]2431756e2010-09-29 20:26:132640 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012641 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132642 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152643
2644 EXPECT_EQ(1, GetOrderOfRequest(1));
2645 EXPECT_EQ(2, GetOrderOfRequest(2));
2646 EXPECT_EQ(3, GetOrderOfRequest(3));
2647 EXPECT_EQ(4, GetOrderOfRequest(4));
2648
2649 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132650 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152651}
2652
[email protected]6ecf2b92011-12-15 01:14:522653class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042654 public:
[email protected]2431756e2010-09-29 20:26:132655 TestReleasingSocketRequest(TestClientSocketPool* pool,
2656 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182657 bool reset_releasing_handle)
2658 : pool_(pool),
2659 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042660 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522661
Chris Watkins7a41d3552017-12-01 02:13:272662 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042663
2664 ClientSocketHandle* handle() { return &handle_; }
2665
Bence Béky8ddc2492018-06-13 01:02:042666 CompletionOnceCallback callback() {
2667 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2668 base::Unretained(this));
2669 }
[email protected]4f1e4982010-03-02 18:31:042670
2671 private:
[email protected]6ecf2b92011-12-15 01:14:522672 void OnComplete(int result) {
2673 SetResult(result);
2674 if (reset_releasing_handle_)
2675 handle_.Reset();
2676
mmenked3641e12016-01-28 16:06:152677 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
Matt Menkec6b3edf72019-03-19 17:00:392678 EXPECT_EQ(
2679 expected_result_,
2680 handle2_.Init(
2681 TestGroupId("a"), con_params, DEFAULT_PRIORITY, SocketTag(),
2682 ClientSocketPool::RespectLimits::ENABLED, CompletionOnceCallback(),
2683 ClientSocketPool::ProxyAuthCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522684 }
2685
[email protected]2431756e2010-09-29 20:26:132686 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182687 int expected_result_;
2688 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042689 ClientSocketHandle handle_;
2690 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042691};
2692
[email protected]e60e47a2010-07-14 03:37:182693
2694TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2695 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2696
Matt Menkec6b3edf72019-03-19 17:00:392697 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
2698 EXPECT_THAT(StartRequest(TestGroupId("a"), DEFAULT_PRIORITY), IsOk());
2699 EXPECT_THAT(StartRequest(TestGroupId("b"), DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182700
[email protected]2431756e2010-09-29 20:26:132701 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182702 client_socket_factory_.allocation_count());
2703
2704 connect_job_factory_->set_job_type(
2705 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2706 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202707 EXPECT_EQ(
2708 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392709 req.handle()->Init(TestGroupId("a"), params_, DEFAULT_PRIORITY,
2710 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502711 req.callback(), ClientSocketPool::ProxyAuthCallback(),
2712 pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182713 // The next job should complete synchronously
2714 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2715
robpercival214763f2016-07-01 23:27:012716 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182717 EXPECT_FALSE(req.handle()->is_initialized());
2718 EXPECT_FALSE(req.handle()->socket());
2719 EXPECT_TRUE(req.handle()->is_ssl_error());
Raul Tambre94493c652019-03-11 17:18:352720 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() ==
2721 nullptr);
[email protected]e60e47a2010-07-14 03:37:182722}
2723
[email protected]b6501d3d2010-06-03 23:53:342724// http://crbug.com/44724 regression test.
2725// We start releasing the pool when we flush on network change. When that
2726// happens, the only active references are in the ClientSocketHandles. When a
2727// ConnectJob completes and calls back into the last ClientSocketHandle, that
2728// callback can release the last reference and delete the pool. After the
2729// callback finishes, we go back to the stack frame within the now-deleted pool.
2730// Executing any code that refers to members of the now-deleted pool can cause
2731// crashes.
2732TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2733 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2734 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2735
2736 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522737 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502738 EXPECT_EQ(
2739 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392740 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502741 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2742 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2743 NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342744
[email protected]7af985a2012-12-14 22:40:422745 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342746
2747 // We'll call back into this now.
2748 callback.WaitForResult();
2749}
2750
[email protected]a7e38572010-06-07 18:22:242751TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2752 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2753 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2754
2755 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522756 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502757 EXPECT_EQ(
2758 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392759 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502760 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2761 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2762 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012763 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242764 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2765
[email protected]7af985a2012-12-14 22:40:422766 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242767
2768 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282769 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242770
Matt Menke28ac03e2019-02-25 22:25:502771 EXPECT_EQ(
2772 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392773 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502774 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2775 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2776 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012777 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242778 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2779}
2780
[email protected]6ecf2b92011-12-15 01:14:522781class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142782 public:
Matt Menkec6b3edf72019-03-19 17:00:392783 ConnectWithinCallback(const ClientSocketPool::GroupId& group_id,
Bence Béky8ddc2492018-06-13 01:02:042784 const scoped_refptr<TestSocketParams>& params,
2785 TestClientSocketPool* pool)
Matt Menkec6b3edf72019-03-19 17:00:392786 : group_id_(group_id), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142787
Chris Watkins7a41d3552017-12-01 02:13:272788 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142789
2790 int WaitForNestedResult() {
2791 return nested_callback_.WaitForResult();
2792 }
2793
Bence Béky8ddc2492018-06-13 01:02:042794 CompletionOnceCallback callback() {
2795 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2796 base::Unretained(this));
2797 }
[email protected]6ecf2b92011-12-15 01:14:522798
[email protected]06f92462010-08-31 19:24:142799 private:
[email protected]6ecf2b92011-12-15 01:14:522800 void OnComplete(int result) {
2801 SetResult(result);
Matt Menke28ac03e2019-02-25 22:25:502802 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392803 handle_.Init(group_id_, params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502804 ClientSocketPool::RespectLimits::ENABLED,
2805 nested_callback_.callback(),
2806 ClientSocketPool::ProxyAuthCallback(), pool_,
2807 NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522808 }
2809
Matt Menkec6b3edf72019-03-19 17:00:392810 const ClientSocketPool::GroupId group_id_;
[email protected]06f92462010-08-31 19:24:142811 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132812 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142813 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522814 TestCompletionCallback nested_callback_;
2815
2816 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142817};
2818
2819TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2820 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2821
2822 // First job will be waiting until it gets aborted.
2823 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2824
2825 ClientSocketHandle handle;
Matt Menkec6b3edf72019-03-19 17:00:392826 ConnectWithinCallback callback(TestGroupId("a"), params_, pool_.get());
Matt Menke28ac03e2019-02-25 22:25:502827 EXPECT_EQ(
2828 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392829 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502830 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2831 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2832 NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142833
2834 // Second job will be started during the first callback, and will
2835 // asynchronously complete with OK.
2836 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422837 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012838 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2839 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142840}
2841
Matt Menke141b87f22019-01-30 02:43:032842TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
2843 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2844 pool_->EnableConnectBackupJobs();
2845
2846 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2847 ClientSocketHandle handle;
2848 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502849 EXPECT_EQ(
2850 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392851 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502852 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2853 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2854 NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:032855 // The backup timer fires but doesn't start a new ConnectJob while resolving
2856 // the hostname.
2857 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2858 FastForwardBy(base::TimeDelta::FromMilliseconds(
2859 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2860 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2861
2862 // Once the ConnectJob has finished resolving the hostname, the backup timer
2863 // will create a ConnectJob when it fires.
2864 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2865 FastForwardBy(base::TimeDelta::FromMilliseconds(
2866 ClientSocketPool::kMaxConnectRetryIntervalMs));
2867 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2868}
2869
2870// Test that no backup socket is created when a ConnectJob connects before it
2871// completes.
2872TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
2873 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2874 pool_->EnableConnectBackupJobs();
2875
2876 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2877 ClientSocketHandle handle;
2878 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502879 EXPECT_EQ(
2880 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392881 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502882 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2883 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2884 NetLogWithSource()));
Matt Menke141b87f22019-01-30 02:43:032885 // The backup timer fires but doesn't start a new ConnectJob while resolving
2886 // the hostname.
2887 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2888 FastForwardBy(base::TimeDelta::FromMilliseconds(
2889 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2890 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2891
2892 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2893 client_socket_factory_.SetJobHasEstablishedConnection(0);
2894 FastForwardBy(base::TimeDelta::FromMilliseconds(
2895 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2896 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2897}
2898
[email protected]25eea382010-07-10 23:55:262899// Cancel a pending socket request while we're at max sockets,
2900// and verify that the backup socket firing doesn't cause a crash.
2901TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2902 // Max 4 sockets globally, max 4 sockets per group.
2903 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222904 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262905
[email protected]4baaf9d2010-08-31 15:15:442906 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2907 // timer.
[email protected]25eea382010-07-10 23:55:262908 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2909 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522910 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502911 EXPECT_EQ(
2912 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392913 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502914 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2915 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2916 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262917
2918 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2919 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2920 ClientSocketHandle handles[kDefaultMaxSockets];
2921 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522922 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:392923 EXPECT_EQ(OK, handles[i].Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY,
2924 SocketTag(),
tfarina428341112016-09-22 13:38:202925 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502926 callback.callback(),
2927 ClientSocketPool::ProxyAuthCallback(),
2928 pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262929 }
2930
fdoray5eeb7642016-06-22 16:11:282931 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262932
2933 // Cancel the pending request.
2934 handle.Reset();
2935
2936 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452937 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002938 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262939
[email protected]25eea382010-07-10 23:55:262940 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2941}
2942
[email protected]3f00be82010-09-27 19:50:022943TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442944 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2945 pool_->EnableConnectBackupJobs();
2946
2947 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2948 // timer.
2949 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2950 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522951 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502952 EXPECT_EQ(
2953 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392954 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502955 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2956 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2957 NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392958 ASSERT_TRUE(pool_->HasGroup(TestGroupId("bar")));
2959 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("bar")));
2960 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("bar")));
2961 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:442962
2963 // Cancel the socket request. This should cancel the backup timer. Wait for
2964 // the backup time to see if it indeed got canceled.
2965 handle.Reset();
2966 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452967 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002968 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
Matt Menkec6b3edf72019-03-19 17:00:392969 ASSERT_TRUE(pool_->HasGroup(TestGroupId("bar")));
2970 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("bar")));
[email protected]4baaf9d2010-08-31 15:15:442971}
2972
[email protected]3f00be82010-09-27 19:50:022973TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2974 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2975 pool_->EnableConnectBackupJobs();
2976
2977 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2978 // timer.
2979 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2980 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522981 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:502982 EXPECT_EQ(
2983 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392984 handle.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:502985 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
2986 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
2987 NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022988 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2989 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522990 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202991 EXPECT_EQ(
2992 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:392993 handle2.Init(TestGroupId("bar"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202994 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:502995 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
2996 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:392997 ASSERT_TRUE(pool_->HasGroup(TestGroupId("bar")));
2998 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("bar")));
[email protected]3f00be82010-09-27 19:50:022999
3000 // Cancel request 1 and then complete request 2. With the requests finished,
3001 // the backup timer should be cancelled.
3002 handle.Reset();
robpercival214763f2016-07-01 23:27:013003 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:023004 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:453005 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:003006 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:023007}
3008
[email protected]eb5a99382010-07-11 03:18:263009// Test delayed socket binding for the case where we have two connects,
3010// and while one is waiting on a connect, the other frees up.
3011// The socket waiting on a connect should switch immediately to the freed
3012// up socket.
3013TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
3014 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3015 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3016
3017 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523018 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503019 EXPECT_EQ(
3020 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393021 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503022 ClientSocketPool::RespectLimits::ENABLED,
3023 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3024 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013025 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263026
3027 // No idle sockets, no pending jobs.
3028 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:393029 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263030
3031 // Create a second socket to the same host, but this one will wait.
3032 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3033 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503034 EXPECT_EQ(
3035 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393036 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503037 ClientSocketPool::RespectLimits::ENABLED,
3038 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3039 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263040 // No idle sockets, and one connecting job.
3041 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:393042 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263043
3044 // Return the first handle to the pool. This will initiate the delayed
3045 // binding.
3046 handle1.Reset();
3047
fdoray5eeb7642016-06-22 16:11:283048 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263049
3050 // Still no idle sockets, still one pending connect job.
3051 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:393052 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263053
3054 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013055 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263056
3057 // And we can see there is still one job waiting.
Matt Menkec6b3edf72019-03-19 17:00:393058 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263059
3060 // Finally, signal the waiting Connect.
3061 client_socket_factory_.SignalJobs();
Matt Menkec6b3edf72019-03-19 17:00:393062 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263063
fdoray5eeb7642016-06-22 16:11:283064 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263065}
3066
3067// Test delayed socket binding when a group is at capacity and one
3068// of the group's sockets frees up.
3069TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
3070 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3071 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3072
3073 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523074 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503075 EXPECT_EQ(
3076 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393077 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503078 ClientSocketPool::RespectLimits::ENABLED,
3079 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3080 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013081 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263082
3083 // No idle sockets, no pending jobs.
3084 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:393085 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263086
3087 // Create a second socket to the same host, but this one will wait.
3088 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3089 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503090 EXPECT_EQ(
3091 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393092 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503093 ClientSocketPool::RespectLimits::ENABLED,
3094 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3095 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263096 // No idle sockets, and one connecting job.
3097 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:393098 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263099
3100 // Return the first handle to the pool. This will initiate the delayed
3101 // binding.
3102 handle1.Reset();
3103
fdoray5eeb7642016-06-22 16:11:283104 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263105
3106 // Still no idle sockets, still one pending connect job.
3107 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:393108 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263109
3110 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013111 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263112
3113 // And we can see there is still one job waiting.
Matt Menkec6b3edf72019-03-19 17:00:393114 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263115
3116 // Finally, signal the waiting Connect.
3117 client_socket_factory_.SignalJobs();
Matt Menkec6b3edf72019-03-19 17:00:393118 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263119
fdoray5eeb7642016-06-22 16:11:283120 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263121}
3122
3123// Test out the case where we have one socket connected, one
3124// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:513125// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:263126// should complete, by taking the first socket's idle socket.
3127TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
3128 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3129 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3130
3131 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523132 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503133 EXPECT_EQ(
3134 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393135 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503136 ClientSocketPool::RespectLimits::ENABLED,
3137 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3138 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013139 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263140
3141 // No idle sockets, no pending jobs.
3142 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:393143 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263144
3145 // Create a second socket to the same host, but this one will wait.
3146 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3147 ClientSocketHandle handle2;
Matt Menke28ac03e2019-02-25 22:25:503148 EXPECT_EQ(
3149 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393150 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503151 ClientSocketPool::RespectLimits::ENABLED,
3152 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3153 pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:263154 // No idle sockets, and one connecting job.
3155 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:393156 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263157
3158 // Return the first handle to the pool. This will initiate the delayed
3159 // binding.
3160 handle1.Reset();
3161
fdoray5eeb7642016-06-22 16:11:283162 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263163
3164 // Still no idle sockets, still one pending connect job.
3165 EXPECT_EQ(0, pool_->IdleSocketCount());
Matt Menkec6b3edf72019-03-19 17:00:393166 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263167
3168 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013169 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263170
3171 // And we can see there is still one job waiting.
Matt Menkec6b3edf72019-03-19 17:00:393172 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263173
3174 // Finally, signal the waiting Connect.
3175 client_socket_factory_.SignalJobs();
Matt Menkec6b3edf72019-03-19 17:00:393176 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]eb5a99382010-07-11 03:18:263177
fdoray5eeb7642016-06-22 16:11:283178 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263179}
3180
[email protected]2abfe90a2010-08-25 17:49:513181// Cover the case where on an available socket slot, we have one pending
3182// request that completes synchronously, thereby making the Group empty.
3183TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3184 const int kUnlimitedSockets = 100;
3185 const int kOneSocketPerGroup = 1;
3186 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3187
3188 // Make the first request asynchronous fail.
3189 // This will free up a socket slot later.
3190 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3191
3192 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523193 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203194 EXPECT_EQ(
3195 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393196 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203197 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503198 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3199 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:393200 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513201
3202 // Make the second request synchronously fail. This should make the Group
3203 // empty.
3204 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3205 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523206 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513207 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3208 // when created.
tfarina428341112016-09-22 13:38:203209 EXPECT_EQ(
3210 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393211 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203212 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503213 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3214 pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513215
Matt Menkec6b3edf72019-03-19 17:00:393216 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513217
robpercival214763f2016-07-01 23:27:013218 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3219 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
Matt Menkec6b3edf72019-03-19 17:00:393220 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
[email protected]2abfe90a2010-08-25 17:49:513221}
3222
[email protected]e1b54dc2010-10-06 21:27:223223TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3224 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3225
3226 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3227
3228 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523229 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203230 EXPECT_EQ(
3231 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393232 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203233 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503234 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3235 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223236
3237 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523238 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203239 EXPECT_EQ(
3240 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393241 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203242 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503243 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3244 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223245 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523246 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203247 EXPECT_EQ(
3248 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393249 handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203250 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503251 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3252 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223253
robpercival214763f2016-07-01 23:27:013254 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3255 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3256 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223257
3258 // Use the socket.
Raul Tambre94493c652019-03-11 17:18:353259 EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383260 TRAFFIC_ANNOTATION_FOR_TESTS));
Raul Tambre94493c652019-03-11 17:18:353261 EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383262 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223263
3264 handle1.Reset();
3265 handle2.Reset();
3266 handle3.Reset();
3267
Matt Menkec6b3edf72019-03-19 17:00:393268 EXPECT_EQ(OK, handle1.Init(
3269 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3270 ClientSocketPool::RespectLimits::ENABLED,
3271 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3272 pool_.get(), NetLogWithSource()));
3273 EXPECT_EQ(OK, handle2.Init(
3274 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3275 ClientSocketPool::RespectLimits::ENABLED,
3276 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3277 pool_.get(), NetLogWithSource()));
3278 EXPECT_EQ(OK, handle3.Init(
3279 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3280 ClientSocketPool::RespectLimits::ENABLED,
3281 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3282 pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223283
3284 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3285 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3286 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3287}
3288
[email protected]2c2bef152010-10-13 00:55:033289TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3290 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3291 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3292
Matt Menkec6b3edf72019-03-19 17:00:393293 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033294
Matt Menkec6b3edf72019-03-19 17:00:393295 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3296 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3297 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3298 EXPECT_EQ(2u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3299 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033300
3301 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523302 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203303 EXPECT_EQ(
3304 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393305 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203306 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503307 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3308 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033309
3310 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523311 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203312 EXPECT_EQ(
3313 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393314 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203315 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503316 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3317 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033318
Matt Menkec6b3edf72019-03-19 17:00:393319 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3320 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3321 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3322 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033323
robpercival214763f2016-07-01 23:27:013324 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3325 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033326 handle1.Reset();
3327 handle2.Reset();
3328
Matt Menkec6b3edf72019-03-19 17:00:393329 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3330 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3331 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3332 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033333}
3334
3335TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3336 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3337 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3338
3339 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523340 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203341 EXPECT_EQ(
3342 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393343 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203344 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503345 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3346 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033347
Matt Menkec6b3edf72019-03-19 17:00:393348 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3349 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3350 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3351 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3352 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033353
Matt Menkec6b3edf72019-03-19 17:00:393354 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033355
Matt Menkec6b3edf72019-03-19 17:00:393356 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3357 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3358 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3359 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033360
3361 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523362 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203363 EXPECT_EQ(
3364 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393365 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203366 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503367 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3368 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033369
Matt Menkec6b3edf72019-03-19 17:00:393370 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3371 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3372 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3373 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033374
robpercival214763f2016-07-01 23:27:013375 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3376 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033377 handle1.Reset();
3378 handle2.Reset();
3379
Matt Menkec6b3edf72019-03-19 17:00:393380 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3381 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3382 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3383 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033384}
3385
3386TEST_F(ClientSocketPoolBaseTest,
3387 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3388 CreatePool(4, 4);
3389 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3390
3391 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523392 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203393 EXPECT_EQ(
3394 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393395 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203396 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503397 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3398 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033399
3400 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523401 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203402 EXPECT_EQ(
3403 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393404 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203405 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503406 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3407 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033408
3409 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523410 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203411 EXPECT_EQ(
3412 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393413 handle3.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203414 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503415 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
3416 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033417
Matt Menkec6b3edf72019-03-19 17:00:393418 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3419 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3420 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3421 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3422 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033423
Matt Menkec6b3edf72019-03-19 17:00:393424 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033425
Matt Menkec6b3edf72019-03-19 17:00:393426 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3427 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3428 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3429 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 Menkec6b3edf72019-03-19 17:00:393438 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3439 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3440 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3441 EXPECT_EQ(3u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033442}
3443
3444TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3445 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3446 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3447
Matt Menkec6b3edf72019-03-19 17:00:393448 ASSERT_FALSE(pool_->HasGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033449
Matt Menkec6b3edf72019-03-19 17:00:393450 pool_->RequestSockets(TestGroupId("a"), &params_, kDefaultMaxSockets,
3451 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033452
Matt Menkec6b3edf72019-03-19 17:00:393453 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433454 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393455 static_cast<int>(pool_->NumConnectJobsInGroup(TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433456 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393457 static_cast<int>(
3458 pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433459 EXPECT_EQ(kDefaultMaxSockets,
Matt Menkec6b3edf72019-03-19 17:00:393460 static_cast<int>(
3461 pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033462
Matt Menkec6b3edf72019-03-19 17:00:393463 ASSERT_FALSE(pool_->HasGroup(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033464
Matt Menkec6b3edf72019-03-19 17:00:393465 pool_->RequestSockets(TestGroupId("b"), &params_, kDefaultMaxSockets,
3466 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033467
Matt Menkec6b3edf72019-03-19 17:00:393468 ASSERT_FALSE(pool_->HasGroup(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033469}
3470
3471TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3472 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3473 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3474
Matt Menkec6b3edf72019-03-19 17:00:393475 ASSERT_FALSE(pool_->HasGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033476
Matt Menkec6b3edf72019-03-19 17:00:393477 pool_->RequestSockets(TestGroupId("a"), &params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573478 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033479
Matt Menkec6b3edf72019-03-19 17:00:393480 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103481 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393482 static_cast<int>(pool_->NumConnectJobsInGroup(TestGroupId("a"))));
Lily Chenecebf932018-11-02 17:15:433483 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393484 static_cast<int>(
3485 pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a"))));
Raul Tambre8335a6d2019-02-21 16:57:433486 EXPECT_EQ(kDefaultMaxSockets - 1,
Matt Menkec6b3edf72019-03-19 17:00:393487 static_cast<int>(
3488 pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a"))));
[email protected]51fdc7c2012-04-10 19:19:483489 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033490
Matt Menkec6b3edf72019-03-19 17:00:393491 ASSERT_FALSE(pool_->HasGroup(TestGroupId("b")));
[email protected]2c2bef152010-10-13 00:55:033492
Matt Menkec6b3edf72019-03-19 17:00:393493 pool_->RequestSockets(TestGroupId("b"), &params_, kDefaultMaxSockets,
3494 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033495
Matt Menkec6b3edf72019-03-19 17:00:393496 ASSERT_TRUE(pool_->HasGroup(TestGroupId("b")));
3497 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("b")));
[email protected]51fdc7c2012-04-10 19:19:483498 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033499}
3500
3501TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3502 CreatePool(4, 4);
3503 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3504
3505 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523506 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203507 EXPECT_EQ(
3508 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393509 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203510 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503511 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3512 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013513 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033514 handle1.Reset();
3515
Matt Menkec6b3edf72019-03-19 17:00:393516 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3517 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3518 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3519 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3520 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033521
Matt Menkec6b3edf72019-03-19 17:00:393522 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033523
Matt Menkec6b3edf72019-03-19 17:00:393524 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3525 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3526 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3527 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033528}
3529
3530TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3531 CreatePool(4, 4);
3532 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3533
3534 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523535 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203536 EXPECT_EQ(
3537 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393538 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203539 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503540 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3541 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013542 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033543
Matt Menkec6b3edf72019-03-19 17:00:393544 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3545 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3546 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3547 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3548 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
3549 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033550
Matt Menkec6b3edf72019-03-19 17:00:393551 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033552
Matt Menkec6b3edf72019-03-19 17:00:393553 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3554 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3555 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3556 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
3557 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033558}
3559
3560TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3561 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3562 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3563
Matt Menkec6b3edf72019-03-19 17:00:393564 pool_->RequestSockets(TestGroupId("a"), &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573565 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033566
Matt Menkec6b3edf72019-03-19 17:00:393567 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3568 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3569 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3570 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
Raul Tambre8335a6d2019-02-21 16:57:433571 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393572 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("a"))));
[email protected]2c2bef152010-10-13 00:55:033573
Matt Menkec6b3edf72019-03-19 17:00:393574 pool_->RequestSockets(TestGroupId("b"), &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573575 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033576
Matt Menkec6b3edf72019-03-19 17:00:393577 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("b")));
3578 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("b")));
3579 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("b")));
Raul Tambre8335a6d2019-02-21 16:57:433580 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
Matt Menkec6b3edf72019-03-19 17:00:393581 static_cast<int>(pool_->IdleSocketCountInGroup(TestGroupId("b"))));
[email protected]2c2bef152010-10-13 00:55:033582}
3583
[email protected]3c819f522010-12-02 02:03:123584TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3585 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3586 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3587
Matt Menkec6b3edf72019-03-19 17:00:393588 pool_->RequestSockets(TestGroupId("a"), &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573589 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123590
Matt Menkec6b3edf72019-03-19 17:00:393591 ASSERT_FALSE(pool_->HasGroup(TestGroupId("a")));
[email protected]fd2e53e2011-01-14 20:40:523592
3593 connect_job_factory_->set_job_type(
3594 TestConnectJob::kMockAdditionalErrorStateJob);
Matt Menkec6b3edf72019-03-19 17:00:393595 pool_->RequestSockets(TestGroupId("a"), &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573596 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523597
Matt Menkec6b3edf72019-03-19 17:00:393598 ASSERT_FALSE(pool_->HasGroup(TestGroupId("a")));
[email protected]3c819f522010-12-02 02:03:123599}
3600
[email protected]8159a1c2012-06-07 00:00:103601TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033602 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433603 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033604
Matt Menkec6b3edf72019-03-19 17:00:393605 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033606
Matt Menkec6b3edf72019-03-19 17:00:393607 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3608 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3609 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3610 EXPECT_EQ(2u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3611 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
3612 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033613
Matt Menkec6b3edf72019-03-19 17:00:393614 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
3615 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3616 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3617 EXPECT_EQ(2u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3618 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
3619 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033620
3621 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523622 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203623 EXPECT_EQ(
3624 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393625 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203626 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503627 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3628 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433629
3630 client_socket_factory_.SignalJob(0);
3631 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3632
Matt Menkec6b3edf72019-03-19 17:00:393633 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3634 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3635 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3636 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
3637 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033638
3639 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523640 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433641 EXPECT_EQ(
3642 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393643 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:433644 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503645 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3646 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433647 client_socket_factory_.SignalJob(0);
3648 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033649
Matt Menkec6b3edf72019-03-19 17:00:393650 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3651 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3652 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3653 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
3654 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]8159a1c2012-06-07 00:00:103655
[email protected]2c2bef152010-10-13 00:55:033656 handle1.Reset();
3657 handle2.Reset();
3658
Matt Menkec6b3edf72019-03-19 17:00:393659 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3660 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3661 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3662 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
3663 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033664
Matt Menkec6b3edf72019-03-19 17:00:393665 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
3666 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3667 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3668 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3669 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
3670 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033671}
3672
3673TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3674 CreatePool(4, 4);
3675 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3676
Matt Menkec6b3edf72019-03-19 17:00:393677 pool_->RequestSockets(TestGroupId("a"), &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033678
Matt Menkec6b3edf72019-03-19 17:00:393679 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3680 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3681 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3682 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3683 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033684
Matt Menkec6b3edf72019-03-19 17:00:393685 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
3686 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3687 EXPECT_EQ(2u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3688 EXPECT_EQ(2u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3689 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033690
Matt Menkec6b3edf72019-03-19 17:00:393691 pool_->RequestSockets(TestGroupId("a"), &params_, 3, NetLogWithSource());
3692 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3693 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3694 EXPECT_EQ(3u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3695 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033696
Matt Menkec6b3edf72019-03-19 17:00:393697 pool_->RequestSockets(TestGroupId("a"), &params_, 1, NetLogWithSource());
3698 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3699 EXPECT_EQ(3u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3700 EXPECT_EQ(3u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3701 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033702}
3703
3704TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3705 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433706 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033707
Matt Menkec6b3edf72019-03-19 17:00:393708 pool_->RequestSockets(TestGroupId("a"), &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033709
Matt Menkec6b3edf72019-03-19 17:00:393710 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3711 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3712 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3713 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3714 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033715
3716 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523717 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203718 EXPECT_EQ(
3719 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393720 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203721 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503722 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3723 pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033724
Matt Menkec6b3edf72019-03-19 17:00:393725 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3726 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3727 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3728 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033729
Lily Chenecebf932018-11-02 17:15:433730 client_socket_factory_.SignalJobs();
3731 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3732
Matt Menkec6b3edf72019-03-19 17:00:393733 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3734 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3735 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3736 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
3737 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033738
[email protected]0dc88b32014-03-26 20:12:283739 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483740 // starts, it has a connect start time.
3741 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033742 handle1.Reset();
3743
Matt Menkec6b3edf72019-03-19 17:00:393744 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]2c2bef152010-10-13 00:55:033745}
3746
[email protected]034df0f32013-01-07 23:17:483747// Checks that fully connected preconnect jobs have no connect times, and are
3748// marked as reused.
3749TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3750 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3751 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Matt Menkec6b3edf72019-03-19 17:00:393752 pool_->RequestSockets(TestGroupId("a"), &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483753
Matt Menkec6b3edf72019-03-19 17:00:393754 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3755 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3756 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3757 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3758 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483759
3760 ClientSocketHandle handle;
3761 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:393762 EXPECT_EQ(OK, handle.Init(
3763 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3764 ClientSocketPool::RespectLimits::ENABLED,
3765 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3766 pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483767
3768 // Make sure the idle socket was used.
Matt Menkec6b3edf72019-03-19 17:00:393769 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]034df0f32013-01-07 23:17:483770
3771 TestLoadTimingInfoConnectedReused(handle);
3772 handle.Reset();
3773 TestLoadTimingInfoNotConnected(handle);
3774}
3775
[email protected]dcbe168a2010-12-02 03:14:463776// http://crbug.com/64940 regression test.
3777TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3778 const int kMaxTotalSockets = 3;
3779 const int kMaxSocketsPerGroup = 2;
3780 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433781 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:463782
3783 // Note that group name ordering matters here. "a" comes before "b", so
3784 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3785
3786 // Set up one idle socket in "a".
3787 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523788 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203789 EXPECT_EQ(
3790 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393791 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203792 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503793 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3794 pool_.get(), NetLogWithSource()));
Matt Menkec6b3edf72019-03-19 17:00:393795 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3796 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3797 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3798 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3799 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:463800
Lily Chenecebf932018-11-02 17:15:433801 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013802 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:393803 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3804 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3805 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3806 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:433807
[email protected]dcbe168a2010-12-02 03:14:463808 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:393809 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]dcbe168a2010-12-02 03:14:463810
3811 // Set up two active sockets in "b".
3812 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523813 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203814 EXPECT_EQ(
3815 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393816 handle1.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203817 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503818 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3819 pool_.get(), NetLogWithSource()));
tfarina428341112016-09-22 13:38:203820 EXPECT_EQ(
3821 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393822 handle2.Init(TestGroupId("b"), params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203823 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503824 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
3825 pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463826
Matt Menkec6b3edf72019-03-19 17:00:393827 ASSERT_TRUE(pool_->HasGroup(TestGroupId("b")));
3828 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("b")));
3829 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("b")));
3830 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("b")));
3831 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Lily Chenecebf932018-11-02 17:15:433832
3833 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013834 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3835 ASSERT_THAT(callback2.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:393836 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
3837 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("b")));
3838 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("b")));
3839 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463840
3841 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3842 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3843 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3844 // sockets for "a", and "b" should still have 2 active sockets.
3845
Matt Menkec6b3edf72019-03-19 17:00:393846 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
3847 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3848 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3849 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3850 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
3851 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
3852 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("b")));
3853 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("b")));
3854 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("b")));
3855 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
3856 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463857
3858 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3859 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3860 // "a" should result in closing 1 for "b".
3861 handle1.Reset();
3862 handle2.Reset();
Matt Menkec6b3edf72019-03-19 17:00:393863 EXPECT_EQ(2u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
3864 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463865
Matt Menkec6b3edf72019-03-19 17:00:393866 pool_->RequestSockets(TestGroupId("a"), &params_, 2, NetLogWithSource());
3867 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3868 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3869 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3870 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
3871 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
3872 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("b")));
3873 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("b")));
3874 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("b")));
3875 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
3876 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("b")));
[email protected]dcbe168a2010-12-02 03:14:463877}
3878
[email protected]b7b8be42011-07-12 12:46:413879TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073880 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3881 pool_->EnableConnectBackupJobs();
3882
3883 // Make the ConnectJob hang until it times out, shorten the timeout.
3884 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3885 connect_job_factory_->set_timeout_duration(
3886 base::TimeDelta::FromMilliseconds(500));
Matt Menkec6b3edf72019-03-19 17:00:393887 pool_->RequestSockets(TestGroupId("a"), &params_, 1, NetLogWithSource());
3888 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3889 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3890 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3891 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:073892
[email protected]b7b8be42011-07-12 12:46:413893 // Verify the backup timer doesn't create a backup job, by making
3894 // the backup job a pending job instead of a waiting job, so it
3895 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073896 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453897 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443898 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343899 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283900 base::RunLoop().Run();
Matt Menkec6b3edf72019-03-19 17:00:393901 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:073902}
3903
[email protected]b7b8be42011-07-12 12:46:413904TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073905 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3906 pool_->EnableConnectBackupJobs();
3907
3908 // Make the ConnectJob hang forever.
3909 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Matt Menkec6b3edf72019-03-19 17:00:393910 pool_->RequestSockets(TestGroupId("a"), &params_, 1, NetLogWithSource());
3911 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3912 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3913 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3914 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
fdoray5eeb7642016-06-22 16:11:283915 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073916
3917 // Make the backup job be a pending job, so it completes normally.
3918 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3919 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523920 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:503921 EXPECT_EQ(
3922 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393923 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:503924 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
3925 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
3926 NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413927 // Timer has started, but the backup connect job shouldn't be created yet.
Matt Menkec6b3edf72019-03-19 17:00:393928 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3929 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3930 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3931 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
3932 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
robpercival214763f2016-07-01 23:27:013933 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073934
3935 // The hung connect job should still be there, but everything else should be
3936 // complete.
Matt Menkec6b3edf72019-03-19 17:00:393937 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3938 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3939 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3940 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
3941 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
[email protected]a9fc8fc2011-05-10 02:41:073942}
3943
[email protected]0dc88b32014-03-26 20:12:283944// Tests that a preconnect that starts out with unread data can still be used.
3945// http://crbug.com/334467
3946TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3947 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3948 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3949
Matt Menkec6b3edf72019-03-19 17:00:393950 pool_->RequestSockets(TestGroupId("a"), &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283951
Matt Menkec6b3edf72019-03-19 17:00:393952 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3953 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3954 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3955 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3956 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:283957
3958 // Fail future jobs to be sure that handle receives the preconnected socket
3959 // rather than closing it and making a new one.
3960 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3961 ClientSocketHandle handle;
3962 TestCompletionCallback callback;
Matt Menkec6b3edf72019-03-19 17:00:393963 EXPECT_EQ(OK, handle.Init(
3964 TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
3965 ClientSocketPool::RespectLimits::ENABLED,
3966 callback.callback(), ClientSocketPool::ProxyAuthCallback(),
3967 pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283968
Matt Menkec6b3edf72019-03-19 17:00:393969 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
3970 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
3971 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
3972 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
3973 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
3974 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:283975
3976 // Drain the pending read.
Raul Tambre94493c652019-03-11 17:18:353977 EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:283978
3979 TestLoadTimingInfoConnectedReused(handle);
3980 handle.Reset();
3981
3982 // The socket should be usable now that it's idle again.
Matt Menkec6b3edf72019-03-19 17:00:393983 EXPECT_EQ(1u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
[email protected]0dc88b32014-03-26 20:12:283984}
3985
Lily Chenecebf932018-11-02 17:15:433986TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
3987 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3988 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3989
3990 ClientSocketHandle handle1;
3991 TestCompletionCallback callback1;
3992 EXPECT_EQ(
3993 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:393994 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:433995 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:503996 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
3997 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433998
Matt Menkec6b3edf72019-03-19 17:00:393999 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4000 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4001 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4002 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434003
Matt Menkec6b3edf72019-03-19 17:00:394004 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4005 &handle1));
Lily Chenecebf932018-11-02 17:15:434006}
4007
4008TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
4009 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4010 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4011
4012 ClientSocketHandle handle1;
4013 TestCompletionCallback callback1;
4014 EXPECT_EQ(
4015 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394016 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434017 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504018 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4019 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434020
Matt Menkec6b3edf72019-03-19 17:00:394021 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4022 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4023 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4024 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434025
4026 ClientSocketHandle handle2;
4027 TestCompletionCallback callback2;
4028 EXPECT_EQ(
4029 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394030 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434031 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504032 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4033 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434034
Matt Menkec6b3edf72019-03-19 17:00:394035 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4036 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4037 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4038 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434039
Matt Menkec6b3edf72019-03-19 17:00:394040 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4041 &handle1));
4042 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4043 &handle2));
Lily Chenecebf932018-11-02 17:15:434044
4045 // One job completes. The other request should still have its job.
4046 client_socket_factory_.SignalJob(0);
4047 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4048
Matt Menkec6b3edf72019-03-19 17:00:394049 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4050 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4051 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4052 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
4053 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434054
Matt Menkec6b3edf72019-03-19 17:00:394055 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4056 &handle2));
Lily Chenecebf932018-11-02 17:15:434057}
4058
4059TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
4060 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4061 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4062
Matt Menkec6b3edf72019-03-19 17:00:394063 pool_->RequestSockets(TestGroupId("a"), &params_, 1, NetLogWithSource());
Lily Chenecebf932018-11-02 17:15:434064
Matt Menkec6b3edf72019-03-19 17:00:394065 ASSERT_TRUE(pool_->HasGroup(TestGroupId("a")));
4066 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4067 EXPECT_EQ(1u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4068 EXPECT_EQ(1u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4069 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434070
4071 ClientSocketHandle handle1;
4072 TestCompletionCallback callback1;
4073 EXPECT_EQ(
4074 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394075 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434076 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504077 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4078 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434079
Matt Menkec6b3edf72019-03-19 17:00:394080 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4081 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4082 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4083 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434084
Matt Menkec6b3edf72019-03-19 17:00:394085 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4086 &handle1));
Lily Chenecebf932018-11-02 17:15:434087}
4088
4089TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
4090 CreatePool(kDefaultMaxSockets, 1);
4091 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4092
4093 ClientSocketHandle handle1;
4094 TestCompletionCallback callback1;
4095 EXPECT_EQ(
4096 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394097 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434098 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504099 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4100 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434101
Matt Menkec6b3edf72019-03-19 17:00:394102 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4103 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4104 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4105 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434106
Matt Menkec6b3edf72019-03-19 17:00:394107 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4108 &handle1));
Lily Chenecebf932018-11-02 17:15:434109
4110 // Insert a higher priority request
4111 ClientSocketHandle handle2;
4112 TestCompletionCallback callback2;
4113 EXPECT_EQ(
4114 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394115 handle2.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434116 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504117 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4118 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434119
Matt Menkec6b3edf72019-03-19 17:00:394120 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4121 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4122 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4123 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434124
4125 // The highest priority request should steal the job from the default priority
4126 // request.
Matt Menkec6b3edf72019-03-19 17:00:394127 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4128 &handle2));
4129 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4130 &handle1));
Lily Chenecebf932018-11-02 17:15:434131}
4132
4133TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
4134 CreatePool(3, 3);
4135 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4136
4137 ClientSocketHandle handle_lowest;
4138 TestCompletionCallback callback_lowest;
4139 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394140 handle_lowest.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434141 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504142 callback_lowest.callback(),
4143 ClientSocketPool::ProxyAuthCallback(),
4144 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434145
Matt Menkec6b3edf72019-03-19 17:00:394146 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4147 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4148 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4149 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434150
4151 ClientSocketHandle handle_highest;
4152 TestCompletionCallback callback_highest;
4153 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394154 handle_highest.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434155 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504156 callback_highest.callback(),
4157 ClientSocketPool::ProxyAuthCallback(),
4158 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434159
Matt Menkec6b3edf72019-03-19 17:00:394160 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4161 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4162 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4163 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434164
4165 ClientSocketHandle handle_low;
4166 TestCompletionCallback callback_low;
4167 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394168 handle_low.Init(TestGroupId("a"), params_, LOW, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434169 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504170 callback_low.callback(),
4171 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
Lily Chenecebf932018-11-02 17:15:434172 NetLogWithSource()));
4173
Matt Menkec6b3edf72019-03-19 17:00:394174 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4175 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4176 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4177 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434178
4179 ClientSocketHandle handle_lowest2;
4180 TestCompletionCallback callback_lowest2;
4181 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394182 handle_lowest2.Init(TestGroupId("a"), params_, LOWEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434183 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504184 callback_lowest2.callback(),
4185 ClientSocketPool::ProxyAuthCallback(),
4186 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434187
Matt Menkec6b3edf72019-03-19 17:00:394188 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4189 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4190 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4191 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434192
4193 // The top three requests in the queue should have jobs.
Matt Menkec6b3edf72019-03-19 17:00:394194 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4195 &handle_highest));
4196 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4197 &handle_low));
4198 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4199 &handle_lowest));
4200 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4201 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434202
4203 // Add another request with medium priority. It should steal the job from the
4204 // lowest priority request with a job.
4205 ClientSocketHandle handle_medium;
4206 TestCompletionCallback callback_medium;
4207 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394208 handle_medium.Init(TestGroupId("a"), params_, MEDIUM, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434209 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504210 callback_medium.callback(),
4211 ClientSocketPool::ProxyAuthCallback(),
4212 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434213
Matt Menkec6b3edf72019-03-19 17:00:394214 EXPECT_EQ(3u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4215 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4216 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4217 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
4218 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4219 &handle_highest));
4220 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4221 &handle_medium));
4222 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4223 &handle_low));
4224 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4225 &handle_lowest));
4226 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(
4227 TestGroupId("a"), &handle_lowest2));
Lily Chenecebf932018-11-02 17:15:434228}
4229
4230TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4231 CreatePool(kDefaultMaxSockets, 1);
4232 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4233
4234 ClientSocketHandle handle1;
4235 TestCompletionCallback callback1;
4236 EXPECT_EQ(
4237 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394238 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434239 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504240 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4241 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434242
Matt Menkec6b3edf72019-03-19 17:00:394243 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4244 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4245 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4246 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434247
4248 ClientSocketHandle handle2;
4249 TestCompletionCallback callback2;
4250 EXPECT_EQ(
4251 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394252 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434253 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504254 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4255 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434256
Matt Menkec6b3edf72019-03-19 17:00:394257 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4258 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4259 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4260 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434261
4262 // The second request doesn't get a job because we are at the limit.
Matt Menkec6b3edf72019-03-19 17:00:394263 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4264 &handle1));
4265 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4266 &handle2));
Lily Chenecebf932018-11-02 17:15:434267
4268 // Reprioritizing the second request places it above the first, and it steals
4269 // the job from the first request.
Matt Menkec6b3edf72019-03-19 17:00:394270 pool_->SetPriority(TestGroupId("a"), &handle2, HIGHEST);
4271 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4272 &handle2));
4273 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4274 &handle1));
Lily Chenecebf932018-11-02 17:15:434275}
4276
4277TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4278 CreatePool(kDefaultMaxSockets, 1);
4279 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4280
4281 ClientSocketHandle handle1;
4282 TestCompletionCallback callback1;
4283 EXPECT_EQ(
4284 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394285 handle1.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434286 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504287 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4288 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434289
Matt Menkec6b3edf72019-03-19 17:00:394290 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4291 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4292 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4293 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434294
Matt Menkec6b3edf72019-03-19 17:00:394295 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4296 &handle1));
Lily Chenecebf932018-11-02 17:15:434297
4298 ClientSocketHandle handle2;
4299 TestCompletionCallback callback2;
4300 EXPECT_EQ(
4301 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394302 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434303 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504304 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4305 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434306
Matt Menkec6b3edf72019-03-19 17:00:394307 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4308 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4309 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4310 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434311
4312 // The second request doesn't get a job because we are the limit.
Matt Menkec6b3edf72019-03-19 17:00:394313 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4314 &handle1));
4315 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4316 &handle2));
Lily Chenecebf932018-11-02 17:15:434317
4318 // The second request should get a job upon cancelling the first request.
4319 handle1.Reset();
Matt Menkec6b3edf72019-03-19 17:00:394320 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4321 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4322 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4323 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434324
Matt Menkec6b3edf72019-03-19 17:00:394325 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4326 &handle2));
Lily Chenecebf932018-11-02 17:15:434327}
4328
4329TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4330 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4331 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4332
4333 ClientSocketHandle handle1;
4334 TestCompletionCallback callback1;
4335 EXPECT_EQ(
4336 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394337 handle1.Init(TestGroupId("a"), params_, HIGHEST, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434338 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504339 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4340 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434341
Matt Menkec6b3edf72019-03-19 17:00:394342 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4343 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4344 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4345 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434346
4347 ClientSocketHandle handle2;
4348 TestCompletionCallback callback2;
4349 EXPECT_EQ(
4350 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394351 handle2.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Lily Chenecebf932018-11-02 17:15:434352 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504353 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4354 pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:434355
Matt Menkec6b3edf72019-03-19 17:00:394356 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4357 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4358 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4359 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434360
Matt Menkec6b3edf72019-03-19 17:00:394361 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4362 &handle1));
4363 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4364 &handle2));
Lily Chenecebf932018-11-02 17:15:434365
4366 // The lower-priority job completes first. The higher-priority request should
4367 // get the socket, and the lower-priority request should get the remaining
4368 // job.
4369 client_socket_factory_.SignalJob(1);
4370 EXPECT_THAT(callback1.WaitForResult(), IsOk());
Matt Menkec6b3edf72019-03-19 17:00:394371 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4372 EXPECT_EQ(0u, pool_->NumNeverAssignedConnectJobsInGroup(TestGroupId("a")));
4373 EXPECT_EQ(0u, pool_->NumUnassignedConnectJobsInGroup(TestGroupId("a")));
4374 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
4375 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Lily Chenecebf932018-11-02 17:15:434376 EXPECT_TRUE(handle1.socket());
Matt Menkec6b3edf72019-03-19 17:00:394377 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting(TestGroupId("a"),
4378 &handle2));
Lily Chenecebf932018-11-02 17:15:434379}
4380
[email protected]043b68c82013-08-22 23:41:524381class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204382 public:
4383 MockLayeredPool(TestClientSocketPool* pool,
Matt Menkec6b3edf72019-03-19 17:00:394384 const ClientSocketPool::GroupId& group_id)
4385 : pool_(pool), group_id_(group_id), can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524386 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204387 }
4388
Daniel Cheng4496d0822018-04-26 21:52:154389 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204390
4391 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:154392 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Matt Menke28ac03e2019-02-25 22:25:504393 return handle_.Init(
Matt Menkec6b3edf72019-03-19 17:00:394394 group_id_, params, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504395 ClientSocketPool::RespectLimits::ENABLED, callback_.callback(),
4396 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204397 }
4398
4399 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:154400 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Matt Menke28ac03e2019-02-25 22:25:504401 return handle_.Init(
Matt Menkec6b3edf72019-03-19 17:00:394402 group_id_, params, MAXIMUM_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504403 ClientSocketPool::RespectLimits::DISABLED, callback_.callback(),
4404 ClientSocketPool::ProxyAuthCallback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204405 }
4406
4407 bool ReleaseOneConnection() {
4408 if (!handle_.is_initialized() || !can_release_connection_) {
4409 return false;
4410 }
4411 handle_.socket()->Disconnect();
4412 handle_.Reset();
4413 return true;
4414 }
4415
4416 void set_can_release_connection(bool can_release_connection) {
4417 can_release_connection_ = can_release_connection;
4418 }
4419
4420 MOCK_METHOD0(CloseOneIdleConnection, bool());
4421
4422 private:
4423 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204424 ClientSocketHandle handle_;
4425 TestCompletionCallback callback_;
Matt Menkec6b3edf72019-03-19 17:00:394426 const ClientSocketPool::GroupId group_id_;
[email protected]58e562f2013-04-22 17:32:204427 bool can_release_connection_;
4428};
4429
[email protected]58e562f2013-04-22 17:32:204430// Tests the basic case of closing an idle socket in a higher layered pool when
4431// a new request is issued and the lower layer pool is stalled.
4432TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4433 CreatePool(1, 1);
4434 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4435
Matt Menkec6b3edf72019-03-19 17:00:394436 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014437 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204438 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4439 .WillOnce(Invoke(&mock_layered_pool,
4440 &MockLayeredPool::ReleaseOneConnection));
4441 ClientSocketHandle handle;
4442 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504443 EXPECT_EQ(
4444 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394445 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504446 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4447 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4448 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014449 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204450}
4451
Matt Menke833678642019-03-05 22:05:514452// Tests the case that trying to close an idle socket in a higher layered pool
4453// fails.
4454TEST_F(ClientSocketPoolBaseTest,
4455 CloseIdleSocketsHeldByLayeredPoolWhenNeededFails) {
4456 CreatePool(1, 1);
4457 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4458
Matt Menkec6b3edf72019-03-19 17:00:394459 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("foo"));
Matt Menke833678642019-03-05 22:05:514460 mock_layered_pool.set_can_release_connection(false);
4461 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
4462 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4463 .WillOnce(Invoke(&mock_layered_pool,
4464 &MockLayeredPool::ReleaseOneConnection));
4465 ClientSocketHandle handle;
4466 TestCompletionCallback callback;
4467 EXPECT_EQ(
4468 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394469 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke833678642019-03-05 22:05:514470 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4471 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4472 NetLogWithSource()));
4473 base::RunLoop().RunUntilIdle();
4474 EXPECT_FALSE(callback.have_result());
4475}
4476
[email protected]58e562f2013-04-22 17:32:204477// Same as above, but the idle socket is in the same group as the stalled
4478// socket, and closes the only other request in its group when closing requests
4479// in higher layered pools. This generally shouldn't happen, but it may be
4480// possible if a higher level pool issues a request and the request is
4481// subsequently cancelled. Even if it's not possible, best not to crash.
4482TEST_F(ClientSocketPoolBaseTest,
4483 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4484 CreatePool(2, 2);
4485 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4486
4487 // Need a socket in another group for the pool to be stalled (If a group
4488 // has the maximum number of connections already, it's not stalled).
4489 ClientSocketHandle handle1;
4490 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394491 EXPECT_EQ(OK, handle1.Init(
4492 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4493 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4494 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4495 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204496
Matt Menkec6b3edf72019-03-19 17:00:394497 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014498 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204499 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4500 .WillOnce(Invoke(&mock_layered_pool,
4501 &MockLayeredPool::ReleaseOneConnection));
4502 ClientSocketHandle handle;
4503 TestCompletionCallback callback2;
Matt Menke28ac03e2019-02-25 22:25:504504 EXPECT_EQ(
4505 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394506 handle.Init(TestGroupId("group2"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504507 ClientSocketPool::RespectLimits::ENABLED,
4508 callback2.callback(), ClientSocketPool::ProxyAuthCallback(),
4509 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014510 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204511}
4512
4513// Tests the case when an idle socket can be closed when a new request is
4514// issued, and the new request belongs to a group that was previously stalled.
4515TEST_F(ClientSocketPoolBaseTest,
4516 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4517 CreatePool(2, 2);
4518 std::list<TestConnectJob::JobType> job_types;
4519 job_types.push_back(TestConnectJob::kMockJob);
4520 job_types.push_back(TestConnectJob::kMockJob);
4521 job_types.push_back(TestConnectJob::kMockJob);
4522 job_types.push_back(TestConnectJob::kMockJob);
4523 connect_job_factory_->set_job_types(&job_types);
4524
4525 ClientSocketHandle handle1;
4526 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394527 EXPECT_EQ(OK, handle1.Init(
4528 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4529 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4530 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4531 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204532
Matt Menkec6b3edf72019-03-19 17:00:394533 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014534 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204535 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4536 .WillRepeatedly(Invoke(&mock_layered_pool,
4537 &MockLayeredPool::ReleaseOneConnection));
4538 mock_layered_pool.set_can_release_connection(false);
4539
4540 // The third request is made when the socket pool is in a stalled state.
4541 ClientSocketHandle handle3;
4542 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204543 EXPECT_EQ(
4544 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394545 handle3.Init(TestGroupId("group3"), params_, DEFAULT_PRIORITY,
4546 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504547 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4548 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204549
4550 base::RunLoop().RunUntilIdle();
4551 EXPECT_FALSE(callback3.have_result());
4552
4553 // The fourth request is made when the pool is no longer stalled. The third
4554 // request should be serviced first, since it was issued first and has the
4555 // same priority.
4556 mock_layered_pool.set_can_release_connection(true);
4557 ClientSocketHandle handle4;
4558 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204559 EXPECT_EQ(
4560 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394561 handle4.Init(TestGroupId("group3"), params_, DEFAULT_PRIORITY,
4562 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504563 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4564 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014565 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204566 EXPECT_FALSE(callback4.have_result());
4567
4568 // Closing a handle should free up another socket slot.
4569 handle1.Reset();
robpercival214763f2016-07-01 23:27:014570 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204571}
4572
4573// Tests the case when an idle socket can be closed when a new request is
4574// issued, and the new request belongs to a group that was previously stalled.
4575//
4576// The two differences from the above test are that the stalled requests are not
4577// in the same group as the layered pool's request, and the the fourth request
4578// has a higher priority than the third one, so gets a socket first.
4579TEST_F(ClientSocketPoolBaseTest,
4580 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4581 CreatePool(2, 2);
4582 std::list<TestConnectJob::JobType> job_types;
4583 job_types.push_back(TestConnectJob::kMockJob);
4584 job_types.push_back(TestConnectJob::kMockJob);
4585 job_types.push_back(TestConnectJob::kMockJob);
4586 job_types.push_back(TestConnectJob::kMockJob);
4587 connect_job_factory_->set_job_types(&job_types);
4588
4589 ClientSocketHandle handle1;
4590 TestCompletionCallback callback1;
Matt Menkec6b3edf72019-03-19 17:00:394591 EXPECT_EQ(OK, handle1.Init(
4592 TestGroupId("group1"), params_, DEFAULT_PRIORITY,
4593 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
4594 callback1.callback(), ClientSocketPool::ProxyAuthCallback(),
4595 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204596
Matt Menkec6b3edf72019-03-19 17:00:394597 MockLayeredPool mock_layered_pool(pool_.get(), TestGroupId("group2"));
robpercival214763f2016-07-01 23:27:014598 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204599 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4600 .WillRepeatedly(Invoke(&mock_layered_pool,
4601 &MockLayeredPool::ReleaseOneConnection));
4602 mock_layered_pool.set_can_release_connection(false);
4603
4604 // The third request is made when the socket pool is in a stalled state.
4605 ClientSocketHandle handle3;
4606 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204607 EXPECT_EQ(
4608 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394609 handle3.Init(TestGroupId("group3"), params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:204610 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504611 callback3.callback(), ClientSocketPool::ProxyAuthCallback(),
4612 pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204613
4614 base::RunLoop().RunUntilIdle();
4615 EXPECT_FALSE(callback3.have_result());
4616
4617 // The fourth request is made when the pool is no longer stalled. This
4618 // request has a higher priority than the third request, so is serviced first.
4619 mock_layered_pool.set_can_release_connection(true);
4620 ClientSocketHandle handle4;
4621 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204622 EXPECT_EQ(
4623 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394624 handle4.Init(TestGroupId("group3"), params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:204625 ClientSocketPool::RespectLimits::ENABLED,
Matt Menke28ac03e2019-02-25 22:25:504626 callback4.callback(), ClientSocketPool::ProxyAuthCallback(),
4627 pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014628 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204629 EXPECT_FALSE(callback3.have_result());
4630
4631 // Closing a handle should free up another socket slot.
4632 handle1.Reset();
robpercival214763f2016-07-01 23:27:014633 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204634}
4635
4636TEST_F(ClientSocketPoolBaseTest,
4637 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4638 CreatePool(1, 1);
4639 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4640
Matt Menkec6b3edf72019-03-19 17:00:394641 MockLayeredPool mock_layered_pool1(pool_.get(), TestGroupId("foo"));
robpercival214763f2016-07-01 23:27:014642 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204643 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4644 .WillRepeatedly(Invoke(&mock_layered_pool1,
4645 &MockLayeredPool::ReleaseOneConnection));
Matt Menkec6b3edf72019-03-19 17:00:394646 MockLayeredPool mock_layered_pool2(pool_.get(), TestGroupId("bar"));
robpercival214763f2016-07-01 23:27:014647 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4648 IsOk());
[email protected]58e562f2013-04-22 17:32:204649 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4650 .WillRepeatedly(Invoke(&mock_layered_pool2,
4651 &MockLayeredPool::ReleaseOneConnection));
4652 ClientSocketHandle handle;
4653 TestCompletionCallback callback;
Matt Menke28ac03e2019-02-25 22:25:504654 EXPECT_EQ(
4655 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394656 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menke28ac03e2019-02-25 22:25:504657 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4658 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4659 NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014660 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204661}
4662
[email protected]b021ece62013-06-11 11:06:334663// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154664// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4665// socket instead of a request with the same priority that was issued earlier,
4666// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334667TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334668 CreatePool(1, 1);
4669
4670 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:394671 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
4672 TestGroupId("a"), MAXIMUM_PRIORITY,
4673 ClientSocketPool::RespectLimits::ENABLED));
4674 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334675
4676 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4677
mmenked3641e12016-01-28 16:06:154678 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394679 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154680 ClientSocketPool::RespectLimits::ENABLED));
Matt Menkec6b3edf72019-03-19 17:00:394681 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334682
mmenked3641e12016-01-28 16:06:154683 // Issue a request that ignores the limits, so a new ConnectJob is
4684 // created.
4685 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394686 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154687 ClientSocketPool::RespectLimits::DISABLED));
Matt Menkec6b3edf72019-03-19 17:00:394688 ASSERT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334689
robpercival214763f2016-07-01 23:27:014690 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334691 EXPECT_FALSE(request(1)->have_result());
4692}
4693
[email protected]c55fabd2013-11-04 23:26:564694// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154695// issued for a request with RespectLimits::DISABLED is not cancelled when a
4696// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564697TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564698 CreatePool(1, 1);
4699
4700 // Issue a request to reach the socket pool limit.
Matt Menkec6b3edf72019-03-19 17:00:394701 EXPECT_EQ(OK, StartRequestWithIgnoreLimits(
4702 TestGroupId("a"), MAXIMUM_PRIORITY,
4703 ClientSocketPool::RespectLimits::ENABLED));
4704 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:564705
4706 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4707
mmenked3641e12016-01-28 16:06:154708 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394709 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154710 ClientSocketPool::RespectLimits::ENABLED));
Matt Menkec6b3edf72019-03-19 17:00:394711 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]c55fabd2013-11-04 23:26:564712
mmenked3641e12016-01-28 16:06:154713 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4714 // created.
4715 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
Matt Menkec6b3edf72019-03-19 17:00:394716 TestGroupId("a"), MAXIMUM_PRIORITY,
mmenked3641e12016-01-28 16:06:154717 ClientSocketPool::RespectLimits::DISABLED));
Matt Menkec6b3edf72019-03-19 17:00:394718 ASSERT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334719
mmenked3641e12016-01-28 16:06:154720 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334721 // should not be cancelled.
4722 request(1)->handle()->Reset();
Matt Menkec6b3edf72019-03-19 17:00:394723 ASSERT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
[email protected]b021ece62013-06-11 11:06:334724
robpercival214763f2016-07-01 23:27:014725 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334726 EXPECT_FALSE(request(1)->have_result());
4727}
4728
Matt Menkeb57663b32019-03-01 17:17:104729TEST_F(ClientSocketPoolBaseTest, ProxyAuthNoAuthCallback) {
4730 CreatePool(1, 1);
4731
4732 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4733
4734 ClientSocketHandle handle;
4735 TestCompletionCallback callback;
4736 EXPECT_EQ(
4737 ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394738 handle.Init(TestGroupId("a"), params_, DEFAULT_PRIORITY, SocketTag(),
Matt Menkeb57663b32019-03-01 17:17:104739 ClientSocketPool::RespectLimits::ENABLED, callback.callback(),
4740 ClientSocketPool::ProxyAuthCallback(), pool_.get(),
4741 NetLogWithSource()));
4742
Matt Menkec6b3edf72019-03-19 17:00:394743 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104744
4745 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
4746 EXPECT_FALSE(handle.is_initialized());
4747 EXPECT_FALSE(handle.socket());
4748
4749 // The group should now be empty, and thus be deleted.
Matt Menkec6b3edf72019-03-19 17:00:394750 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104751}
4752
4753class TestAuthHelper {
4754 public:
4755 TestAuthHelper() = default;
4756 ~TestAuthHelper() = default;
4757
Matt Menkec6b3edf72019-03-19 17:00:394758 void InitHandle(
4759 scoped_refptr<TestSocketParams> params,
4760 TestClientSocketPool* pool,
4761 RequestPriority priority = DEFAULT_PRIORITY,
4762 ClientSocketPool::RespectLimits respect_limits =
4763 ClientSocketPool::RespectLimits::ENABLED,
4764 const ClientSocketPool::GroupId& group_id_in = TestGroupId("a")) {
Matt Menkeb57663b32019-03-01 17:17:104765 EXPECT_EQ(ERR_IO_PENDING,
Matt Menkec6b3edf72019-03-19 17:00:394766 handle_.Init(group_id_in, params.get(), priority, SocketTag(),
Matt Menkeb57663b32019-03-01 17:17:104767 respect_limits, callback_.callback(),
4768 base::BindRepeating(&TestAuthHelper::AuthCallback,
4769 base::Unretained(this)),
4770 pool, NetLogWithSource()));
4771 }
4772
4773 void WaitForAuth() {
4774 run_loop_ = std::make_unique<base::RunLoop>();
4775 run_loop_->Run();
4776 run_loop_.reset();
4777 }
4778
4779 void WaitForAuthAndRestartSync() {
4780 restart_sync_ = true;
4781 WaitForAuth();
4782 restart_sync_ = false;
4783 }
4784
4785 void WaitForAuthAndResetHandleSync() {
4786 reset_handle_sync_ = true;
4787 WaitForAuth();
4788 reset_handle_sync_ = false;
4789 }
4790
4791 void RestartWithAuth() {
4792 DCHECK(restart_with_auth_callback_);
4793 std::move(restart_with_auth_callback_).Run();
4794 }
4795
4796 int WaitForResult() {
4797 int result = callback_.WaitForResult();
4798 // There shouldn't be any callback waiting to be invoked once the request is
4799 // complete.
4800 EXPECT_FALSE(restart_with_auth_callback_);
4801 // The socket should only be initialized on success.
4802 EXPECT_EQ(result == OK, handle_.is_initialized());
4803 EXPECT_EQ(result == OK, handle_.socket() != nullptr);
4804 return result;
4805 }
4806
4807 ClientSocketHandle* handle() { return &handle_; }
4808 int auth_count() const { return auth_count_; }
4809 int have_result() const { return callback_.have_result(); }
4810
4811 private:
4812 void AuthCallback(const HttpResponseInfo& response,
4813 HttpAuthController* auth_controller,
4814 base::OnceClosure restart_with_auth_callback) {
4815 EXPECT_FALSE(restart_with_auth_callback_);
4816 EXPECT_TRUE(restart_with_auth_callback);
4817
4818 // Once there's a result, this method shouldn't be invoked again.
4819 EXPECT_FALSE(callback_.have_result());
4820
4821 ++auth_count_;
4822 run_loop_->Quit();
4823 if (restart_sync_) {
4824 std::move(restart_with_auth_callback).Run();
4825 return;
4826 }
4827
4828 restart_with_auth_callback_ = std::move(restart_with_auth_callback);
4829
4830 if (reset_handle_sync_) {
4831 handle_.Reset();
4832 return;
4833 }
4834 }
4835
4836 std::unique_ptr<base::RunLoop> run_loop_;
4837 base::OnceClosure restart_with_auth_callback_;
4838
4839 bool restart_sync_ = false;
4840 bool reset_handle_sync_ = false;
4841
4842 ClientSocketHandle handle_;
4843 int auth_count_ = 0;
4844 TestCompletionCallback callback_;
4845
4846 DISALLOW_COPY_AND_ASSIGN(TestAuthHelper);
4847};
4848
4849TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnce) {
4850 CreatePool(1, 1);
4851 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4852
4853 TestAuthHelper auth_helper;
4854 auth_helper.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:394855 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014856 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:394857 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104858
4859 auth_helper.WaitForAuth();
Matt Menkec6b3edf72019-03-19 17:00:394860 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014861 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:394862 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104863
4864 auth_helper.RestartWithAuth();
Matt Menkec6b3edf72019-03-19 17:00:394865 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014866 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:394867 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104868
4869 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
4870 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:394871 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4872 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
4873 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104874 EXPECT_EQ(0, pool_->IdleSocketCount());
4875}
4876
4877TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSync) {
4878 CreatePool(1, 1);
4879 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4880
4881 TestAuthHelper auth_helper;
4882 auth_helper.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:394883 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014884 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:394885 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104886
4887 auth_helper.WaitForAuthAndRestartSync();
Matt Menkec6b3edf72019-03-19 17:00:394888 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:014889 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:394890 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:104891
4892 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
4893 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:394894 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
4895 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
4896 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104897 EXPECT_EQ(0, pool_->IdleSocketCount());
4898}
4899
4900TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFails) {
4901 CreatePool(1, 1);
4902 connect_job_factory_->set_job_type(
4903 TestConnectJob::kMockAuthChallengeOnceFailingJob);
4904
4905 TestAuthHelper auth_helper;
4906 auth_helper.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:394907 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104908
4909 auth_helper.WaitForAuth();
4910 auth_helper.RestartWithAuth();
4911 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
4912
4913 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:394914 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104915 EXPECT_EQ(0, pool_->IdleSocketCount());
4916}
4917
4918TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceSyncFails) {
4919 CreatePool(1, 1);
4920 connect_job_factory_->set_job_type(
4921 TestConnectJob::kMockAuthChallengeOnceFailingJob);
4922
4923 TestAuthHelper auth_helper;
4924 auth_helper.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:394925 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104926
4927 auth_helper.WaitForAuthAndRestartSync();
4928 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
4929
4930 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:394931 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104932 EXPECT_EQ(0, pool_->IdleSocketCount());
4933}
4934
4935TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandle) {
4936 CreatePool(1, 1);
4937 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4938
4939 TestAuthHelper auth_helper;
4940 auth_helper.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:394941 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104942
4943 auth_helper.WaitForAuth();
Matt Menkec6b3edf72019-03-19 17:00:394944 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104945
4946 auth_helper.handle()->Reset();
4947
4948 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:394949 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104950 EXPECT_EQ(0, pool_->IdleSocketCount());
4951 EXPECT_FALSE(auth_helper.handle()->is_initialized());
4952 EXPECT_FALSE(auth_helper.handle()->socket());
4953}
4954
4955TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceDeleteHandleSync) {
4956 CreatePool(1, 1);
4957 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4958
4959 TestAuthHelper auth_helper;
4960 auth_helper.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:394961 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104962
4963 auth_helper.WaitForAuthAndResetHandleSync();
4964 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:394965 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104966 EXPECT_EQ(0, pool_->IdleSocketCount());
4967 EXPECT_FALSE(auth_helper.handle()->is_initialized());
4968 EXPECT_FALSE(auth_helper.handle()->socket());
4969}
4970
4971TEST_F(ClientSocketPoolBaseTest, ProxyAuthOnceFlushWithError) {
4972 CreatePool(1, 1);
4973 connect_job_factory_->set_job_type(TestConnectJob::kMockAuthChallengeOnceJob);
4974
4975 TestAuthHelper auth_helper;
4976 auth_helper.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:394977 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104978
4979 auth_helper.WaitForAuth();
4980
4981 pool_->FlushWithError(ERR_FAILED);
4982 base::RunLoop().RunUntilIdle();
4983
4984 // When flushing the socket pool, bound sockets should delay returning the
4985 // error until completion.
4986 EXPECT_FALSE(auth_helper.have_result());
Matt Menkec6b3edf72019-03-19 17:00:394987 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104988 EXPECT_EQ(0, pool_->IdleSocketCount());
4989
4990 auth_helper.RestartWithAuth();
4991 // The callback should be called asynchronously.
4992 EXPECT_FALSE(auth_helper.have_result());
4993
4994 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_FAILED));
Matt Menkec6b3edf72019-03-19 17:00:394995 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:104996 EXPECT_EQ(0, pool_->IdleSocketCount());
4997}
4998
4999TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwice) {
5000 CreatePool(1, 1);
5001 connect_job_factory_->set_job_type(
5002 TestConnectJob::kMockAuthChallengeTwiceJob);
5003
5004 TestAuthHelper auth_helper;
5005 auth_helper.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:395006 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015007 EXPECT_EQ(LOAD_STATE_CONNECTING,
Matt Menkec6b3edf72019-03-19 17:00:395008 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105009
5010 auth_helper.WaitForAuth();
5011 auth_helper.RestartWithAuth();
Matt Menkec6b3edf72019-03-19 17:00:395012 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105013 EXPECT_EQ(1, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015014 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395015 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105016
5017 auth_helper.WaitForAuth();
Matt Menkec6b3edf72019-03-19 17:00:395018 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menke4b69f932019-03-04 16:20:015019 EXPECT_EQ(2, auth_helper.auth_count());
5020 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395021 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menke4b69f932019-03-04 16:20:015022
Matt Menkeb57663b32019-03-01 17:17:105023 auth_helper.RestartWithAuth();
Matt Menkec6b3edf72019-03-19 17:00:395024 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105025 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menke4b69f932019-03-04 16:20:015026 EXPECT_EQ(LOAD_STATE_ESTABLISHING_PROXY_TUNNEL,
Matt Menkec6b3edf72019-03-19 17:00:395027 pool_->GetLoadState(TestGroupId("a"), auth_helper.handle()));
Matt Menkeb57663b32019-03-01 17:17:105028
5029 EXPECT_THAT(auth_helper.WaitForResult(), IsOk());
5030 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:395031 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
5032 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
5033 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105034 EXPECT_EQ(0, pool_->IdleSocketCount());
5035}
5036
5037TEST_F(ClientSocketPoolBaseTest, ProxyAuthTwiceFails) {
5038 CreatePool(1, 1);
5039 connect_job_factory_->set_job_type(
5040 TestConnectJob::kMockAuthChallengeTwiceFailingJob);
5041
5042 TestAuthHelper auth_helper;
5043 auth_helper.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:395044 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105045
5046 auth_helper.WaitForAuth();
5047 auth_helper.RestartWithAuth();
Matt Menkec6b3edf72019-03-19 17:00:395048 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105049 EXPECT_EQ(1, auth_helper.auth_count());
5050
5051 auth_helper.WaitForAuth();
5052 auth_helper.RestartWithAuth();
Matt Menkec6b3edf72019-03-19 17:00:395053 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105054 EXPECT_EQ(2, auth_helper.auth_count());
5055
5056 EXPECT_THAT(auth_helper.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
5057 EXPECT_EQ(2, auth_helper.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:395058 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105059 EXPECT_EQ(0, pool_->IdleSocketCount());
5060}
5061
5062// Makes sure that when a bound request is destroyed, a new ConnectJob is
5063// created, if needed.
5064TEST_F(ClientSocketPoolBaseTest,
5065 ProxyAuthCreateNewConnectJobOnDestroyBoundRequest) {
5066 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5067 connect_job_factory_->set_job_type(
5068 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5069
5070 // First request creates a ConnectJob.
5071 TestAuthHelper auth_helper1;
5072 auth_helper1.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:395073 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105074
5075 // A second request come in, but no new ConnectJob is needed, since the limit
5076 // has been reached.
5077 TestAuthHelper auth_helper2;
5078 auth_helper2.InitHandle(params_, pool_.get());
Matt Menkec6b3edf72019-03-19 17:00:395079 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105080
5081 // Run until the auth callback for the first request is invoked.
5082 auth_helper1.WaitForAuth();
5083 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:395084 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
5085 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
5086 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105087
5088 // Make connect jobs succeed, then cancel the first request, which should
5089 // destroy the bound ConnectJob, and cause a new ConnectJob to start.
5090 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5091 auth_helper1.handle()->Reset();
5092 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:395093 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105094
5095 // The second ConnectJob should succeed.
5096 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5097 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:395098 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105099}
5100
5101// Makes sure that when a bound request is destroyed, a new ConnectJob is
5102// created for another group, if needed.
5103TEST_F(ClientSocketPoolBaseTest,
5104 ProxyAuthCreateNewConnectJobOnDestroyBoundRequestDifferentGroups) {
5105 CreatePool(1 /* max_sockets */, 1 /* max_sockets_per_group */);
5106 connect_job_factory_->set_job_type(
5107 TestConnectJob::kMockAuthChallengeOnceFailingJob);
5108
5109 // First request creates a ConnectJob.
5110 TestAuthHelper auth_helper1;
5111 auth_helper1.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY);
Matt Menkec6b3edf72019-03-19 17:00:395112 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105113
5114 // A second request come in, but no new ConnectJob is needed, since the limit
5115 // has been reached.
5116 TestAuthHelper auth_helper2;
5117 auth_helper2.InitHandle(params_, pool_.get(), DEFAULT_PRIORITY,
Matt Menkec6b3edf72019-03-19 17:00:395118 ClientSocketPool::RespectLimits::ENABLED,
5119 TestGroupId("b"));
5120 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
5121 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105122
5123 // Run until the auth callback for the first request is invoked.
5124 auth_helper1.WaitForAuth();
5125 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:395126 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
5127 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
5128 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
5129 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("b")));
5130 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("b")));
5131 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105132
5133 // Make connect jobs succeed, then cancel the first request, which should
5134 // destroy the bound ConnectJob, and cause a new ConnectJob to start for the
5135 // other group.
5136 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
5137 auth_helper1.handle()->Reset();
5138 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:395139 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
5140 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105141
5142 // The second ConnectJob should succeed.
5143 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5144 EXPECT_EQ(0, auth_helper2.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:395145 EXPECT_FALSE(pool_->HasGroup(TestGroupId("a")));
5146 EXPECT_EQ(0u, pool_->NumConnectJobsInGroup(TestGroupId("b")));
Matt Menkeb57663b32019-03-01 17:17:105147}
5148
5149// Test that once an auth challenge is bound, that's the request that gets all
5150// subsequent calls and the socket itself.
5151TEST_F(ClientSocketPoolBaseTest, ProxyAuthStaysBound) {
5152 CreatePool(1, 1);
5153 connect_job_factory_->set_job_type(
5154 TestConnectJob::kMockAuthChallengeTwiceJob);
5155
5156 // First request creates a ConnectJob.
5157 TestAuthHelper auth_helper1;
5158 auth_helper1.InitHandle(params_, pool_.get(), LOWEST);
Matt Menkec6b3edf72019-03-19 17:00:395159 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105160
5161 // A second, higher priority request is made.
5162 TestAuthHelper auth_helper2;
5163 auth_helper2.InitHandle(params_, pool_.get(), LOW);
Matt Menkec6b3edf72019-03-19 17:00:395164 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105165
5166 // Run until the auth callback for the second request is invoked.
5167 auth_helper2.WaitForAuth();
5168 EXPECT_EQ(0, auth_helper1.auth_count());
Matt Menkec6b3edf72019-03-19 17:00:395169 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
5170 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
5171 EXPECT_EQ(0u, pool_->IdleSocketCountInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105172
5173 // Start a higher priority job. It shouldn't be able to steal |auth_helper2|'s
5174 // ConnectJob.
5175 TestAuthHelper auth_helper3;
5176 auth_helper3.InitHandle(params_, pool_.get(), HIGHEST);
Matt Menkec6b3edf72019-03-19 17:00:395177 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105178
5179 // Start a higher job that ignores limits, creating a hanging socket. It
5180 // shouldn't be able to steal |auth_helper2|'s ConnectJob.
5181 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
5182 TestAuthHelper auth_helper4;
5183 auth_helper4.InitHandle(params_, pool_.get(), HIGHEST,
5184 ClientSocketPool::RespectLimits::DISABLED);
Matt Menkec6b3edf72019-03-19 17:00:395185 EXPECT_EQ(2u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105186
5187 // Restart with auth, and |auth_helper2|'s auth method should be invoked
5188 // again.
5189 auth_helper2.RestartWithAuth();
5190 auth_helper2.WaitForAuth();
5191 EXPECT_EQ(0, auth_helper1.auth_count());
5192 EXPECT_FALSE(auth_helper1.have_result());
5193 EXPECT_EQ(2, auth_helper2.auth_count());
5194 EXPECT_FALSE(auth_helper2.have_result());
5195 EXPECT_EQ(0, auth_helper3.auth_count());
5196 EXPECT_FALSE(auth_helper3.have_result());
5197 EXPECT_EQ(0, auth_helper4.auth_count());
5198 EXPECT_FALSE(auth_helper4.have_result());
5199
5200 // Advance auth again, and |auth_helper2| should get the socket.
5201 auth_helper2.RestartWithAuth();
5202 EXPECT_THAT(auth_helper2.WaitForResult(), IsOk());
5203 // The hung ConnectJob for the RespectLimits::DISABLED request is still in the
5204 // socket pool.
Matt Menkec6b3edf72019-03-19 17:00:395205 EXPECT_EQ(1u, pool_->NumConnectJobsInGroup(TestGroupId("a")));
5206 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup(TestGroupId("a")));
Matt Menkeb57663b32019-03-01 17:17:105207 EXPECT_EQ(0, auth_helper1.auth_count());
5208 EXPECT_FALSE(auth_helper1.have_result());
5209 EXPECT_EQ(0, auth_helper3.auth_count());
5210 EXPECT_FALSE(auth_helper3.have_result());
5211 EXPECT_EQ(0, auth_helper4.auth_count());
5212 EXPECT_FALSE(auth_helper4.have_result());
5213
5214 // If the socket is returned to the socket pool, the RespectLimits::DISABLED
5215 // socket request should be able to claim it.
5216 auth_helper2.handle()->Reset();
5217 EXPECT_THAT(auth_helper4.WaitForResult(), IsOk());
5218 EXPECT_EQ(0, auth_helper1.auth_count());
5219 EXPECT_FALSE(auth_helper1.have_result());
5220 EXPECT_EQ(0, auth_helper3.auth_count());
5221 EXPECT_FALSE(auth_helper3.have_result());
5222 EXPECT_EQ(0, auth_helper4.auth_count());
5223}
5224
[email protected]f6d1d6eb2009-06-24 20:16:095225} // namespace
5226
5227} // namespace net