blob: 3a7a3d0c0de25a50171b5cd323c207f8af57d0f0 [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;
[email protected]0b7648c2009-07-06 20:14:0166
[email protected]034df0f32013-01-07 23:17:4867// Make sure |handle| sets load times correctly when it has been assigned a
68// reused socket.
69void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
70 LoadTimingInfo load_timing_info;
71 // Only pass true in as |is_reused|, as in general, HttpStream types should
72 // have stricter concepts of reuse than socket pools.
73 EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
74
75 EXPECT_EQ(true, load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1976 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4877
[email protected]b258e0792013-01-12 07:11:5978 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
79 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4880}
81
82// Make sure |handle| sets load times correctly when it has been assigned a
[email protected]b021ece62013-06-11 11:06:3383// fresh socket. Also runs TestLoadTimingInfoConnectedReused, since the owner
[email protected]034df0f32013-01-07 23:17:4884// of a connection where |is_reused| is false may consider the connection
85// reused.
86void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
87 EXPECT_FALSE(handle.is_reused());
88
89 LoadTimingInfo load_timing_info;
90 EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
91
92 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:1993 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:4894
[email protected]b258e0792013-01-12 07:11:5995 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
96 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
97 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:4898
99 TestLoadTimingInfoConnectedReused(handle);
100}
101
102// Make sure |handle| sets load times correctly, in the case that it does not
103// currently have a socket.
104void TestLoadTimingInfoNotConnected(const ClientSocketHandle& handle) {
105 // Should only be set to true once a socket is assigned, if at all.
106 EXPECT_FALSE(handle.is_reused());
107
108 LoadTimingInfo load_timing_info;
109 EXPECT_FALSE(handle.GetLoadTimingInfo(false, &load_timing_info));
110
111 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19112 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]034df0f32013-01-07 23:17:48113
[email protected]b258e0792013-01-12 07:11:59114 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
115 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
[email protected]034df0f32013-01-07 23:17:48116}
117
[email protected]df4b4ef2010-07-12 18:25:21118class TestSocketParams : public base::RefCounted<TestSocketParams> {
[email protected]5acdce12011-03-30 13:00:20119 public:
Chris Watkins7a41d3552017-12-01 02:13:27120 explicit TestSocketParams() = default;
[email protected]51fdc7c2012-04-10 19:19:48121
[email protected]df4b4ef2010-07-12 18:25:21122 private:
123 friend class base::RefCounted<TestSocketParams>;
Chris Watkins7a41d3552017-12-01 02:13:27124 ~TestSocketParams() = default;
[email protected]df4b4ef2010-07-12 18:25:21125};
[email protected]7fc5b09a2010-02-27 00:07:38126typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
[email protected]d80a4322009-08-14 07:07:49127
[email protected]3268023f2011-05-05 00:08:10128class MockClientSocket : public StreamSocket {
[email protected]f6d1d6eb2009-06-24 20:16:09129 public:
[email protected]034df0f32013-01-07 23:17:48130 explicit MockClientSocket(net::NetLog* net_log)
131 : connected_(false),
[email protected]0dc88b32014-03-26 20:12:28132 has_unread_data_(false),
tfarina428341112016-09-22 13:38:20133 net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::SOCKET)),
Charlie Harrison3e4c0622018-05-13 15:44:30134 was_used_to_convey_data_(false) {}
[email protected]f6d1d6eb2009-06-24 20:16:09135
[email protected]0dc88b32014-03-26 20:12:28136 // Sets whether the socket has unread data. If true, the next call to Read()
137 // will return 1 byte and IsConnectedAndIdle() will return false.
138 void set_has_unread_data(bool has_unread_data) {
139 has_unread_data_ = has_unread_data;
140 }
141
[email protected]3f55aa12011-12-07 02:03:33142 // Socket implementation.
dchengb03027d2014-10-21 12:00:20143 int Read(IOBuffer* /* buf */,
144 int len,
Brad Lassey3a814172018-04-26 03:30:21145 CompletionOnceCallback /* callback */) override {
[email protected]0dc88b32014-03-26 20:12:28146 if (has_unread_data_ && len > 0) {
147 has_unread_data_ = false;
148 was_used_to_convey_data_ = true;
149 return 1;
150 }
[email protected]e86df8dc2013-03-30 13:18:28151 return ERR_UNEXPECTED;
[email protected]3f55aa12011-12-07 02:03:33152 }
[email protected]ab838892009-06-30 18:49:05153
[email protected]a2b2cfc2017-12-06 09:06:08154 int Write(
155 IOBuffer* /* buf */,
156 int len,
Brad Lassey3a814172018-04-26 03:30:21157 CompletionOnceCallback /* callback */,
[email protected]a2b2cfc2017-12-06 09:06:08158 const NetworkTrafficAnnotationTag& /*traffic_annotation*/) override {
[email protected]0f873e82010-09-02 16:09:01159 was_used_to_convey_data_ = true;
160 return len;
[email protected]ab838892009-06-30 18:49:05161 }
Avi Drissman13fc8932015-12-20 04:40:46162 int SetReceiveBufferSize(int32_t size) override { return OK; }
163 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]ab838892009-06-30 18:49:05164
[email protected]dbf036f2011-12-06 23:33:24165 // StreamSocket implementation.
Brad Lassey3a814172018-04-26 03:30:21166 int Connect(CompletionOnceCallback callback) override {
[email protected]dbf036f2011-12-06 23:33:24167 connected_ = true;
168 return OK;
169 }
[email protected]f6d1d6eb2009-06-24 20:16:09170
dchengb03027d2014-10-21 12:00:20171 void Disconnect() override { connected_ = false; }
172 bool IsConnected() const override { return connected_; }
173 bool IsConnectedAndIdle() const override {
[email protected]0dc88b32014-03-26 20:12:28174 return connected_ && !has_unread_data_;
175 }
[email protected]0b7648c2009-07-06 20:14:01176
dchengb03027d2014-10-21 12:00:20177 int GetPeerAddress(IPEndPoint* /* address */) const override {
[email protected]9f864b32010-01-20 15:01:16178 return ERR_UNEXPECTED;
[email protected]f6d1d6eb2009-06-24 20:16:09179 }
[email protected]f6d1d6eb2009-06-24 20:16:09180
dchengb03027d2014-10-21 12:00:20181 int GetLocalAddress(IPEndPoint* /* address */) const override {
[email protected]e7f74da2011-04-19 23:49:35182 return ERR_UNEXPECTED;
183 }
184
tfarina428341112016-09-22 13:38:20185 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]a2006ece2010-04-23 16:44:02186
dchengb03027d2014-10-21 12:00:20187 bool WasEverUsed() const override { return was_used_to_convey_data_; }
tfarina2846404c2016-12-25 14:31:37188 bool WasAlpnNegotiated() const override { return false; }
dchengb03027d2014-10-21 12:00:20189 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
190 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
ttuttle23fdb7b2015-05-15 01:28:03191 void GetConnectionAttempts(ConnectionAttempts* out) const override {
192 out->clear();
193 }
194 void ClearConnectionAttempts() override {}
195 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
tbansalf82cc8e2015-10-14 20:05:49196 int64_t GetTotalReceivedBytes() const override {
197 NOTIMPLEMENTED();
198 return 0;
199 }
Paul Jensen0f49dec2017-12-12 23:39:58200 void ApplySocketTag(const SocketTag& tag) override {}
[email protected]9b5614a2010-08-25 20:29:45201
[email protected]f6d1d6eb2009-06-24 20:16:09202 private:
203 bool connected_;
[email protected]0dc88b32014-03-26 20:12:28204 bool has_unread_data_;
tfarina428341112016-09-22 13:38:20205 NetLogWithSource net_log_;
[email protected]0f873e82010-09-02 16:09:01206 bool was_used_to_convey_data_;
[email protected]f6d1d6eb2009-06-24 20:16:09207
[email protected]ab838892009-06-30 18:49:05208 DISALLOW_COPY_AND_ASSIGN(MockClientSocket);
[email protected]f6d1d6eb2009-06-24 20:16:09209};
210
[email protected]5fc08e32009-07-15 17:09:57211class TestConnectJob;
212
[email protected]f6d1d6eb2009-06-24 20:16:09213class MockClientSocketFactory : public ClientSocketFactory {
214 public:
[email protected]ab838892009-06-30 18:49:05215 MockClientSocketFactory() : allocation_count_(0) {}
[email protected]f6d1d6eb2009-06-24 20:16:09216
danakj655b66c2016-04-16 00:51:38217 std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
[email protected]5370c012011-06-29 03:47:04218 DatagramSocket::BindType bind_type,
[email protected]98b0e582011-06-22 14:31:41219 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19220 const NetLogSource& source) override {
[email protected]98b0e582011-06-22 14:31:41221 NOTREACHED();
danakj655b66c2016-04-16 00:51:38222 return std::unique_ptr<DatagramClientSocket>();
[email protected]98b0e582011-06-22 14:31:41223 }
224
Helen Lid5bb9222018-04-12 15:33:09225 std::unique_ptr<TransportClientSocket> CreateTransportClientSocket(
[email protected]0a0b7682010-08-25 17:08:07226 const AddressList& addresses,
danakj655b66c2016-04-16 00:51:38227 std::unique_ptr<
228 SocketPerformanceWatcher> /* socket_performance_watcher */,
[email protected]0a0b7682010-08-25 17:08:07229 NetLog* /* net_log */,
mikecironef22f9812016-10-04 03:40:19230 const NetLogSource& /*source*/) override {
[email protected]f6d1d6eb2009-06-24 20:16:09231 allocation_count_++;
Helen Lid5bb9222018-04-12 15:33:09232 return nullptr;
[email protected]f6d1d6eb2009-06-24 20:16:09233 }
234
danakj655b66c2016-04-16 00:51:38235 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
236 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]4f4de7e62010-11-12 19:55:27237 const HostPortPair& host_and_port,
[email protected]7ab5bbd12010-10-19 13:33:21238 const SSLConfig& ssl_config,
mostynbba063d6032014-10-09 11:01:13239 const SSLClientSocketContext& context) override {
[email protected]f6d1d6eb2009-06-24 20:16:09240 NOTIMPLEMENTED();
danakj655b66c2016-04-16 00:51:38241 return std::unique_ptr<SSLClientSocket>();
[email protected]f6d1d6eb2009-06-24 20:16:09242 }
Matt Menkefd956922019-02-04 23:44:03243
244 std::unique_ptr<SSLClientSocket> CreateSSLClientSocket(
245 std::unique_ptr<StreamSocket> nested_socket,
246 const HostPortPair& host_and_port,
247 const SSLConfig& ssl_config,
248 const SSLClientSocketContext& context) override {
249 NOTIMPLEMENTED();
250 return std::unique_ptr<SSLClientSocket>();
251 }
252
Helen Liac3c51e2018-04-24 00:02:13253 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
254 std::unique_ptr<ClientSocketHandle> transport_socket,
255 const std::string& user_agent,
256 const HostPortPair& endpoint,
Wojciech Dzierżanowski1f823562019-01-18 11:26:00257 const ProxyServer& proxy_server,
Helen Liac3c51e2018-04-24 00:02:13258 HttpAuthController* http_auth_controller,
259 bool tunnel,
260 bool using_spdy,
261 NextProto negotiated_protocol,
Wojciech Dzierżanowski1f823562019-01-18 11:26:00262 ProxyDelegate* proxy_delegate,
Helen Liac3c51e2018-04-24 00:02:13263 bool is_https_proxy,
264 const NetworkTrafficAnnotationTag& traffic_annotation) override {
265 NOTIMPLEMENTED();
266 return nullptr;
267 }
[email protected]f6d1d6eb2009-06-24 20:16:09268
Matt Menke52cd95a2019-02-08 06:16:27269 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
270 std::unique_ptr<StreamSocket> stream_socket,
271 const std::string& user_agent,
272 const HostPortPair& endpoint,
273 const ProxyServer& proxy_server,
274 HttpAuthController* http_auth_controller,
275 bool tunnel,
276 bool using_spdy,
277 NextProto negotiated_protocol,
278 ProxyDelegate* proxy_delegate,
279 bool is_https_proxy,
280 const NetworkTrafficAnnotationTag& traffic_annotation) override {
281 NOTIMPLEMENTED();
282 return nullptr;
283 }
284
[email protected]5fc08e32009-07-15 17:09:57285 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55286
[email protected]5fc08e32009-07-15 17:09:57287 void SignalJobs();
288
[email protected]03b7c8c2013-07-20 04:38:55289 void SignalJob(size_t job);
290
291 void SetJobLoadState(size_t job, LoadState load_state);
292
Matt Menke141b87f22019-01-30 02:43:03293 // Sets the HasConnectionEstablished value of the specified job to true,
294 // without invoking the callback.
295 void SetJobHasEstablishedConnection(size_t job);
296
[email protected]f6d1d6eb2009-06-24 20:16:09297 int allocation_count() const { return allocation_count_; }
298
[email protected]f6d1d6eb2009-06-24 20:16:09299 private:
300 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57301 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09302};
303
[email protected]ab838892009-06-30 18:49:05304class TestConnectJob : public ConnectJob {
305 public:
306 enum JobType {
307 kMockJob,
308 kMockFailingJob,
309 kMockPendingJob,
310 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57311 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13312 kMockRecoverableJob,
313 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18314 kMockAdditionalErrorStateJob,
315 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28316 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05317 };
318
[email protected]994d4932010-07-12 17:55:13319 // The kMockPendingJob uses a slight delay before allowing the connect
320 // to complete.
321 static const int kPendingConnectDelay = 2;
322
[email protected]ab838892009-06-30 18:49:05323 TestConnectJob(JobType job_type,
324 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49325 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34326 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05327 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30328 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17329 NetLog* net_log)
tfarina428341112016-09-22 13:38:20330 : ConnectJob(
tfarina428341112016-09-22 13:38:20331 request.priority(),
Matt Menke1751ba72019-02-09 02:23:46332 timeout_duration,
333 CommonConnectJobParams(
334 group_name,
335 request.socket_tag(),
336 request.respect_limits() ==
337 ClientSocketPool::RespectLimits::ENABLED,
338 nullptr /* client_socket_factory */,
339 nullptr /* host_resolver */,
340 nullptr /* proxy_delegate */,
341 SSLClientSocketContext(),
342 nullptr /* socket_performance_watcher_factory */,
343 nullptr /* network_quality_estimator */,
344 net_log,
345 nullptr /* websocket_endpoint_lock_manager */),
tfarina428341112016-09-22 13:38:20346 delegate,
davidbenb7048f092016-11-30 21:20:26347 NetLogWithSource::Make(net_log,
348 NetLogSourceType::TRANSPORT_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58349 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05350 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18351 load_state_(LOAD_STATE_IDLE),
Matt Menke141b87f22019-01-30 02:43:03352 has_established_connection_(false),
[email protected]d5492c52013-11-10 20:44:39353 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15354 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05355
[email protected]974ebd62009-08-03 23:14:34356 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13357 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34358 }
359
[email protected]03b7c8c2013-07-20 04:38:55360 void set_load_state(LoadState load_state) { load_state_ = load_state; }
361
Matt Menke141b87f22019-01-30 02:43:03362 void set_has_established_connection() {
363 DCHECK(!has_established_connection_);
364 has_established_connection_ = true;
365 }
366
[email protected]03b7c8c2013-07-20 04:38:55367 // From ConnectJob:
368
dchengb03027d2014-10-21 12:00:20369 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21370
Matt Menke141b87f22019-01-30 02:43:03371 bool HasEstablishedConnection() const override {
372 return has_established_connection_;
373 }
374
dchengb03027d2014-10-21 12:00:20375 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18376 if (store_additional_error_state_) {
377 // Set all of the additional error state fields in some way.
378 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43379 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45380 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43381 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18382 }
383 }
384
[email protected]974ebd62009-08-03 23:14:34385 private:
[email protected]03b7c8c2013-07-20 04:38:55386 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05387
dchengb03027d2014-10-21 12:00:20388 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05389 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21390 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19391 NetLogSource());
danakj655b66c2016-04-16 00:51:38392 SetSocket(std::unique_ptr<StreamSocket>(
393 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05394 switch (job_type_) {
395 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13396 return DoConnect(true /* successful */, false /* sync */,
397 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05398 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13399 return DoConnect(false /* error */, false /* sync */,
400 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05401 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57402 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47403
404 // Depending on execution timings, posting a delayed task can result
405 // in the task getting executed the at the earliest possible
406 // opportunity or only after returning once from the message loop and
407 // then a second call into the message loop. In order to make behavior
408 // more deterministic, we change the default delay to 2ms. This should
409 // always require us to wait for the second call into the message loop.
410 //
411 // N.B. The correct fix for this and similar timing problems is to
412 // abstract time for the purpose of unittests. Unfortunately, we have
413 // a lot of third-party components that directly call the various
414 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45415 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05416 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13417 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45418 weak_factory_.GetWeakPtr(), true /* successful */,
419 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53420 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05421 return ERR_IO_PENDING;
422 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57423 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45424 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05425 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13426 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45427 weak_factory_.GetWeakPtr(), false /* error */,
428 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53429 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05430 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57431 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55432 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57433 client_socket_factory_->WaitForSignal(this);
434 waiting_success_ = true;
435 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13436 case kMockRecoverableJob:
437 return DoConnect(false /* error */, false /* sync */,
438 true /* recoverable */);
439 case kMockPendingRecoverableJob:
440 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45441 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13442 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13443 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45444 weak_factory_.GetWeakPtr(), false /* error */,
445 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53446 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13447 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18448 case kMockAdditionalErrorStateJob:
449 store_additional_error_state_ = true;
450 return DoConnect(false /* error */, false /* sync */,
451 false /* recoverable */);
452 case kMockPendingAdditionalErrorStateJob:
453 set_load_state(LOAD_STATE_CONNECTING);
454 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45455 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18456 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13457 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45458 weak_factory_.GetWeakPtr(), false /* error */,
459 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53460 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18461 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28462 case kMockUnreadDataJob: {
463 int ret = DoConnect(true /* successful */, false /* sync */,
464 false /* recoverable */);
465 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
466 return ret;
467 }
[email protected]ab838892009-06-30 18:49:05468 default:
469 NOTREACHED();
danakj655b66c2016-04-16 00:51:38470 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05471 return ERR_FAILED;
472 }
473 }
474
Lily Chen02ef29a2018-11-30 16:31:43475 void ChangePriorityInternal(RequestPriority priority) override {}
476
[email protected]e772db3f2010-07-12 18:11:13477 int DoConnect(bool succeed, bool was_async, bool recoverable) {
478 int result = OK;
Matt Menke141b87f22019-01-30 02:43:03479 has_established_connection_ = true;
[email protected]ab838892009-06-30 18:49:05480 if (succeed) {
Bence Békybdbb0e72018-08-07 21:42:59481 socket()->Connect(CompletionOnceCallback());
[email protected]e772db3f2010-07-12 18:11:13482 } else if (recoverable) {
483 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40484 } else {
[email protected]e772db3f2010-07-12 18:11:13485 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38486 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05487 }
[email protected]2ab05b52009-07-01 23:57:58488
489 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30490 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05491 return result;
492 }
493
[email protected]5fc08e32009-07-15 17:09:57494 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05495 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57496 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21497 LoadState load_state_;
Matt Menke141b87f22019-01-30 02:43:03498 bool has_established_connection_;
[email protected]e60e47a2010-07-14 03:37:18499 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05500
[email protected]d5492c52013-11-10 20:44:39501 base::WeakPtrFactory<TestConnectJob> weak_factory_;
502
[email protected]ab838892009-06-30 18:49:05503 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
504};
505
[email protected]d80a4322009-08-14 07:07:49506class TestConnectJobFactory
507 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05508 public:
[email protected]034df0f32013-01-07 23:17:48509 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
510 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05511 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48512 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48513 client_socket_factory_(client_socket_factory),
514 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33515 }
[email protected]ab838892009-06-30 18:49:05516
Chris Watkins7a41d3552017-12-01 02:13:27517 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05518
519 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
520
[email protected]51fdc7c2012-04-10 19:19:48521 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
522 job_types_ = job_types;
523 CHECK(!job_types_->empty());
524 }
525
[email protected]974ebd62009-08-03 23:14:34526 void set_timeout_duration(base::TimeDelta timeout_duration) {
527 timeout_duration_ = timeout_duration;
528 }
529
[email protected]3f55aa12011-12-07 02:03:33530 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55531
danakj655b66c2016-04-16 00:51:38532 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05533 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49534 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13535 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48536 EXPECT_TRUE(!job_types_ || !job_types_->empty());
537 TestConnectJob::JobType job_type = job_type_;
538 if (job_types_ && !job_types_->empty()) {
539 job_type = job_types_->front();
540 job_types_->pop_front();
541 }
danakj655b66c2016-04-16 00:51:38542 return std::unique_ptr<ConnectJob>(
543 new TestConnectJob(job_type, group_name, request, timeout_duration_,
544 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05545 }
546
547 private:
548 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48549 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34550 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57551 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48552 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05553
554 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
555};
556
557class TestClientSocketPool : public ClientSocketPool {
558 public:
[email protected]12322e7e2013-08-15 17:49:26559 typedef TestSocketParams SocketParams;
560
[email protected]ab838892009-06-30 18:49:05561 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53562 int max_sockets,
[email protected]ab838892009-06-30 18:49:05563 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16564 base::TimeDelta unused_idle_socket_timeout,
565 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49566 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41567 : base_(NULL,
568 max_sockets,
569 max_sockets_per_group,
570 unused_idle_socket_timeout,
571 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38572 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05573
Chris Watkins7a41d3552017-12-01 02:13:27574 ~TestClientSocketPool() override = default;
[email protected]2431756e2010-09-29 20:26:13575
dchengb03027d2014-10-21 12:00:20576 int RequestSocket(const std::string& group_name,
577 const void* params,
ttuttle859dc7a2015-04-23 19:42:29578 RequestPriority priority,
Paul Jensen8d6f87ec2018-01-13 00:46:54579 const SocketTag& socket_tag,
mmenked3641e12016-01-28 16:06:15580 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20581 ClientSocketHandle* handle,
Bence Béky5a8662b2018-07-03 13:04:03582 CompletionOnceCallback callback,
tfarina428341112016-09-22 13:38:20583 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21584 const scoped_refptr<TestSocketParams>* casted_socket_params =
585 static_cast<const scoped_refptr<TestSocketParams>*>(params);
586 return base_.RequestSocket(group_name, *casted_socket_params, priority,
Bence Béky5a8662b2018-07-03 13:04:03587 socket_tag, respect_limits, handle,
588 std::move(callback), net_log);
[email protected]ab838892009-06-30 18:49:05589 }
590
dchengb03027d2014-10-21 12:00:20591 void RequestSockets(const std::string& group_name,
592 const void* params,
593 int num_sockets,
Charlie Harrison55ce6082018-05-14 02:25:57594 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03595 const scoped_refptr<TestSocketParams>* casted_params =
596 static_cast<const scoped_refptr<TestSocketParams>*>(params);
597
Charlie Harrison55ce6082018-05-14 02:25:57598 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
[email protected]2c2bef152010-10-13 00:55:03599 }
600
rdsmith29dbad12017-02-17 02:22:18601 void SetPriority(const std::string& group_name,
602 ClientSocketHandle* handle,
603 RequestPriority priority) override {
604 base_.SetPriority(group_name, handle, priority);
605 }
606
dchengb03027d2014-10-21 12:00:20607 void CancelRequest(const std::string& group_name,
608 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49609 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05610 }
611
dchengb03027d2014-10-21 12:00:20612 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38613 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20614 int id) override {
dchengc7eeda422015-12-26 03:56:48615 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24616 }
617
dchengb03027d2014-10-21 12:00:20618 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05619
dchengb03027d2014-10-21 12:00:20620 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48621
dchengb03027d2014-10-21 12:00:20622 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05623
xunjieli92feb332017-03-03 17:19:23624 void CloseIdleSocketsInGroup(const std::string& group_name) override {
625 base_.CloseIdleSocketsInGroup(group_name);
626 }
627
dchengb03027d2014-10-21 12:00:20628 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05629
dchengb03027d2014-10-21 12:00:20630 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49631 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05632 }
633
dchengb03027d2014-10-21 12:00:20634 LoadState GetLoadState(const std::string& group_name,
635 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49636 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05637 }
638
dchengb03027d2014-10-21 12:00:20639 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52640 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48641 }
642
dchengb03027d2014-10-21 12:00:20643 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52644 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48645 }
646
danakj655b66c2016-04-16 00:51:38647 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59648 const std::string& name,
649 const std::string& type,
mostynbba063d6032014-10-09 11:01:13650 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27651 return base_.GetInfoAsValue(name, type);
652 }
653
[email protected]d80a4322009-08-14 07:07:49654 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20655
Lily Chenecebf932018-11-02 17:15:43656 int NumNeverAssignedConnectJobsInGroup(const std::string& group_name) const {
657 return base_.NumNeverAssignedConnectJobsInGroup(group_name);
658 }
659
[email protected]8159a1c2012-06-07 00:00:10660 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
661 return base_.NumUnassignedConnectJobsInGroup(group_name);
662 }
663
[email protected]974ebd62009-08-03 23:14:34664 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49665 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34666 }
667
[email protected]2c2bef152010-10-13 00:55:03668 int NumActiveSocketsInGroup(const std::string& group_name) const {
669 return base_.NumActiveSocketsInGroup(group_name);
670 }
671
Lily Chenecebf932018-11-02 17:15:43672 bool RequestInGroupWithHandleHasJobForTesting(
673 const std::string& group_name,
674 const ClientSocketHandle* handle) const {
675 return base_.RequestInGroupWithHandleHasJobForTesting(group_name, handle);
676 }
677
[email protected]2abfe90a2010-08-25 17:49:51678 bool HasGroup(const std::string& group_name) const {
679 return base_.HasGroup(group_name);
680 }
681
[email protected]9bf28db2009-08-29 01:35:16682 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
683
[email protected]06d94042010-08-25 01:45:22684 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54685
[email protected]043b68c82013-08-22 23:41:52686 bool CloseOneIdleConnectionInHigherLayeredPool() {
687 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48688 }
689
[email protected]ab838892009-06-30 18:49:05690 private:
[email protected]d80a4322009-08-14 07:07:49691 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05692
693 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
694};
695
[email protected]a937a06d2009-08-19 21:19:24696} // namespace
697
[email protected]a937a06d2009-08-19 21:19:24698namespace {
699
[email protected]5fc08e32009-07-15 17:09:57700void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26701 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57702 (*it)->Signal();
703 }
704 waiting_jobs_.clear();
705}
706
[email protected]03b7c8c2013-07-20 04:38:55707void MockClientSocketFactory::SignalJob(size_t job) {
708 ASSERT_LT(job, waiting_jobs_.size());
709 waiting_jobs_[job]->Signal();
710 waiting_jobs_.erase(waiting_jobs_.begin() + job);
711}
712
713void MockClientSocketFactory::SetJobLoadState(size_t job,
714 LoadState load_state) {
715 ASSERT_LT(job, waiting_jobs_.size());
716 waiting_jobs_[job]->set_load_state(load_state);
717}
718
Matt Menke141b87f22019-01-30 02:43:03719void MockClientSocketFactory::SetJobHasEstablishedConnection(size_t job) {
720 ASSERT_LT(job, waiting_jobs_.size());
721 waiting_jobs_[job]->set_has_established_connection();
722}
723
Bence Béky98447b12018-05-08 03:14:01724class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09725 protected:
Alex Clarke0def2092018-12-10 12:01:45726 ClientSocketPoolBaseTest()
727 : TestWithScopedTaskEnvironment(
728 base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
729 params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54730 connect_backup_jobs_enabled_ =
731 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
732 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
733 }
[email protected]2431756e2010-09-29 20:26:13734
dcheng67be2b1f2014-10-27 21:47:29735 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54736 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
737 connect_backup_jobs_enabled_);
738 }
[email protected]c9d6a1d2009-07-14 16:15:20739
[email protected]211d21722009-07-22 15:48:53740 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16741 CreatePoolWithIdleTimeouts(
742 max_sockets,
743 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30744 ClientSocketPool::unused_idle_socket_timeout(),
745 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16746 }
747
748 void CreatePoolWithIdleTimeouts(
749 int max_sockets, int max_sockets_per_group,
750 base::TimeDelta unused_idle_socket_timeout,
751 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20752 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48753 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
754 &net_log_);
[email protected]2431756e2010-09-29 20:26:13755 pool_.reset(new TestClientSocketPool(max_sockets,
756 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13757 unused_idle_socket_timeout,
758 used_idle_socket_timeout,
759 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20760 }
[email protected]f6d1d6eb2009-06-24 20:16:09761
mmenked3641e12016-01-28 16:06:15762 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33763 const std::string& group_name,
764 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15765 ClientSocketPool::RespectLimits respect_limits) {
766 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
767 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33768 }
769
770 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15771 return StartRequestWithIgnoreLimits(
772 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09773 }
774
[email protected]2431756e2010-09-29 20:26:13775 int GetOrderOfRequest(size_t index) const {
776 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09777 }
778
[email protected]2431756e2010-09-29 20:26:13779 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
780 return test_base_.ReleaseOneConnection(keep_alive);
781 }
782
783 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
784 test_base_.ReleaseAllConnections(keep_alive);
785 }
786
787 TestSocketRequest* request(int i) { return test_base_.request(i); }
788 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38789 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42790 return test_base_.requests();
791 }
rdsmith29dbad12017-02-17 02:22:18792 // Only counts the requests that get sockets asynchronously;
793 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13794 size_t completion_count() const { return test_base_.completion_count(); }
795
vishal.b62985ca92015-04-17 08:45:51796 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54797 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09798 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04799 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21800 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38801 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13802 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09803};
804
[email protected]5fc08e32009-07-15 17:09:57805TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53806 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20807
[email protected]6ecf2b92011-12-15 01:14:52808 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06809 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51810 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48811 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53812
Paul Jensen8d6f87ec2018-01-13 00:46:54813 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15814 ClientSocketPool::RespectLimits::ENABLED,
815 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09816 EXPECT_TRUE(handle.is_initialized());
817 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48818 TestLoadTimingInfoConnectedNotReused(handle);
819
[email protected]f6d1d6eb2009-06-24 20:16:09820 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48821 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30822
mmenke43758e62015-05-04 21:09:46823 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40824 log.GetEntries(&entries);
825
826 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00827 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53828 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00829 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
830 NetLogEventPhase::NONE));
831 EXPECT_TRUE(LogContainsEvent(entries, 2,
832 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
833 NetLogEventPhase::NONE));
834 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09835}
836
[email protected]ab838892009-06-30 18:49:05837TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53838 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20839
[email protected]ab838892009-06-30 18:49:05840 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51841 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53842
[email protected]2431756e2010-09-29 20:26:13843 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52844 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18845 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13846 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43847 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45848 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13849 handle.set_ssl_error_response_info(info);
850 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:54851 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15852 ClientSocketPool::RespectLimits::ENABLED,
853 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13854 EXPECT_FALSE(handle.socket());
855 EXPECT_FALSE(handle.is_ssl_error());
856 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48857 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30858
mmenke43758e62015-05-04 21:09:46859 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40860 log.GetEntries(&entries);
861
862 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00863 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17864 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00865 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
866 NetLogEventPhase::NONE));
867 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09868}
869
[email protected]211d21722009-07-22 15:48:53870TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
871 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
872
[email protected]9e743cd2010-03-16 07:03:53873 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30874
robpercival214763f2016-07-01 23:27:01875 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
876 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
877 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
878 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53879
[email protected]2431756e2010-09-29 20:26:13880 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53881 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13882 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53883
robpercival214763f2016-07-01 23:27:01884 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
885 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
886 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53887
[email protected]2431756e2010-09-29 20:26:13888 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53889
[email protected]2431756e2010-09-29 20:26:13890 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53891 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13892 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53893
894 EXPECT_EQ(1, GetOrderOfRequest(1));
895 EXPECT_EQ(2, GetOrderOfRequest(2));
896 EXPECT_EQ(3, GetOrderOfRequest(3));
897 EXPECT_EQ(4, GetOrderOfRequest(4));
898 EXPECT_EQ(5, GetOrderOfRequest(5));
899 EXPECT_EQ(6, GetOrderOfRequest(6));
900 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17901
902 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13903 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53904}
905
906TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
907 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
908
[email protected]9e743cd2010-03-16 07:03:53909 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30910
[email protected]211d21722009-07-22 15:48:53911 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01912 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
913 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
914 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
915 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53916
[email protected]2431756e2010-09-29 20:26:13917 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53918 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13919 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53920
921 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01922 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), 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));
[email protected]75439d3b2009-07-23 22:11:17935
936 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13937 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53938}
939
940TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
941 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
942
robpercival214763f2016-07-01 23:27:01943 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
944 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
945 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
946 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53947
[email protected]2431756e2010-09-29 20:26:13948 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53949 client_socket_factory_.allocation_count());
950
robpercival214763f2016-07-01 23:27:01951 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
952 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
953 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53954
[email protected]2431756e2010-09-29 20:26:13955 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53956
[email protected]2431756e2010-09-29 20:26:13957 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53958
959 // First 4 requests don't have to wait, and finish in order.
960 EXPECT_EQ(1, GetOrderOfRequest(1));
961 EXPECT_EQ(2, GetOrderOfRequest(2));
962 EXPECT_EQ(3, GetOrderOfRequest(3));
963 EXPECT_EQ(4, GetOrderOfRequest(4));
964
[email protected]ac790b42009-12-02 04:31:31965 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
966 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53967 EXPECT_EQ(7, GetOrderOfRequest(5));
968 EXPECT_EQ(6, GetOrderOfRequest(6));
969 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17970
971 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13972 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53973}
974
rdsmith29dbad12017-02-17 02:22:18975// Test reprioritizing a request before completion doesn't interfere with
976// its completion.
977TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
978 CreatePool(kDefaultMaxSockets, 1);
979
980 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
981 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
982 EXPECT_TRUE(request(0)->handle()->socket());
983 EXPECT_FALSE(request(1)->handle()->socket());
984
Lily Chenecebf932018-11-02 17:15:43985 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:18986
987 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
988
989 EXPECT_TRUE(request(1)->handle()->socket());
990}
991
992// Reprioritize a request up past another one and make sure that changes the
993// completion order.
994TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
995 CreatePool(kDefaultMaxSockets, 1);
996
997 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
998 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
999 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1000 EXPECT_TRUE(request(0)->handle()->socket());
1001 EXPECT_FALSE(request(1)->handle()->socket());
1002 EXPECT_FALSE(request(2)->handle()->socket());
1003
1004 request(2)->handle()->SetPriority(HIGHEST);
1005
1006 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1007
1008 EXPECT_EQ(1, GetOrderOfRequest(1));
1009 EXPECT_EQ(3, GetOrderOfRequest(2));
1010 EXPECT_EQ(2, GetOrderOfRequest(3));
1011}
1012
1013// Reprioritize a request without changing relative priorities and check
1014// that the order doesn't change.
1015TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
1016 CreatePool(kDefaultMaxSockets, 1);
1017
1018 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1019 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1020 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1021 EXPECT_TRUE(request(0)->handle()->socket());
1022 EXPECT_FALSE(request(1)->handle()->socket());
1023 EXPECT_FALSE(request(2)->handle()->socket());
1024
1025 request(2)->handle()->SetPriority(MEDIUM);
1026
1027 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1028
1029 EXPECT_EQ(1, GetOrderOfRequest(1));
1030 EXPECT_EQ(2, GetOrderOfRequest(2));
1031 EXPECT_EQ(3, GetOrderOfRequest(3));
1032}
1033
1034// Reprioritize a request past down another one and make sure that changes the
1035// completion order.
1036TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
1037 CreatePool(kDefaultMaxSockets, 1);
1038
1039 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1040 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1041 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1042 EXPECT_TRUE(request(0)->handle()->socket());
1043 EXPECT_FALSE(request(1)->handle()->socket());
1044 EXPECT_FALSE(request(2)->handle()->socket());
1045
1046 request(1)->handle()->SetPriority(LOW);
1047
1048 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1049
1050 EXPECT_EQ(1, GetOrderOfRequest(1));
1051 EXPECT_EQ(3, GetOrderOfRequest(2));
1052 EXPECT_EQ(2, GetOrderOfRequest(3));
1053}
1054
1055// Reprioritize a request to the same level as another and confirm it is
1056// put after the old request.
1057TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1058 CreatePool(kDefaultMaxSockets, 1);
1059
1060 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1061 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1062 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1063 EXPECT_TRUE(request(0)->handle()->socket());
1064 EXPECT_FALSE(request(1)->handle()->socket());
1065 EXPECT_FALSE(request(2)->handle()->socket());
1066
1067 request(1)->handle()->SetPriority(MEDIUM);
1068
1069 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1070
1071 EXPECT_EQ(1, GetOrderOfRequest(1));
1072 EXPECT_EQ(3, GetOrderOfRequest(2));
1073 EXPECT_EQ(2, GetOrderOfRequest(3));
1074}
1075
[email protected]211d21722009-07-22 15:48:531076TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1077 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1078
robpercival214763f2016-07-01 23:27:011079 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
1080 EXPECT_THAT(StartRequest("a", LOW), IsOk());
1081 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
1082 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531083
[email protected]2431756e2010-09-29 20:26:131084 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531085 client_socket_factory_.allocation_count());
1086
robpercival214763f2016-07-01 23:27:011087 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1088 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1089 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531090
[email protected]2431756e2010-09-29 20:26:131091 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531092
[email protected]2431756e2010-09-29 20:26:131093 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531094 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131095 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531096
1097 // First 4 requests don't have to wait, and finish in order.
1098 EXPECT_EQ(1, GetOrderOfRequest(1));
1099 EXPECT_EQ(2, GetOrderOfRequest(2));
1100 EXPECT_EQ(3, GetOrderOfRequest(3));
1101 EXPECT_EQ(4, GetOrderOfRequest(4));
1102
1103 // Request ("b", 7) has the highest priority, but we can't make new socket for
1104 // group "b", because it has reached the per-group limit. Then we make
1105 // socket for ("c", 6), because it has higher priority than ("a", 4),
1106 // and we still can't make a socket for group "b".
1107 EXPECT_EQ(5, GetOrderOfRequest(5));
1108 EXPECT_EQ(6, GetOrderOfRequest(6));
1109 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171110
1111 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131112 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531113}
1114
1115// Make sure that we count connecting sockets against the total limit.
1116TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1117 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1118
robpercival214763f2016-07-01 23:27:011119 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1120 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1121 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531122
1123 // Create one asynchronous request.
1124 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011125 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531126
[email protected]6b175382009-10-13 06:47:471127 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1128 // actually become pending until 2ms after they have been created. In order
1129 // to flush all tasks, we need to wait so that we know there are no
1130 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451131 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471132
[email protected]211d21722009-07-22 15:48:531133 // The next synchronous request should wait for its turn.
1134 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011135 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531136
[email protected]2431756e2010-09-29 20:26:131137 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531138
[email protected]2431756e2010-09-29 20:26:131139 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531140 client_socket_factory_.allocation_count());
1141
1142 EXPECT_EQ(1, GetOrderOfRequest(1));
1143 EXPECT_EQ(2, GetOrderOfRequest(2));
1144 EXPECT_EQ(3, GetOrderOfRequest(3));
1145 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171146 EXPECT_EQ(5, GetOrderOfRequest(5));
1147
1148 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131149 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531150}
1151
[email protected]6427fe22010-04-16 22:27:411152TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1153 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1154 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1155
robpercival214763f2016-07-01 23:27:011156 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1157 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1158 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1159 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411160
1161 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1162
1163 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1164
robpercival214763f2016-07-01 23:27:011165 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1166 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411167
1168 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1169
[email protected]2431756e2010-09-29 20:26:131170 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411171 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131172 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411173 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131174 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1175 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411176 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1177}
1178
[email protected]d7027bb2010-05-10 18:58:541179TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1180 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1181 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1182
1183 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521184 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131185 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541186 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151187 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201188 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541189
1190 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241191 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521192 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201193 EXPECT_EQ(
1194 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541195 handles[i].Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201196 ClientSocketPool::RespectLimits::ENABLED,
1197 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541198 }
1199
1200 // One will be stalled, cancel all the handles now.
1201 // This should hit the OnAvailableSocketSlot() code where we previously had
1202 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241203 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541204 handles[i].Reset();
1205}
1206
[email protected]eb5a99382010-07-11 03:18:261207TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541208 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1209 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1210
[email protected]eb5a99382010-07-11 03:18:261211 {
1212 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521213 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261214 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Raul Tambre8c1981d2019-02-08 02:22:261215 EXPECT_EQ(OK, handles[i].Init(base::NumberToString(i), params_,
Paul Jensen8d6f87ec2018-01-13 00:46:541216 DEFAULT_PRIORITY, SocketTag(),
1217 ClientSocketPool::RespectLimits::ENABLED,
1218 callbacks[i].callback(), pool_.get(),
1219 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261220 }
1221
1222 // Force a stalled group.
1223 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521224 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201225 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541226 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201227 ClientSocketPool::RespectLimits::ENABLED,
1228 callback.callback(), pool_.get(),
1229 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261230
1231 // Cancel the stalled request.
1232 stalled_handle.Reset();
1233
1234 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1235 EXPECT_EQ(0, pool_->IdleSocketCount());
1236
1237 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541238 }
1239
[email protected]43a21b82010-06-10 21:30:541240 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1241 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261242}
[email protected]43a21b82010-06-10 21:30:541243
[email protected]eb5a99382010-07-11 03:18:261244TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1245 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1246 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1247
1248 {
1249 ClientSocketHandle handles[kDefaultMaxSockets];
1250 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521251 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201252 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541253 handles[i].Init(
Raul Tambre8c1981d2019-02-08 02:22:261254 base::NumberToString(i), params_, DEFAULT_PRIORITY,
Paul Jensen8d6f87ec2018-01-13 00:46:541255 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1256 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261257 }
1258
1259 // Force a stalled group.
1260 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1261 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521262 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201263 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541264 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201265 ClientSocketPool::RespectLimits::ENABLED,
1266 callback.callback(), pool_.get(),
1267 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261268
1269 // Since it is stalled, it should have no connect jobs.
1270 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
Lily Chenecebf932018-11-02 17:15:431271 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101272 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261273
1274 // Cancel the stalled request.
1275 handles[0].Reset();
1276
[email protected]eb5a99382010-07-11 03:18:261277 // Now we should have a connect job.
1278 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
Lily Chenecebf932018-11-02 17:15:431279 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101280 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261281
1282 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011283 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261284
1285 EXPECT_EQ(kDefaultMaxSockets + 1,
1286 client_socket_factory_.allocation_count());
1287 EXPECT_EQ(0, pool_->IdleSocketCount());
1288 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
Lily Chenecebf932018-11-02 17:15:431289 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101290 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261291
1292 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541293 }
1294
[email protected]eb5a99382010-07-11 03:18:261295 EXPECT_EQ(1, pool_->IdleSocketCount());
1296}
[email protected]43a21b82010-06-10 21:30:541297
[email protected]eb5a99382010-07-11 03:18:261298TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1299 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1300 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541301
[email protected]eb5a99382010-07-11 03:18:261302 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521303 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261304 {
[email protected]51fdc7c2012-04-10 19:19:481305 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261306 ClientSocketHandle handles[kDefaultMaxSockets];
1307 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521308 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201309 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
Paul Jensen8d6f87ec2018-01-13 00:46:541310 params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201311 ClientSocketPool::RespectLimits::ENABLED,
1312 callback.callback(), pool_.get(),
1313 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261314 }
1315
1316 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1317 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481318 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261319
1320 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201321 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541322 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201323 ClientSocketPool::RespectLimits::ENABLED,
1324 callback.callback(), pool_.get(),
1325 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481326 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261327
1328 // Dropping out of scope will close all handles and return them to idle.
1329 }
[email protected]43a21b82010-06-10 21:30:541330
1331 // But if we wait for it, the released idle sockets will be closed in
1332 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011333 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261334
1335 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1336 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541337}
1338
1339// Regression test for http://crbug.com/40952.
1340TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1341 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221342 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541343 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1344
1345 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1346 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521347 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201348 EXPECT_EQ(
Raul Tambre8c1981d2019-02-08 02:22:261349 OK, handle.Init(base::NumberToString(i), params_, DEFAULT_PRIORITY,
Paul Jensen8d6f87ec2018-01-13 00:46:541350 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201351 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541352 }
1353
1354 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281355 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541356
1357 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1358 // reuse a socket.
1359 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1360 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521361 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541362
1363 // "0" is special here, since it should be the first entry in the sorted map,
1364 // which is the one which we would close an idle socket for. We shouldn't
1365 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201366 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:541367 handle.Init("0", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201368 ClientSocketPool::RespectLimits::ENABLED,
1369 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541370
1371 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1372 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1373}
1374
[email protected]ab838892009-06-30 18:49:051375TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531376 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091377
robpercival214763f2016-07-01 23:27:011378 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1379 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1380 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1381 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1382 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1383 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1384 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1385 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091386
[email protected]2431756e2010-09-29 20:26:131387 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201388 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1389 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131390 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1391 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091392
[email protected]c9d6a1d2009-07-14 16:15:201393 EXPECT_EQ(1, GetOrderOfRequest(1));
1394 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031395 EXPECT_EQ(8, GetOrderOfRequest(3));
1396 EXPECT_EQ(6, GetOrderOfRequest(4));
1397 EXPECT_EQ(4, GetOrderOfRequest(5));
1398 EXPECT_EQ(3, GetOrderOfRequest(6));
1399 EXPECT_EQ(5, GetOrderOfRequest(7));
1400 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171401
1402 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131403 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091404}
1405
[email protected]ab838892009-06-30 18:49:051406TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531407 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091408
robpercival214763f2016-07-01 23:27:011409 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1410 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1411 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1412 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1413 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1414 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1415 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091416
[email protected]2431756e2010-09-29 20:26:131417 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091418
[email protected]2431756e2010-09-29 20:26:131419 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011420 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201421
[email protected]2431756e2010-09-29 20:26:131422 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201423 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131424 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1425 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091426}
1427
1428// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051429// The pending connect job will be cancelled and should not call back into
1430// ClientSocketPoolBase.
1431TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531432 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201433
[email protected]ab838892009-06-30 18:49:051434 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131435 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521436 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151437 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541438 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151439 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201440 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131441 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091442}
1443
[email protected]ab838892009-06-30 18:49:051444TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531445 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201446
[email protected]ab838892009-06-30 18:49:051447 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061448 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521449 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091450
mmenked3641e12016-01-28 16:06:151451 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541452 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151453 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201454 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091455
1456 handle.Reset();
1457
[email protected]6ecf2b92011-12-15 01:14:521458 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131459 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541460 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151461 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201462 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091463
robpercival214763f2016-07-01 23:27:011464 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091465 EXPECT_FALSE(callback.have_result());
1466
1467 handle.Reset();
1468}
1469
[email protected]ab838892009-06-30 18:49:051470TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531471 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091472
robpercival214763f2016-07-01 23:27:011473 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1474 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1475 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1476 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1477 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1478 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1479 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091480
1481 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201482 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131483 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1484 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091485
[email protected]2431756e2010-09-29 20:26:131486 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091487
[email protected]c9d6a1d2009-07-14 16:15:201488 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1489 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131490 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1491 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091492
[email protected]c9d6a1d2009-07-14 16:15:201493 EXPECT_EQ(1, GetOrderOfRequest(1));
1494 EXPECT_EQ(2, GetOrderOfRequest(2));
1495 EXPECT_EQ(5, GetOrderOfRequest(3));
1496 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131497 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1498 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201499 EXPECT_EQ(4, GetOrderOfRequest(6));
1500 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171501
1502 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131503 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091504}
1505
mmenke33d24423d2015-05-19 19:41:091506// Function to be used as a callback on socket request completion. It first
1507// disconnects the successfully connected socket from the first request, and
1508// then reuses the ClientSocketHandle to request another socket.
1509//
1510// |nested_callback| is called with the result of the second socket request.
1511void RequestSocketOnComplete(ClientSocketHandle* handle,
1512 TestClientSocketPool* pool,
1513 TestConnectJobFactory* test_connect_job_factory,
1514 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411515 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091516 int first_request_result) {
robpercival214763f2016-07-01 23:27:011517 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091518
1519 test_connect_job_factory->set_job_type(next_job_type);
1520
1521 // Don't allow reuse of the socket. Disconnect it and then release it.
1522 if (handle->socket())
1523 handle->socket()->Disconnect();
1524 handle->Reset();
1525
mmenked3641e12016-01-28 16:06:151526 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091527 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541528 int rv = handle->Init("a", params, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151529 ClientSocketPool::RespectLimits::ENABLED,
Bence Békya4a50932018-08-10 13:39:411530 nested_callback->callback(), pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091531 if (rv != ERR_IO_PENDING) {
1532 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411533 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091534 } else {
1535 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521536 }
mmenke33d24423d2015-05-19 19:41:091537}
[email protected]f6d1d6eb2009-06-24 20:16:091538
mmenke33d24423d2015-05-19 19:41:091539// Tests the case where a second socket is requested in a completion callback,
1540// and the second socket connects asynchronously. Reuses the same
1541// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581542TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531543 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201544
[email protected]0b7648c2009-07-06 20:14:011545 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061546 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091547 TestCompletionCallback second_result_callback;
1548 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541549 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1550 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091551 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1552 connect_job_factory_, TestConnectJob::kMockPendingJob,
Bence Békya4a50932018-08-10 13:39:411553 &second_result_callback),
tfarina428341112016-09-22 13:38:201554 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011555 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091556
robpercival214763f2016-07-01 23:27:011557 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581558}
[email protected]f6d1d6eb2009-06-24 20:16:091559
mmenke33d24423d2015-05-19 19:41:091560// Tests the case where a second socket is requested in a completion callback,
1561// and the second socket connects synchronously. Reuses the same
1562// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581563TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531564 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201565
[email protected]0b7648c2009-07-06 20:14:011566 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061567 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091568 TestCompletionCallback second_result_callback;
1569 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541570 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1571 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091572 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1573 connect_job_factory_, TestConnectJob::kMockPendingJob,
Bence Békya4a50932018-08-10 13:39:411574 &second_result_callback),
tfarina428341112016-09-22 13:38:201575 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011576 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581577
robpercival214763f2016-07-01 23:27:011578 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091579}
1580
1581// Make sure that pending requests get serviced after active requests get
1582// cancelled.
[email protected]ab838892009-06-30 18:49:051583TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531584 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201585
[email protected]0b7648c2009-07-06 20:14:011586 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091587
robpercival214763f2016-07-01 23:27:011588 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1589 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1590 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1591 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1592 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1593 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1594 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091595
[email protected]c9d6a1d2009-07-14 16:15:201596 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1597 // Let's cancel them.
1598 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131599 ASSERT_FALSE(request(i)->handle()->is_initialized());
1600 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091601 }
1602
[email protected]f6d1d6eb2009-06-24 20:16:091603 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131604 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011605 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131606 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091607 }
1608
[email protected]2431756e2010-09-29 20:26:131609 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1610 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091611}
1612
1613// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051614TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531615 const size_t kMaxSockets = 5;
1616 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201617
[email protected]0b7648c2009-07-06 20:14:011618 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091619
[email protected]211d21722009-07-22 15:48:531620 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1621 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091622
1623 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531624 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011625 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091626
[email protected]211d21722009-07-22 15:48:531627 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011628 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091629}
1630
mmenke9d72fe42017-05-18 22:36:071631// Make sure that pending requests that complete synchronously get serviced
1632// after active requests fail. See https://crbug.com/723748
1633TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1634 const size_t kNumberOfRequests = 10;
1635 const size_t kMaxSockets = 1;
1636 CreatePool(kMaxSockets, kMaxSockets);
1637
1638 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1639
1640 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1641
1642 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1643
1644 // Queue up all the other requests
1645 for (size_t i = 1; i < kNumberOfRequests; ++i)
1646 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1647
1648 // Make sure all requests fail, instead of hanging.
1649 for (size_t i = 0; i < kNumberOfRequests; ++i)
1650 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1651}
1652
[email protected]5fc08e32009-07-15 17:09:571653TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531654 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571655
1656 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1657
[email protected]2431756e2010-09-29 20:26:131658 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521659 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541660 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151661 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201662 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011663 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571664
1665 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131666 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571667
Paul Jensen8d6f87ec2018-01-13 00:46:541668 rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151669 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201670 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011671 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1672 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571673
[email protected]2431756e2010-09-29 20:26:131674 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481675 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571676 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1677}
1678
xunjieli26619e72016-11-23 19:39:551679TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551680 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1681 ClientSocketHandle handle;
1682 TestCompletionCallback callback;
1683 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541684 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551685 ClientSocketPool::RespectLimits::ENABLED,
1686 callback.callback(), pool_.get(), log.bound());
1687 EXPECT_THAT(rv, IsOk());
1688 handle.Reset();
1689 EXPECT_EQ(1, pool_->IdleSocketCount());
1690 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551691}
1692
xunjieli92feb332017-03-03 17:19:231693TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231694 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1695 TestCompletionCallback callback;
1696 BoundTestNetLog log;
1697 ClientSocketHandle handle1;
Paul Jensen8d6f87ec2018-01-13 00:46:541698 int rv = handle1.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231699 ClientSocketPool::RespectLimits::ENABLED,
1700 callback.callback(), pool_.get(), log.bound());
1701 EXPECT_THAT(rv, IsOk());
1702 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541703 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231704 ClientSocketPool::RespectLimits::ENABLED,
1705 callback.callback(), pool_.get(), log.bound());
1706 ClientSocketHandle handle3;
Paul Jensen8d6f87ec2018-01-13 00:46:541707 rv = handle3.Init("b", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231708 ClientSocketPool::RespectLimits::ENABLED,
1709 callback.callback(), pool_.get(), log.bound());
1710 EXPECT_THAT(rv, IsOk());
1711 handle1.Reset();
1712 handle2.Reset();
1713 handle3.Reset();
1714 EXPECT_EQ(3, pool_->IdleSocketCount());
1715 pool_->CloseIdleSocketsInGroup("a");
1716 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231717}
1718
xunjieli26619e72016-11-23 19:39:551719TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551720 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1721 ClientSocketHandle handle;
1722 TestCompletionCallback callback;
1723 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541724 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551725 ClientSocketPool::RespectLimits::ENABLED,
1726 callback.callback(), pool_.get(), log.bound());
1727 EXPECT_THAT(rv, IsOk());
1728 StreamSocket* socket = handle.socket();
1729 handle.Reset();
1730 EXPECT_EQ(1, pool_->IdleSocketCount());
1731
1732 // Disconnect socket now to make the socket unusable.
1733 socket->Disconnect();
1734 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541735 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551736 ClientSocketPool::RespectLimits::ENABLED,
1737 callback.callback(), pool_.get(), log.bound());
1738 EXPECT_THAT(rv, IsOk());
1739 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551740}
1741
[email protected]2b7523d2009-07-29 20:29:231742// Regression test for http://crbug.com/17985.
1743TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1744 const int kMaxSockets = 3;
1745 const int kMaxSocketsPerGroup = 2;
1746 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1747
[email protected]ac790b42009-12-02 04:31:311748 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231749
robpercival214763f2016-07-01 23:27:011750 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1751 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231752
1753 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011754 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231755
1756 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011757 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231758
1759 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011760 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1761 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231762
[email protected]eb5a99382010-07-11 03:18:261763 // Release the first two sockets from "a". Because this is a keepalive,
1764 // the first release will unblock the pending request for "a". The
1765 // second release will unblock a request for "c", becaue it is the next
1766 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131767 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1768 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231769
1770 // Closing idle sockets should not get us into trouble, but in the bug
1771 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411772 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541773 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261774
[email protected]2da659e2013-05-23 20:51:341775 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281776 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231777}
1778
[email protected]4d3b05d2010-01-27 21:27:291779TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531780 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571781
1782 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131783 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521784 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511785 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541786 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151787 ClientSocketPool::RespectLimits::ENABLED,
1788 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011789 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131790 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481791 TestLoadTimingInfoNotConnected(handle);
1792
robpercival214763f2016-07-01 23:27:011793 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131794 EXPECT_TRUE(handle.is_initialized());
1795 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481796 TestLoadTimingInfoConnectedNotReused(handle);
1797
[email protected]2431756e2010-09-29 20:26:131798 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481799 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301800
mmenke43758e62015-05-04 21:09:461801 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401802 log.GetEntries(&entries);
1803
1804 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001805 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171806 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001807 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1808 NetLogEventPhase::NONE));
1809 EXPECT_TRUE(LogContainsEvent(entries, 2,
1810 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1811 NetLogEventPhase::NONE));
1812 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571813}
1814
[email protected]4d3b05d2010-01-27 21:27:291815TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571816 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531817 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571818
1819 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131820 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521821 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511822 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181823 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131824 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431825 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451826 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131827 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151828 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541829 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151830 ClientSocketPool::RespectLimits::ENABLED,
1831 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131832 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011833 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131834 EXPECT_FALSE(handle.is_ssl_error());
1835 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301836
mmenke43758e62015-05-04 21:09:461837 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401838 log.GetEntries(&entries);
1839
1840 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001841 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171842 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001843 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1844 NetLogEventPhase::NONE));
1845 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571846}
1847
mmenke6be122f2015-03-09 22:22:471848// Check that an async ConnectJob failure does not result in creation of a new
1849// ConnectJob when there's another pending request also waiting on its own
1850// ConnectJob. See http://crbug.com/463960.
1851TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1852 CreatePool(2, 2);
1853 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1854
robpercival214763f2016-07-01 23:27:011855 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1856 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471857
robpercival214763f2016-07-01 23:27:011858 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1859 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471860
1861 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1862}
1863
[email protected]4d3b05d2010-01-27 21:27:291864TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101865 // TODO(eroman): Add back the log expectations! Removed them because the
1866 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531867 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571868
1869 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131870 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521871 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131872 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521873 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571874
[email protected]2431756e2010-09-29 20:26:131875 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541876 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151877 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201878 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511879 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201880 EXPECT_EQ(
1881 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541882 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201883 ClientSocketPool::RespectLimits::ENABLED,
1884 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571885
[email protected]2431756e2010-09-29 20:26:131886 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571887
[email protected]fd7b7c92009-08-20 19:38:301888
1889 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301890
robpercival214763f2016-07-01 23:27:011891 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131892 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301893
1894 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531895 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571896}
1897
[email protected]4d3b05d2010-01-27 21:27:291898TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341899 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1900
[email protected]17a0c6c2009-08-04 00:07:041901 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1902
robpercival214763f2016-07-01 23:27:011903 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1904 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1905 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1906 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341907
1908 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131909 (*requests())[2]->handle()->Reset();
1910 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341911 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1912
[email protected]2431756e2010-09-29 20:26:131913 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341914 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1915
[email protected]2431756e2010-09-29 20:26:131916 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261917 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341918}
1919
[email protected]5fc08e32009-07-15 17:09:571920// When requests and ConnectJobs are not coupled, the request will get serviced
1921// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291922TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531923 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571924
1925 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321926 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571927
[email protected]2431756e2010-09-29 20:26:131928 std::vector<TestSocketRequest*> request_order;
1929 size_t completion_count; // unused
1930 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541931 int rv =
1932 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1933 ClientSocketPool::RespectLimits::ENABLED,
1934 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011935 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1936 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571937
1938 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1939 // without a job.
1940 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1941
[email protected]2431756e2010-09-29 20:26:131942 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541943 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151944 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201945 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011946 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131947 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541948 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151949 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201950 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011951 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571952
1953 // Both Requests 2 and 3 are pending. We release socket 1 which should
1954 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331955 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341956 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281957 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331958 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011959 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331960 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571961
1962 // Signal job 2, which should service request 3.
1963
1964 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011965 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571966
[email protected]2431756e2010-09-29 20:26:131967 ASSERT_EQ(3U, request_order.size());
1968 EXPECT_EQ(&req1, request_order[0]);
1969 EXPECT_EQ(&req2, request_order[1]);
1970 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571971 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1972}
1973
1974// The requests are not coupled to the jobs. So, the requests should finish in
1975// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:291976TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531977 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571978 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:321979 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:571980
[email protected]2431756e2010-09-29 20:26:131981 std::vector<TestSocketRequest*> request_order;
1982 size_t completion_count; // unused
1983 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541984 int rv =
1985 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1986 ClientSocketPool::RespectLimits::ENABLED,
1987 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011988 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571989
[email protected]2431756e2010-09-29 20:26:131990 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541991 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151992 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201993 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011994 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571995
1996 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:321997 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:571998
[email protected]2431756e2010-09-29 20:26:131999 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:542000 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152001 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202002 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012003 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572004
robpercival214763f2016-07-01 23:27:012005 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2006 EXPECT_THAT(req2.WaitForResult(), IsOk());
2007 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:572008
[email protected]2431756e2010-09-29 20:26:132009 ASSERT_EQ(3U, request_order.size());
2010 EXPECT_EQ(&req1, request_order[0]);
2011 EXPECT_EQ(&req2, request_order[1]);
2012 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:572013}
2014
[email protected]03b7c8c2013-07-20 04:38:552015// Test GetLoadState in the case there's only one socket request.
2016TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:532017 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:552018 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:572019
[email protected]2431756e2010-09-29 20:26:132020 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522021 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542022 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152023 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202024 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012025 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552026 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572027
[email protected]03b7c8c2013-07-20 04:38:552028 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2029 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2030
2031 // No point in completing the connection, since ClientSocketHandles only
2032 // expect the LoadState to be checked while connecting.
2033}
2034
2035// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:002036// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:552037TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
2038 CreatePool(2, 2);
2039 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2040
2041 ClientSocketHandle handle;
2042 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542043 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152044 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202045 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012046 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002047 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2048
2049 ClientSocketHandle handle2;
2050 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542051 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152052 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202053 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012054 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002055 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2056
2057 // Check that both handles report the state of the first job.
2058 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2059 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2060
2061 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2062
2063 // Check that both handles change to LOAD_STATE_CONNECTING.
2064 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2065 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2066}
2067
2068// Test that the second connection request does not affect the pool's load
2069// status.
2070TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
2071 CreatePool(2, 2);
2072 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2073
2074 ClientSocketHandle handle;
2075 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542076 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152077 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202078 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012079 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:572080
[email protected]2431756e2010-09-29 20:26:132081 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522082 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542083 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152084 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202085 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012086 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002087 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552088
[email protected]03b7c8c2013-07-20 04:38:552089 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2090 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2091
haavardm835c1d62015-04-22 08:18:002092 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552093 // second handle switches to the state of the remaining ConnectJob.
2094 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012095 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002096 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552097}
2098
2099// Test GetLoadState in the case the per-group limit is reached.
2100TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2101 CreatePool(2, 1);
2102 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2103
2104 ClientSocketHandle handle;
2105 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542106 int rv = handle.Init("a", params_, MEDIUM, SocketTag(),
mmenked3641e12016-01-28 16:06:152107 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202108 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012109 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552110 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2111
2112 // Request another socket from the same pool, buth with a higher priority.
2113 // The first request should now be stalled at the socket group limit.
2114 ClientSocketHandle handle2;
2115 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542116 rv = handle2.Init("a", params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152117 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202118 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012119 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552120 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2121 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2122
2123 // The first handle should remain stalled as the other socket goes through
2124 // the connect process.
2125
2126 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2127 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2128 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2129
2130 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012131 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552132 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2133
2134 // Closing the second socket should cause the stalled handle to finally get a
2135 // ConnectJob.
2136 handle2.socket()->Disconnect();
2137 handle2.Reset();
2138 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2139}
2140
2141// Test GetLoadState in the case the per-pool limit is reached.
2142TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2143 CreatePool(2, 2);
2144 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2145
2146 ClientSocketHandle handle;
2147 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542148 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152149 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202150 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012151 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552152
2153 // Request for socket from another pool.
2154 ClientSocketHandle handle2;
2155 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542156 rv = handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152157 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202158 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012159 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552160
2161 // Request another socket from the first pool. Request should stall at the
2162 // socket pool limit.
2163 ClientSocketHandle handle3;
2164 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542165 rv = handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152166 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202167 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012168 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552169
2170 // The third handle should remain stalled as the other sockets in its group
2171 // goes through the connect process.
2172
2173 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2174 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2175
2176 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2177 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2178 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2179
2180 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012181 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552182 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2183
2184 // Closing a socket should allow the stalled handle to finally get a new
2185 // ConnectJob.
2186 handle.socket()->Disconnect();
2187 handle.Reset();
2188 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572189}
2190
[email protected]e772db3f2010-07-12 18:11:132191TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2192 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2193 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2194
[email protected]2431756e2010-09-29 20:26:132195 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522196 TestCompletionCallback callback;
2197 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
Paul Jensen8d6f87ec2018-01-13 00:46:542198 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152199 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202200 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132201 EXPECT_TRUE(handle.is_initialized());
2202 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132203}
2204
2205TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2206 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2207
2208 connect_job_factory_->set_job_type(
2209 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132210 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522211 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132212 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542213 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152214 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202215 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132216 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012217 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132218 EXPECT_TRUE(handle.is_initialized());
2219 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132220}
2221
[email protected]e60e47a2010-07-14 03:37:182222TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2223 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2224 connect_job_factory_->set_job_type(
2225 TestConnectJob::kMockAdditionalErrorStateJob);
2226
[email protected]2431756e2010-09-29 20:26:132227 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522228 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132229 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:542230 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152231 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202232 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132233 EXPECT_FALSE(handle.is_initialized());
2234 EXPECT_FALSE(handle.socket());
2235 EXPECT_TRUE(handle.is_ssl_error());
2236 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182237}
2238
2239TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2240 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2241
2242 connect_job_factory_->set_job_type(
2243 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132244 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522245 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132246 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542247 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152248 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202249 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132250 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012251 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132252 EXPECT_FALSE(handle.is_initialized());
2253 EXPECT_FALSE(handle.socket());
2254 EXPECT_TRUE(handle.is_ssl_error());
2255 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182256}
2257
martijn003cd612016-05-19 22:24:382258// Make sure we can reuse sockets.
2259TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412260 CreatePoolWithIdleTimeouts(
2261 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032262 base::TimeDelta(), // Time out unused sockets immediately.
2263 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2264
2265 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2266
2267 ClientSocketHandle handle;
2268 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542269 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152270 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202271 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012272 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032273 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012274 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032275
2276 // Use and release the socket.
Bence Békybdbb0e72018-08-07 21:42:592277 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382278 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482279 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032280 handle.Reset();
2281
2282 // Should now have one idle socket.
2283 ASSERT_EQ(1, pool_->IdleSocketCount());
2284
2285 // Request a new socket. This should reuse the old socket and complete
2286 // synchronously.
vishal.b62985ca92015-04-17 08:45:512287 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:542288 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152289 ClientSocketPool::RespectLimits::ENABLED,
Bence Békybdbb0e72018-08-07 21:42:592290 CompletionOnceCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012291 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032292 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482293 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032294
2295 ASSERT_TRUE(pool_->HasGroup("a"));
2296 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2297 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2298
mmenke43758e62015-05-04 21:09:462299 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032300 log.GetEntries(&entries);
2301 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002302 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032303}
2304
martijn003cd612016-05-19 22:24:382305// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172306TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032307 CreatePoolWithIdleTimeouts(
2308 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2309 base::TimeDelta(), // Time out unused sockets immediately
2310 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412311
2312 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2313
2314 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2315
2316 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522317 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542318 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152319 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202320 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012321 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412322 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2323
2324 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522325 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542326 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152327 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202328 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012329 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412330 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2331
2332 // Cancel one of the requests. Wait for the other, which will get the first
2333 // job. Release the socket. Run the loop again to make sure the second
2334 // socket is sitting idle and the first one is released (since ReleaseSocket()
2335 // just posts a DoReleaseSocket() task).
2336
2337 handle.Reset();
robpercival214763f2016-07-01 23:27:012338 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412339 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:592340 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382341 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412342 handle2.Reset();
2343
[email protected]e7b1c6d2c2012-05-05 00:54:032344 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2345 // actually become pending until 2ms after they have been created. In order
2346 // to flush all tasks, we need to wait so that we know there are no
2347 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452348 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412349
[email protected]e7b1c6d2c2012-05-05 00:54:032350 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412351 ASSERT_EQ(2, pool_->IdleSocketCount());
2352
2353 // Request a new socket. This should cleanup the unused and timed out ones.
2354 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512355 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522356 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542357 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152358 ClientSocketPool::RespectLimits::ENABLED,
2359 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012360 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2361 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412362 EXPECT_FALSE(handle.is_reused());
2363
[email protected]e7b1c6d2c2012-05-05 00:54:032364 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412365 ASSERT_TRUE(pool_->HasGroup("a"));
2366 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2367 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2368
mmenke43758e62015-05-04 21:09:462369 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412370 log.GetEntries(&entries);
2371 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002372 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412373}
2374
[email protected]2041cf342010-02-19 03:15:592375// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162376// because of multiple releasing disconnected sockets.
2377TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2378 CreatePoolWithIdleTimeouts(
2379 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2380 base::TimeDelta(), // Time out unused sockets immediately.
2381 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2382
2383 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2384
2385 // Startup 4 connect jobs. Two of them will be pending.
2386
[email protected]2431756e2010-09-29 20:26:132387 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522388 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542389 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152390 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202391 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012392 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162393
[email protected]2431756e2010-09-29 20:26:132394 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522395 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542396 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152397 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202398 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012399 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162400
[email protected]2431756e2010-09-29 20:26:132401 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522402 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542403 rv = handle3.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152404 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202405 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012406 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162407
[email protected]2431756e2010-09-29 20:26:132408 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522409 TestCompletionCallback callback4;
Paul Jensen8d6f87ec2018-01-13 00:46:542410 rv = handle4.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152411 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202412 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012413 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162414
2415 // Release two disconnected sockets.
2416
[email protected]2431756e2010-09-29 20:26:132417 handle.socket()->Disconnect();
2418 handle.Reset();
2419 handle2.socket()->Disconnect();
2420 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162421
robpercival214763f2016-07-01 23:27:012422 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132423 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012424 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132425 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162426}
2427
[email protected]d7027bb2010-05-10 18:58:542428// Regression test for http://crbug.com/42267.
2429// When DoReleaseSocket() is processed for one socket, it is blocked because the
2430// other stalled groups all have releasing sockets, so no progress can be made.
2431TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2432 CreatePoolWithIdleTimeouts(
2433 4 /* socket limit */, 4 /* socket limit per group */,
2434 base::TimeDelta(), // Time out unused sockets immediately.
2435 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2436
2437 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2438
2439 // Max out the socket limit with 2 per group.
2440
[email protected]2431756e2010-09-29 20:26:132441 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522442 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132443 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522444 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542445
2446 for (int i = 0; i < 2; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:542447 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152448 ClientSocketPool::RespectLimits::ENABLED,
2449 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202450 NetLogWithSource()));
Paul Jensen8d6f87ec2018-01-13 00:46:542451 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152452 ClientSocketPool::RespectLimits::ENABLED,
2453 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202454 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542455 }
[email protected]b89f7e42010-05-20 20:37:002456
[email protected]d7027bb2010-05-10 18:58:542457 // Make 4 pending requests, 2 per group.
2458
2459 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202460 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542461 handle_a[i].Init("a", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202462 ClientSocketPool::RespectLimits::ENABLED,
2463 callback_a[i].callback(), pool_.get(),
2464 NetLogWithSource()));
2465 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542466 handle_b[i].Init("b", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202467 ClientSocketPool::RespectLimits::ENABLED,
2468 callback_b[i].callback(), pool_.get(),
2469 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542470 }
2471
2472 // Release b's socket first. The order is important, because in
2473 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2474 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2475 // first, which has a releasing socket, so it refuses to start up another
2476 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132477 handle_b[0].socket()->Disconnect();
2478 handle_b[0].Reset();
2479 handle_a[0].socket()->Disconnect();
2480 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542481
2482 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282483 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542484
[email protected]2431756e2010-09-29 20:26:132485 handle_b[1].socket()->Disconnect();
2486 handle_b[1].Reset();
2487 handle_a[1].socket()->Disconnect();
2488 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542489
2490 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012491 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2492 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542493 }
2494}
2495
[email protected]fd4fe0b2010-02-08 23:02:152496TEST_F(ClientSocketPoolBaseTest,
2497 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2498 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2499
2500 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2501
robpercival214763f2016-07-01 23:27:012502 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2503 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2504 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2505 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152506
robpercival214763f2016-07-01 23:27:012507 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2508 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132509 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152510
2511 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132512 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012513 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152514
[email protected]2431756e2010-09-29 20:26:132515 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012516 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132517 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152518
2519 EXPECT_EQ(1, GetOrderOfRequest(1));
2520 EXPECT_EQ(2, GetOrderOfRequest(2));
2521 EXPECT_EQ(3, GetOrderOfRequest(3));
2522 EXPECT_EQ(4, GetOrderOfRequest(4));
2523
2524 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132525 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152526}
2527
[email protected]6ecf2b92011-12-15 01:14:522528class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042529 public:
[email protected]2431756e2010-09-29 20:26:132530 TestReleasingSocketRequest(TestClientSocketPool* pool,
2531 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182532 bool reset_releasing_handle)
2533 : pool_(pool),
2534 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042535 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522536
Chris Watkins7a41d3552017-12-01 02:13:272537 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042538
2539 ClientSocketHandle* handle() { return &handle_; }
2540
Bence Béky8ddc2492018-06-13 01:02:042541 CompletionOnceCallback callback() {
2542 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2543 base::Unretained(this));
2544 }
[email protected]4f1e4982010-03-02 18:31:042545
2546 private:
[email protected]6ecf2b92011-12-15 01:14:522547 void OnComplete(int result) {
2548 SetResult(result);
2549 if (reset_releasing_handle_)
2550 handle_.Reset();
2551
mmenked3641e12016-01-28 16:06:152552 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
Bence Béky8ddc2492018-06-13 01:02:042553 EXPECT_EQ(
2554 expected_result_,
2555 handle2_.Init("a", con_params, DEFAULT_PRIORITY, SocketTag(),
2556 ClientSocketPool::RespectLimits::ENABLED,
2557 CompletionOnceCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522558 }
2559
[email protected]2431756e2010-09-29 20:26:132560 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182561 int expected_result_;
2562 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042563 ClientSocketHandle handle_;
2564 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042565};
2566
[email protected]e60e47a2010-07-14 03:37:182567
2568TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2569 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2570
robpercival214763f2016-07-01 23:27:012571 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2572 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2573 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182574
[email protected]2431756e2010-09-29 20:26:132575 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182576 client_socket_factory_.allocation_count());
2577
2578 connect_job_factory_->set_job_type(
2579 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2580 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202581 EXPECT_EQ(
2582 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542583 req.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202584 ClientSocketPool::RespectLimits::ENABLED,
2585 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182586 // The next job should complete synchronously
2587 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2588
robpercival214763f2016-07-01 23:27:012589 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182590 EXPECT_FALSE(req.handle()->is_initialized());
2591 EXPECT_FALSE(req.handle()->socket());
2592 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432593 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182594}
2595
[email protected]b6501d3d2010-06-03 23:53:342596// http://crbug.com/44724 regression test.
2597// We start releasing the pool when we flush on network change. When that
2598// happens, the only active references are in the ClientSocketHandles. When a
2599// ConnectJob completes and calls back into the last ClientSocketHandle, that
2600// callback can release the last reference and delete the pool. After the
2601// callback finishes, we go back to the stack frame within the now-deleted pool.
2602// Executing any code that refers to members of the now-deleted pool can cause
2603// crashes.
2604TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2605 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2606 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2607
2608 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522609 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152610 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542611 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152612 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202613 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342614
[email protected]7af985a2012-12-14 22:40:422615 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342616
2617 // We'll call back into this now.
2618 callback.WaitForResult();
2619}
2620
[email protected]a7e38572010-06-07 18:22:242621TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2622 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2623 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2624
2625 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522626 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152627 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542628 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152629 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202630 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012631 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242632 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2633
[email protected]7af985a2012-12-14 22:40:422634 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242635
2636 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282637 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242638
mmenked3641e12016-01-28 16:06:152639 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542640 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152641 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202642 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012643 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242644 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2645}
2646
[email protected]6ecf2b92011-12-15 01:14:522647class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142648 public:
Bence Béky8ddc2492018-06-13 01:02:042649 ConnectWithinCallback(const std::string& group_name,
2650 const scoped_refptr<TestSocketParams>& params,
2651 TestClientSocketPool* pool)
2652 : group_name_(group_name), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142653
Chris Watkins7a41d3552017-12-01 02:13:272654 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142655
2656 int WaitForNestedResult() {
2657 return nested_callback_.WaitForResult();
2658 }
2659
Bence Béky8ddc2492018-06-13 01:02:042660 CompletionOnceCallback callback() {
2661 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2662 base::Unretained(this));
2663 }
[email protected]6ecf2b92011-12-15 01:14:522664
[email protected]06f92462010-08-31 19:24:142665 private:
[email protected]6ecf2b92011-12-15 01:14:522666 void OnComplete(int result) {
2667 SetResult(result);
tfarina428341112016-09-22 13:38:202668 EXPECT_EQ(
2669 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542670 handle_.Init(group_name_, params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202671 ClientSocketPool::RespectLimits::ENABLED,
2672 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522673 }
2674
[email protected]06f92462010-08-31 19:24:142675 const std::string group_name_;
2676 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132677 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142678 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522679 TestCompletionCallback nested_callback_;
2680
2681 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142682};
2683
2684TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2685 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2686
2687 // First job will be waiting until it gets aborted.
2688 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2689
2690 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132691 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152692 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542693 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152694 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202695 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142696
2697 // Second job will be started during the first callback, and will
2698 // asynchronously complete with OK.
2699 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422700 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012701 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2702 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142703}
2704
Matt Menke141b87f22019-01-30 02:43:032705TEST_F(ClientSocketPoolBaseTest, BackupSocketWaitsForHostResolution) {
2706 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2707 pool_->EnableConnectBackupJobs();
2708
2709 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2710 ClientSocketHandle handle;
2711 TestCompletionCallback callback;
2712 EXPECT_EQ(ERR_IO_PENDING,
2713 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
2714 ClientSocketPool::RespectLimits::ENABLED,
2715 callback.callback(), pool_.get(), NetLogWithSource()));
2716 // The backup timer fires but doesn't start a new ConnectJob while resolving
2717 // the hostname.
2718 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2719 FastForwardBy(base::TimeDelta::FromMilliseconds(
2720 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2721 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2722
2723 // Once the ConnectJob has finished resolving the hostname, the backup timer
2724 // will create a ConnectJob when it fires.
2725 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2726 FastForwardBy(base::TimeDelta::FromMilliseconds(
2727 ClientSocketPool::kMaxConnectRetryIntervalMs));
2728 EXPECT_EQ(2, client_socket_factory_.allocation_count());
2729}
2730
2731// Test that no backup socket is created when a ConnectJob connects before it
2732// completes.
2733TEST_F(ClientSocketPoolBaseTest, NoBackupSocketWhenConnected) {
2734 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2735 pool_->EnableConnectBackupJobs();
2736
2737 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2738 ClientSocketHandle handle;
2739 TestCompletionCallback callback;
2740 EXPECT_EQ(ERR_IO_PENDING,
2741 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
2742 ClientSocketPool::RespectLimits::ENABLED,
2743 callback.callback(), pool_.get(), NetLogWithSource()));
2744 // The backup timer fires but doesn't start a new ConnectJob while resolving
2745 // the hostname.
2746 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
2747 FastForwardBy(base::TimeDelta::FromMilliseconds(
2748 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2749 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2750
2751 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2752 client_socket_factory_.SetJobHasEstablishedConnection(0);
2753 FastForwardBy(base::TimeDelta::FromMilliseconds(
2754 ClientSocketPool::kMaxConnectRetryIntervalMs * 100));
2755 EXPECT_EQ(1, client_socket_factory_.allocation_count());
2756}
2757
[email protected]25eea382010-07-10 23:55:262758// Cancel a pending socket request while we're at max sockets,
2759// and verify that the backup socket firing doesn't cause a crash.
2760TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2761 // Max 4 sockets globally, max 4 sockets per group.
2762 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222763 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262764
[email protected]4baaf9d2010-08-31 15:15:442765 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2766 // timer.
[email protected]25eea382010-07-10 23:55:262767 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2768 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522769 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152770 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542771 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152772 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202773 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262774
2775 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2776 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2777 ClientSocketHandle handles[kDefaultMaxSockets];
2778 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522779 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542780 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202781 ClientSocketPool::RespectLimits::ENABLED,
2782 callback.callback(), pool_.get(),
2783 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262784 }
2785
fdoray5eeb7642016-06-22 16:11:282786 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262787
2788 // Cancel the pending request.
2789 handle.Reset();
2790
2791 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452792 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002793 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262794
[email protected]25eea382010-07-10 23:55:262795 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2796}
2797
[email protected]3f00be82010-09-27 19:50:022798TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442799 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2800 pool_->EnableConnectBackupJobs();
2801
2802 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2803 // timer.
2804 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2805 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522806 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152807 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542808 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152809 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202810 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442811 ASSERT_TRUE(pool_->HasGroup("bar"));
2812 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
Lily Chenecebf932018-11-02 17:15:432813 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102814 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442815
2816 // Cancel the socket request. This should cancel the backup timer. Wait for
2817 // the backup time to see if it indeed got canceled.
2818 handle.Reset();
2819 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452820 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002821 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]4baaf9d2010-08-31 15:15:442822 ASSERT_TRUE(pool_->HasGroup("bar"));
2823 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2824}
2825
[email protected]3f00be82010-09-27 19:50:022826TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2827 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2828 pool_->EnableConnectBackupJobs();
2829
2830 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2831 // timer.
2832 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2833 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522834 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152835 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542836 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152837 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202838 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022839 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2840 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522841 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202842 EXPECT_EQ(
2843 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542844 handle2.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202845 ClientSocketPool::RespectLimits::ENABLED,
2846 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022847 ASSERT_TRUE(pool_->HasGroup("bar"));
2848 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2849
2850 // Cancel request 1 and then complete request 2. With the requests finished,
2851 // the backup timer should be cancelled.
2852 handle.Reset();
robpercival214763f2016-07-01 23:27:012853 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022854 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452855 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002856 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:022857}
2858
[email protected]eb5a99382010-07-11 03:18:262859// Test delayed socket binding for the case where we have two connects,
2860// and while one is waiting on a connect, the other frees up.
2861// The socket waiting on a connect should switch immediately to the freed
2862// up socket.
2863TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2864 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2865 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2866
2867 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522868 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132869 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542870 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152871 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202872 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012873 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262874
2875 // No idle sockets, no pending jobs.
2876 EXPECT_EQ(0, pool_->IdleSocketCount());
2877 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2878
2879 // Create a second socket to the same host, but this one will wait.
2880 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2881 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132882 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542883 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152884 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202885 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262886 // No idle sockets, and one connecting job.
2887 EXPECT_EQ(0, pool_->IdleSocketCount());
2888 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2889
2890 // Return the first handle to the pool. This will initiate the delayed
2891 // binding.
2892 handle1.Reset();
2893
fdoray5eeb7642016-06-22 16:11:282894 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262895
2896 // Still no idle sockets, still one pending connect job.
2897 EXPECT_EQ(0, pool_->IdleSocketCount());
2898 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2899
2900 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012901 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262902
2903 // And we can see there is still one job waiting.
2904 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2905
2906 // Finally, signal the waiting Connect.
2907 client_socket_factory_.SignalJobs();
2908 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2909
fdoray5eeb7642016-06-22 16:11:282910 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262911}
2912
2913// Test delayed socket binding when a group is at capacity and one
2914// of the group's sockets frees up.
2915TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2916 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2917 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2918
2919 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522920 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132921 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542922 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152923 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202924 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012925 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262926
2927 // No idle sockets, no pending jobs.
2928 EXPECT_EQ(0, pool_->IdleSocketCount());
2929 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2930
2931 // Create a second socket to the same host, but this one will wait.
2932 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2933 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132934 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542935 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152936 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202937 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262938 // No idle sockets, and one connecting job.
2939 EXPECT_EQ(0, pool_->IdleSocketCount());
2940 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2941
2942 // Return the first handle to the pool. This will initiate the delayed
2943 // binding.
2944 handle1.Reset();
2945
fdoray5eeb7642016-06-22 16:11:282946 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262947
2948 // Still no idle sockets, still one pending connect job.
2949 EXPECT_EQ(0, pool_->IdleSocketCount());
2950 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2951
2952 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012953 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262954
2955 // And we can see there is still one job waiting.
2956 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2957
2958 // Finally, signal the waiting Connect.
2959 client_socket_factory_.SignalJobs();
2960 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2961
fdoray5eeb7642016-06-22 16:11:282962 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262963}
2964
2965// Test out the case where we have one socket connected, one
2966// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512967// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262968// should complete, by taking the first socket's idle socket.
2969TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2970 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2971 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2972
2973 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522974 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132975 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542976 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152977 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202978 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012979 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262980
2981 // No idle sockets, no pending jobs.
2982 EXPECT_EQ(0, pool_->IdleSocketCount());
2983 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2984
2985 // Create a second socket to the same host, but this one will wait.
2986 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2987 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132988 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542989 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152990 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202991 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262992 // No idle sockets, and one connecting job.
2993 EXPECT_EQ(0, pool_->IdleSocketCount());
2994 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2995
2996 // Return the first handle to the pool. This will initiate the delayed
2997 // binding.
2998 handle1.Reset();
2999
fdoray5eeb7642016-06-22 16:11:283000 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263001
3002 // Still no idle sockets, still one pending connect job.
3003 EXPECT_EQ(0, pool_->IdleSocketCount());
3004 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3005
3006 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:013007 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:263008
3009 // And we can see there is still one job waiting.
3010 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3011
3012 // Finally, signal the waiting Connect.
3013 client_socket_factory_.SignalJobs();
3014 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3015
fdoray5eeb7642016-06-22 16:11:283016 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:263017}
3018
[email protected]2abfe90a2010-08-25 17:49:513019// Cover the case where on an available socket slot, we have one pending
3020// request that completes synchronously, thereby making the Group empty.
3021TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
3022 const int kUnlimitedSockets = 100;
3023 const int kOneSocketPerGroup = 1;
3024 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
3025
3026 // Make the first request asynchronous fail.
3027 // This will free up a socket slot later.
3028 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
3029
3030 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523031 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203032 EXPECT_EQ(
3033 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543034 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203035 ClientSocketPool::RespectLimits::ENABLED,
3036 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513037 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3038
3039 // Make the second request synchronously fail. This should make the Group
3040 // empty.
3041 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3042 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523043 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:513044 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
3045 // when created.
tfarina428341112016-09-22 13:38:203046 EXPECT_EQ(
3047 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543048 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203049 ClientSocketPool::RespectLimits::ENABLED,
3050 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:513051
3052 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3053
robpercival214763f2016-07-01 23:27:013054 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
3055 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:513056 EXPECT_FALSE(pool_->HasGroup("a"));
3057}
3058
[email protected]e1b54dc2010-10-06 21:27:223059TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
3060 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3061
3062 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3063
3064 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523065 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203066 EXPECT_EQ(
3067 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543068 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203069 ClientSocketPool::RespectLimits::ENABLED,
3070 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223071
3072 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523073 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203074 EXPECT_EQ(
3075 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543076 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203077 ClientSocketPool::RespectLimits::ENABLED,
3078 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223079 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523080 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203081 EXPECT_EQ(
3082 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543083 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203084 ClientSocketPool::RespectLimits::ENABLED,
3085 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223086
robpercival214763f2016-07-01 23:27:013087 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3088 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3089 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:223090
3091 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:593092 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383093 TRAFFIC_ANNOTATION_FOR_TESTS));
Bence Békybdbb0e72018-08-07 21:42:593094 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:383095 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:223096
3097 handle1.Reset();
3098 handle2.Reset();
3099 handle3.Reset();
3100
tfarina428341112016-09-22 13:38:203101 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543102 OK, handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203103 ClientSocketPool::RespectLimits::ENABLED,
3104 callback1.callback(), pool_.get(), NetLogWithSource()));
3105 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543106 OK, handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203107 ClientSocketPool::RespectLimits::ENABLED,
3108 callback2.callback(), pool_.get(), NetLogWithSource()));
3109 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543110 OK, handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203111 ClientSocketPool::RespectLimits::ENABLED,
3112 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223113
3114 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3115 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3116 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3117}
3118
[email protected]2c2bef152010-10-13 00:55:033119TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3120 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3121 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3122
Charlie Harrison55ce6082018-05-14 02:25:573123 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033124
3125 ASSERT_TRUE(pool_->HasGroup("a"));
3126 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433127 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103128 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033129 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3130
3131 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523132 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203133 EXPECT_EQ(
3134 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543135 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203136 ClientSocketPool::RespectLimits::ENABLED,
3137 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033138
3139 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523140 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203141 EXPECT_EQ(
3142 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543143 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203144 ClientSocketPool::RespectLimits::ENABLED,
3145 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033146
3147 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433148 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103149 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033150 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3151
robpercival214763f2016-07-01 23:27:013152 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3153 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033154 handle1.Reset();
3155 handle2.Reset();
3156
3157 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433158 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103159 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033160 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3161}
3162
3163TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3164 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3165 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3166
3167 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523168 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203169 EXPECT_EQ(
3170 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543171 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203172 ClientSocketPool::RespectLimits::ENABLED,
3173 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033174
3175 ASSERT_TRUE(pool_->HasGroup("a"));
3176 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433177 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103178 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033179 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3180
Charlie Harrison55ce6082018-05-14 02:25:573181 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033182
3183 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433184 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103185 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033186 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3187
3188 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523189 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203190 EXPECT_EQ(
3191 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543192 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203193 ClientSocketPool::RespectLimits::ENABLED,
3194 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033195
3196 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433197 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103198 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033199 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3200
robpercival214763f2016-07-01 23:27:013201 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3202 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033203 handle1.Reset();
3204 handle2.Reset();
3205
3206 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433207 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103208 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033209 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3210}
3211
3212TEST_F(ClientSocketPoolBaseTest,
3213 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3214 CreatePool(4, 4);
3215 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3216
3217 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523218 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203219 EXPECT_EQ(
3220 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543221 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203222 ClientSocketPool::RespectLimits::ENABLED,
3223 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033224
3225 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523226 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203227 EXPECT_EQ(
3228 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543229 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203230 ClientSocketPool::RespectLimits::ENABLED,
3231 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033232
3233 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523234 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203235 EXPECT_EQ(
3236 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543237 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203238 ClientSocketPool::RespectLimits::ENABLED,
3239 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033240
3241 ASSERT_TRUE(pool_->HasGroup("a"));
3242 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433243 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103244 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033245 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3246
Charlie Harrison55ce6082018-05-14 02:25:573247 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033248
3249 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433250 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103251 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033252 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3253
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]2c2bef152010-10-13 00:55:033257 handle1.Reset();
3258 handle2.Reset();
3259 handle3.Reset();
3260
3261 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433262 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103263 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033264 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3265}
3266
3267TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3268 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3269 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3270
3271 ASSERT_FALSE(pool_->HasGroup("a"));
3272
Charlie Harrison55ce6082018-05-14 02:25:573273 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033274
3275 ASSERT_TRUE(pool_->HasGroup("a"));
3276 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433277 EXPECT_EQ(kDefaultMaxSockets, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103278 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033279
3280 ASSERT_FALSE(pool_->HasGroup("b"));
3281
Charlie Harrison55ce6082018-05-14 02:25:573282 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033283
3284 ASSERT_FALSE(pool_->HasGroup("b"));
3285}
3286
3287TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3288 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3289 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3290
3291 ASSERT_FALSE(pool_->HasGroup("a"));
3292
3293 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573294 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033295
3296 ASSERT_TRUE(pool_->HasGroup("a"));
3297 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103298 EXPECT_EQ(kDefaultMaxSockets - 1,
Lily Chenecebf932018-11-02 17:15:433299 pool_->NumNeverAssignedConnectJobsInGroup("a"));
3300 EXPECT_EQ(kDefaultMaxSockets - 1,
[email protected]8159a1c2012-06-07 00:00:103301 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483302 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033303
3304 ASSERT_FALSE(pool_->HasGroup("b"));
3305
Charlie Harrison55ce6082018-05-14 02:25:573306 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033307
3308 ASSERT_TRUE(pool_->HasGroup("b"));
3309 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483310 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033311}
3312
3313TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3314 CreatePool(4, 4);
3315 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3316
3317 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523318 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203319 EXPECT_EQ(
3320 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543321 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203322 ClientSocketPool::RespectLimits::ENABLED,
3323 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013324 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033325 handle1.Reset();
3326
3327 ASSERT_TRUE(pool_->HasGroup("a"));
3328 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433329 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103330 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033331 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3332
Charlie Harrison55ce6082018-05-14 02:25:573333 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033334
3335 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433336 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103337 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033338 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3339}
3340
3341TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3342 CreatePool(4, 4);
3343 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3344
3345 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523346 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203347 EXPECT_EQ(
3348 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543349 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203350 ClientSocketPool::RespectLimits::ENABLED,
3351 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013352 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033353
3354 ASSERT_TRUE(pool_->HasGroup("a"));
3355 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433356 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103357 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033358 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3359 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3360
Charlie Harrison55ce6082018-05-14 02:25:573361 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033362
3363 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433364 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103365 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033366 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3367 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3368}
3369
3370TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3371 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3372 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3373
3374 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573375 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033376
3377 ASSERT_TRUE(pool_->HasGroup("a"));
3378 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433379 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103380 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033381 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3382
3383 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573384 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033385
3386 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433387 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103388 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033389 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3390}
3391
[email protected]3c819f522010-12-02 02:03:123392TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3393 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3394 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3395
3396 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573397 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123398
3399 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523400
3401 connect_job_factory_->set_job_type(
3402 TestConnectJob::kMockAdditionalErrorStateJob);
3403 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573404 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523405
3406 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123407}
3408
[email protected]8159a1c2012-06-07 00:00:103409TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033410 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433411 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033412
Charlie Harrison55ce6082018-05-14 02:25:573413 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033414
3415 ASSERT_TRUE(pool_->HasGroup("a"));
3416 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433417 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103418 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433419 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033420 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3421
Charlie Harrison55ce6082018-05-14 02:25:573422 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033423 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433424 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103425 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433426 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033427 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3428
3429 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523430 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203431 EXPECT_EQ(
3432 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543433 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203434 ClientSocketPool::RespectLimits::ENABLED,
3435 callback1.callback(), pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433436
3437 client_socket_factory_.SignalJob(0);
3438 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3439
3440 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3441 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3442 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3443 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3444 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033445
3446 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523447 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433448 EXPECT_EQ(
3449 ERR_IO_PENDING,
3450 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3451 ClientSocketPool::RespectLimits::ENABLED,
3452 callback2.callback(), pool_.get(), NetLogWithSource()));
3453 client_socket_factory_.SignalJob(0);
3454 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033455
[email protected]8159a1c2012-06-07 00:00:103456 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433457 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103458 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3459 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3460 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3461
[email protected]2c2bef152010-10-13 00:55:033462 handle1.Reset();
3463 handle2.Reset();
3464
[email protected]8159a1c2012-06-07 00:00:103465 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433466 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103467 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433468 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033469 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3470
Charlie Harrison55ce6082018-05-14 02:25:573471 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033472 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433473 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103474 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433475 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033476 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3477}
3478
3479TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3480 CreatePool(4, 4);
3481 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3482
Charlie Harrison55ce6082018-05-14 02:25:573483 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033484
3485 ASSERT_TRUE(pool_->HasGroup("a"));
3486 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433487 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103488 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033489 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3490
Charlie Harrison55ce6082018-05-14 02:25:573491 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033492 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433493 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103494 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033495 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3496
Charlie Harrison55ce6082018-05-14 02:25:573497 pool_->RequestSockets("a", &params_, 3, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033498 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433499 EXPECT_EQ(3, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103500 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033501 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3502
Charlie Harrison55ce6082018-05-14 02:25:573503 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033504 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433505 EXPECT_EQ(3, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103506 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033507 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3508}
3509
3510TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3511 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433512 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033513
Charlie Harrison55ce6082018-05-14 02:25:573514 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033515
3516 ASSERT_TRUE(pool_->HasGroup("a"));
3517 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433518 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103519 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033520 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3521
3522 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523523 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203524 EXPECT_EQ(
3525 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543526 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203527 ClientSocketPool::RespectLimits::ENABLED,
3528 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033529
3530 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433531 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103532 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033533 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3534
Lily Chenecebf932018-11-02 17:15:433535 client_socket_factory_.SignalJobs();
3536 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3537
3538 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3539 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3540 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3541 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3542 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033543
[email protected]0dc88b32014-03-26 20:12:283544 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483545 // starts, it has a connect start time.
3546 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033547 handle1.Reset();
3548
3549 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3550}
3551
[email protected]034df0f32013-01-07 23:17:483552// Checks that fully connected preconnect jobs have no connect times, and are
3553// marked as reused.
3554TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3555 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3556 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Charlie Harrison55ce6082018-05-14 02:25:573557 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483558
3559 ASSERT_TRUE(pool_->HasGroup("a"));
3560 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433561 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]034df0f32013-01-07 23:17:483562 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3563 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3564
3565 ClientSocketHandle handle;
3566 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203567 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543568 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203569 ClientSocketPool::RespectLimits::ENABLED,
3570 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483571
3572 // Make sure the idle socket was used.
3573 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3574
3575 TestLoadTimingInfoConnectedReused(handle);
3576 handle.Reset();
3577 TestLoadTimingInfoNotConnected(handle);
3578}
3579
[email protected]dcbe168a2010-12-02 03:14:463580// http://crbug.com/64940 regression test.
3581TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3582 const int kMaxTotalSockets = 3;
3583 const int kMaxSocketsPerGroup = 2;
3584 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433585 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:463586
3587 // Note that group name ordering matters here. "a" comes before "b", so
3588 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3589
3590 // Set up one idle socket in "a".
3591 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523592 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203593 EXPECT_EQ(
3594 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543595 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203596 ClientSocketPool::RespectLimits::ENABLED,
3597 callback1.callback(), pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433598 ASSERT_TRUE(pool_->HasGroup("a"));
3599 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3600 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3601 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3602 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463603
Lily Chenecebf932018-11-02 17:15:433604 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013605 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Lily Chenecebf932018-11-02 17:15:433606 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3607 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3608 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3609 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3610
[email protected]dcbe168a2010-12-02 03:14:463611 handle1.Reset();
3612 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3613
3614 // Set up two active sockets in "b".
3615 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523616 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203617 EXPECT_EQ(
3618 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543619 handle1.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203620 ClientSocketPool::RespectLimits::ENABLED,
3621 callback1.callback(), pool_.get(), NetLogWithSource()));
3622 EXPECT_EQ(
3623 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543624 handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203625 ClientSocketPool::RespectLimits::ENABLED,
3626 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463627
Lily Chenecebf932018-11-02 17:15:433628 ASSERT_TRUE(pool_->HasGroup("b"));
3629 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("b"));
3630 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
3631 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
3632 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3633
3634 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013635 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3636 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463637 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433638 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103639 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463640 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3641
3642 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3643 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3644 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3645 // sockets for "a", and "b" should still have 2 active sockets.
3646
Charlie Harrison55ce6082018-05-14 02:25:573647 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463648 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433649 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103650 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463651 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3652 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3653 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433654 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103655 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463656 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3657 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3658
3659 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3660 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3661 // "a" should result in closing 1 for "b".
3662 handle1.Reset();
3663 handle2.Reset();
3664 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3665 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3666
Charlie Harrison55ce6082018-05-14 02:25:573667 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463668 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433669 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103670 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463671 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3672 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3673 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433674 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103675 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463676 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3677 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3678}
3679
[email protected]b7b8be42011-07-12 12:46:413680TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073681 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3682 pool_->EnableConnectBackupJobs();
3683
3684 // Make the ConnectJob hang until it times out, shorten the timeout.
3685 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3686 connect_job_factory_->set_timeout_duration(
3687 base::TimeDelta::FromMilliseconds(500));
Charlie Harrison55ce6082018-05-14 02:25:573688 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073689 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433690 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103691 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073692 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073693
[email protected]b7b8be42011-07-12 12:46:413694 // Verify the backup timer doesn't create a backup job, by making
3695 // the backup job a pending job instead of a waiting job, so it
3696 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073697 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453698 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443699 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343700 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283701 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073702 EXPECT_FALSE(pool_->HasGroup("a"));
3703}
3704
[email protected]b7b8be42011-07-12 12:46:413705TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073706 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3707 pool_->EnableConnectBackupJobs();
3708
3709 // Make the ConnectJob hang forever.
3710 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Charlie Harrison55ce6082018-05-14 02:25:573711 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073712 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433713 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103714 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073715 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283716 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073717
3718 // Make the backup job be a pending job, so it completes normally.
3719 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3720 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523721 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153722 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543723 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153724 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203725 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413726 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073727 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433728 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103729 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073730 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3731 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013732 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073733
3734 // The hung connect job should still be there, but everything else should be
3735 // complete.
3736 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433737 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3738 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073739 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3740 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3741}
3742
[email protected]0dc88b32014-03-26 20:12:283743// Tests that a preconnect that starts out with unread data can still be used.
3744// http://crbug.com/334467
3745TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3746 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3747 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3748
Charlie Harrison55ce6082018-05-14 02:25:573749 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283750
3751 ASSERT_TRUE(pool_->HasGroup("a"));
3752 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433753 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283754 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3755 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3756
3757 // Fail future jobs to be sure that handle receives the preconnected socket
3758 // rather than closing it and making a new one.
3759 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3760 ClientSocketHandle handle;
3761 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203762 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543763 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203764 ClientSocketPool::RespectLimits::ENABLED,
3765 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283766
3767 ASSERT_TRUE(pool_->HasGroup("a"));
3768 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433769 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283770 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3771 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433772 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283773
3774 // Drain the pending read.
Bence Békybdbb0e72018-08-07 21:42:593775 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:283776
3777 TestLoadTimingInfoConnectedReused(handle);
3778 handle.Reset();
3779
3780 // The socket should be usable now that it's idle again.
3781 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3782}
3783
Lily Chenecebf932018-11-02 17:15:433784TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
3785 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3786 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3787
3788 ClientSocketHandle handle1;
3789 TestCompletionCallback callback1;
3790 EXPECT_EQ(
3791 ERR_IO_PENDING,
3792 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3793 ClientSocketPool::RespectLimits::ENABLED,
3794 callback1.callback(), pool_.get(), NetLogWithSource()));
3795
3796 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3797 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3798 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3799 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3800
3801 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3802}
3803
3804TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
3805 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3806 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3807
3808 ClientSocketHandle handle1;
3809 TestCompletionCallback callback1;
3810 EXPECT_EQ(
3811 ERR_IO_PENDING,
3812 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3813 ClientSocketPool::RespectLimits::ENABLED,
3814 callback1.callback(), pool_.get(), NetLogWithSource()));
3815
3816 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3817 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3818 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3819 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3820
3821 ClientSocketHandle handle2;
3822 TestCompletionCallback callback2;
3823 EXPECT_EQ(
3824 ERR_IO_PENDING,
3825 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3826 ClientSocketPool::RespectLimits::ENABLED,
3827 callback2.callback(), pool_.get(), NetLogWithSource()));
3828
3829 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3830 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3831 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3832 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3833
3834 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3835 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3836
3837 // One job completes. The other request should still have its job.
3838 client_socket_factory_.SignalJob(0);
3839 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3840
3841 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3842 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3843 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3844 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3845 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3846
3847 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3848}
3849
3850TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
3851 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3852 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3853
3854 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
3855
3856 ASSERT_TRUE(pool_->HasGroup("a"));
3857 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3858 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3859 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3860 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3861
3862 ClientSocketHandle handle1;
3863 TestCompletionCallback callback1;
3864 EXPECT_EQ(
3865 ERR_IO_PENDING,
3866 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3867 ClientSocketPool::RespectLimits::ENABLED,
3868 callback1.callback(), pool_.get(), NetLogWithSource()));
3869
3870 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3871 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3872 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3873 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3874
3875 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3876}
3877
3878TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
3879 CreatePool(kDefaultMaxSockets, 1);
3880 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3881
3882 ClientSocketHandle handle1;
3883 TestCompletionCallback callback1;
3884 EXPECT_EQ(
3885 ERR_IO_PENDING,
3886 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3887 ClientSocketPool::RespectLimits::ENABLED,
3888 callback1.callback(), pool_.get(), NetLogWithSource()));
3889
3890 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3891 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3892 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3893 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3894
3895 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3896
3897 // Insert a higher priority request
3898 ClientSocketHandle handle2;
3899 TestCompletionCallback callback2;
3900 EXPECT_EQ(
3901 ERR_IO_PENDING,
3902 handle2.Init("a", params_, HIGHEST, SocketTag(),
3903 ClientSocketPool::RespectLimits::ENABLED,
3904 callback2.callback(), pool_.get(), NetLogWithSource()));
3905
3906 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3907 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3908 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3909 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3910
3911 // The highest priority request should steal the job from the default priority
3912 // request.
3913 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3914 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3915}
3916
3917TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
3918 CreatePool(3, 3);
3919 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3920
3921 ClientSocketHandle handle_lowest;
3922 TestCompletionCallback callback_lowest;
3923 EXPECT_EQ(ERR_IO_PENDING,
3924 handle_lowest.Init("a", params_, LOWEST, SocketTag(),
3925 ClientSocketPool::RespectLimits::ENABLED,
3926 callback_lowest.callback(), pool_.get(),
3927 NetLogWithSource()));
3928
3929 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3930 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3931 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3932 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3933
3934 ClientSocketHandle handle_highest;
3935 TestCompletionCallback callback_highest;
3936 EXPECT_EQ(ERR_IO_PENDING,
3937 handle_highest.Init("a", params_, HIGHEST, SocketTag(),
3938 ClientSocketPool::RespectLimits::ENABLED,
3939 callback_highest.callback(), pool_.get(),
3940 NetLogWithSource()));
3941
3942 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3943 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3944 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3945 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3946
3947 ClientSocketHandle handle_low;
3948 TestCompletionCallback callback_low;
3949 EXPECT_EQ(ERR_IO_PENDING,
3950 handle_low.Init("a", params_, LOW, SocketTag(),
3951 ClientSocketPool::RespectLimits::ENABLED,
3952 callback_low.callback(), pool_.get(),
3953 NetLogWithSource()));
3954
3955 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3956 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3957 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3958 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3959
3960 ClientSocketHandle handle_lowest2;
3961 TestCompletionCallback callback_lowest2;
3962 EXPECT_EQ(ERR_IO_PENDING,
3963 handle_lowest2.Init("a", params_, LOWEST, SocketTag(),
3964 ClientSocketPool::RespectLimits::ENABLED,
3965 callback_lowest2.callback(), pool_.get(),
3966 NetLogWithSource()));
3967
3968 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3969 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3970 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3971 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3972
3973 // The top three requests in the queue should have jobs.
3974 EXPECT_TRUE(
3975 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_highest));
3976 EXPECT_TRUE(
3977 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_low));
3978 EXPECT_TRUE(
3979 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest));
3980 EXPECT_FALSE(
3981 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest2));
3982
3983 // Add another request with medium priority. It should steal the job from the
3984 // lowest priority request with a job.
3985 ClientSocketHandle handle_medium;
3986 TestCompletionCallback callback_medium;
3987 EXPECT_EQ(ERR_IO_PENDING,
3988 handle_medium.Init("a", params_, MEDIUM, SocketTag(),
3989 ClientSocketPool::RespectLimits::ENABLED,
3990 callback_medium.callback(), pool_.get(),
3991 NetLogWithSource()));
3992
3993 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3994 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3995 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3996 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3997 EXPECT_TRUE(
3998 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_highest));
3999 EXPECT_TRUE(
4000 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_medium));
4001 EXPECT_TRUE(
4002 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_low));
4003 EXPECT_FALSE(
4004 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest));
4005 EXPECT_FALSE(
4006 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest2));
4007}
4008
4009TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
4010 CreatePool(kDefaultMaxSockets, 1);
4011 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4012
4013 ClientSocketHandle handle1;
4014 TestCompletionCallback callback1;
4015 EXPECT_EQ(
4016 ERR_IO_PENDING,
4017 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4018 ClientSocketPool::RespectLimits::ENABLED,
4019 callback1.callback(), pool_.get(), NetLogWithSource()));
4020
4021 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4022 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4023 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4024 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4025
4026 ClientSocketHandle handle2;
4027 TestCompletionCallback callback2;
4028 EXPECT_EQ(
4029 ERR_IO_PENDING,
4030 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4031 ClientSocketPool::RespectLimits::ENABLED,
4032 callback2.callback(), pool_.get(), NetLogWithSource()));
4033
4034 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4035 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4036 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4037 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4038
4039 // The second request doesn't get a job because we are at the limit.
4040 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4041 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4042
4043 // Reprioritizing the second request places it above the first, and it steals
4044 // the job from the first request.
4045 pool_->SetPriority("a", &handle2, HIGHEST);
4046 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4047 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4048}
4049
4050TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
4051 CreatePool(kDefaultMaxSockets, 1);
4052 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4053
4054 ClientSocketHandle handle1;
4055 TestCompletionCallback callback1;
4056 EXPECT_EQ(
4057 ERR_IO_PENDING,
4058 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4059 ClientSocketPool::RespectLimits::ENABLED,
4060 callback1.callback(), pool_.get(), NetLogWithSource()));
4061
4062 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4063 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4064 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4065 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4066
4067 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4068
4069 ClientSocketHandle handle2;
4070 TestCompletionCallback callback2;
4071 EXPECT_EQ(
4072 ERR_IO_PENDING,
4073 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4074 ClientSocketPool::RespectLimits::ENABLED,
4075 callback2.callback(), pool_.get(), NetLogWithSource()));
4076
4077 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4078 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4079 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4080 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4081
4082 // The second request doesn't get a job because we are the limit.
4083 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4084 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4085
4086 // The second request should get a job upon cancelling the first request.
4087 handle1.Reset();
4088 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4089 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4090 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4091 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4092
4093 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4094}
4095
4096TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
4097 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4098 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
4099
4100 ClientSocketHandle handle1;
4101 TestCompletionCallback callback1;
4102 EXPECT_EQ(
4103 ERR_IO_PENDING,
4104 handle1.Init("a", params_, HIGHEST, SocketTag(),
4105 ClientSocketPool::RespectLimits::ENABLED,
4106 callback1.callback(), pool_.get(), NetLogWithSource()));
4107
4108 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4109 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4110 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4111 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4112
4113 ClientSocketHandle handle2;
4114 TestCompletionCallback callback2;
4115 EXPECT_EQ(
4116 ERR_IO_PENDING,
4117 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4118 ClientSocketPool::RespectLimits::ENABLED,
4119 callback2.callback(), pool_.get(), NetLogWithSource()));
4120
4121 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
4122 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4123 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4124 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4125
4126 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4127 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4128
4129 // The lower-priority job completes first. The higher-priority request should
4130 // get the socket, and the lower-priority request should get the remaining
4131 // job.
4132 client_socket_factory_.SignalJob(1);
4133 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4134 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4135 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4136 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4137 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
4138 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4139 EXPECT_TRUE(handle1.socket());
4140 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4141}
4142
[email protected]043b68c82013-08-22 23:41:524143class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204144 public:
4145 MockLayeredPool(TestClientSocketPool* pool,
4146 const std::string& group_name)
4147 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:204148 group_name_(group_name),
4149 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524150 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204151 }
4152
Daniel Cheng4496d0822018-04-26 21:52:154153 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204154
4155 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:154156 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:544157 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154158 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204159 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204160 }
4161
4162 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:154163 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:544164 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154165 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:204166 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204167 }
4168
4169 bool ReleaseOneConnection() {
4170 if (!handle_.is_initialized() || !can_release_connection_) {
4171 return false;
4172 }
4173 handle_.socket()->Disconnect();
4174 handle_.Reset();
4175 return true;
4176 }
4177
4178 void set_can_release_connection(bool can_release_connection) {
4179 can_release_connection_ = can_release_connection;
4180 }
4181
4182 MOCK_METHOD0(CloseOneIdleConnection, bool());
4183
4184 private:
4185 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204186 ClientSocketHandle handle_;
4187 TestCompletionCallback callback_;
4188 const std::string group_name_;
4189 bool can_release_connection_;
4190};
4191
4192TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
4193 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4194 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4195
4196 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014197 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204198 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4199 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:524200 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:204201}
4202
4203TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
4204 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4205 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4206
4207 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014208 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204209 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4210 .WillOnce(Invoke(&mock_layered_pool,
4211 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:524212 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:204213}
4214
4215// Tests the basic case of closing an idle socket in a higher layered pool when
4216// a new request is issued and the lower layer pool is stalled.
4217TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4218 CreatePool(1, 1);
4219 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4220
4221 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014222 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204223 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4224 .WillOnce(Invoke(&mock_layered_pool,
4225 &MockLayeredPool::ReleaseOneConnection));
4226 ClientSocketHandle handle;
4227 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:154228 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544229 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154230 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204231 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014232 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204233}
4234
4235// Same as above, but the idle socket is in the same group as the stalled
4236// socket, and closes the only other request in its group when closing requests
4237// in higher layered pools. This generally shouldn't happen, but it may be
4238// possible if a higher level pool issues a request and the request is
4239// subsequently cancelled. Even if it's not possible, best not to crash.
4240TEST_F(ClientSocketPoolBaseTest,
4241 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4242 CreatePool(2, 2);
4243 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4244
4245 // Need a socket in another group for the pool to be stalled (If a group
4246 // has the maximum number of connections already, it's not stalled).
4247 ClientSocketHandle handle1;
4248 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204249 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:544250 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204251 ClientSocketPool::RespectLimits::ENABLED,
4252 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204253
4254 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014255 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204256 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4257 .WillOnce(Invoke(&mock_layered_pool,
4258 &MockLayeredPool::ReleaseOneConnection));
4259 ClientSocketHandle handle;
4260 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:154261 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544262 handle.Init("group2", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154263 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204264 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014265 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204266}
4267
4268// Tests the case when an idle socket can be closed when a new request is
4269// issued, and the new request belongs to a group that was previously stalled.
4270TEST_F(ClientSocketPoolBaseTest,
4271 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4272 CreatePool(2, 2);
4273 std::list<TestConnectJob::JobType> job_types;
4274 job_types.push_back(TestConnectJob::kMockJob);
4275 job_types.push_back(TestConnectJob::kMockJob);
4276 job_types.push_back(TestConnectJob::kMockJob);
4277 job_types.push_back(TestConnectJob::kMockJob);
4278 connect_job_factory_->set_job_types(&job_types);
4279
4280 ClientSocketHandle handle1;
4281 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204282 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:544283 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204284 ClientSocketPool::RespectLimits::ENABLED,
4285 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204286
4287 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014288 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204289 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4290 .WillRepeatedly(Invoke(&mock_layered_pool,
4291 &MockLayeredPool::ReleaseOneConnection));
4292 mock_layered_pool.set_can_release_connection(false);
4293
4294 // The third request is made when the socket pool is in a stalled state.
4295 ClientSocketHandle handle3;
4296 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204297 EXPECT_EQ(
4298 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544299 handle3.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204300 ClientSocketPool::RespectLimits::ENABLED,
4301 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204302
4303 base::RunLoop().RunUntilIdle();
4304 EXPECT_FALSE(callback3.have_result());
4305
4306 // The fourth request is made when the pool is no longer stalled. The third
4307 // request should be serviced first, since it was issued first and has the
4308 // same priority.
4309 mock_layered_pool.set_can_release_connection(true);
4310 ClientSocketHandle handle4;
4311 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204312 EXPECT_EQ(
4313 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544314 handle4.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204315 ClientSocketPool::RespectLimits::ENABLED,
4316 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014317 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204318 EXPECT_FALSE(callback4.have_result());
4319
4320 // Closing a handle should free up another socket slot.
4321 handle1.Reset();
robpercival214763f2016-07-01 23:27:014322 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204323}
4324
4325// Tests the case when an idle socket can be closed when a new request is
4326// issued, and the new request belongs to a group that was previously stalled.
4327//
4328// The two differences from the above test are that the stalled requests are not
4329// in the same group as the layered pool's request, and the the fourth request
4330// has a higher priority than the third one, so gets a socket first.
4331TEST_F(ClientSocketPoolBaseTest,
4332 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4333 CreatePool(2, 2);
4334 std::list<TestConnectJob::JobType> job_types;
4335 job_types.push_back(TestConnectJob::kMockJob);
4336 job_types.push_back(TestConnectJob::kMockJob);
4337 job_types.push_back(TestConnectJob::kMockJob);
4338 job_types.push_back(TestConnectJob::kMockJob);
4339 connect_job_factory_->set_job_types(&job_types);
4340
4341 ClientSocketHandle handle1;
4342 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204343 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:544344 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204345 ClientSocketPool::RespectLimits::ENABLED,
4346 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204347
4348 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014349 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204350 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4351 .WillRepeatedly(Invoke(&mock_layered_pool,
4352 &MockLayeredPool::ReleaseOneConnection));
4353 mock_layered_pool.set_can_release_connection(false);
4354
4355 // The third request is made when the socket pool is in a stalled state.
4356 ClientSocketHandle handle3;
4357 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204358 EXPECT_EQ(
4359 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544360 handle3.Init("group3", params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:204361 ClientSocketPool::RespectLimits::ENABLED,
4362 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204363
4364 base::RunLoop().RunUntilIdle();
4365 EXPECT_FALSE(callback3.have_result());
4366
4367 // The fourth request is made when the pool is no longer stalled. This
4368 // request has a higher priority than the third request, so is serviced first.
4369 mock_layered_pool.set_can_release_connection(true);
4370 ClientSocketHandle handle4;
4371 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204372 EXPECT_EQ(
4373 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544374 handle4.Init("group3", params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:204375 ClientSocketPool::RespectLimits::ENABLED,
4376 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014377 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204378 EXPECT_FALSE(callback3.have_result());
4379
4380 // Closing a handle should free up another socket slot.
4381 handle1.Reset();
robpercival214763f2016-07-01 23:27:014382 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204383}
4384
4385TEST_F(ClientSocketPoolBaseTest,
4386 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4387 CreatePool(1, 1);
4388 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4389
4390 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014391 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204392 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4393 .WillRepeatedly(Invoke(&mock_layered_pool1,
4394 &MockLayeredPool::ReleaseOneConnection));
4395 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:014396 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4397 IsOk());
[email protected]58e562f2013-04-22 17:32:204398 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4399 .WillRepeatedly(Invoke(&mock_layered_pool2,
4400 &MockLayeredPool::ReleaseOneConnection));
4401 ClientSocketHandle handle;
4402 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:154403 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544404 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154405 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204406 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014407 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204408}
4409
[email protected]b021ece62013-06-11 11:06:334410// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154411// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4412// socket instead of a request with the same priority that was issued earlier,
4413// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334414TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334415 CreatePool(1, 1);
4416
4417 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154418 EXPECT_EQ(
4419 OK, StartRequestWithIgnoreLimits(
4420 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334421 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4422
4423 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4424
mmenked3641e12016-01-28 16:06:154425 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4426 "a", MAXIMUM_PRIORITY,
4427 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334428 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4429
mmenked3641e12016-01-28 16:06:154430 // Issue a request that ignores the limits, so a new ConnectJob is
4431 // created.
4432 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4433 "a", MAXIMUM_PRIORITY,
4434 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334435 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4436
robpercival214763f2016-07-01 23:27:014437 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334438 EXPECT_FALSE(request(1)->have_result());
4439}
4440
[email protected]c55fabd2013-11-04 23:26:564441// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154442// issued for a request with RespectLimits::DISABLED is not cancelled when a
4443// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564444TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564445 CreatePool(1, 1);
4446
4447 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154448 EXPECT_EQ(
4449 OK, StartRequestWithIgnoreLimits(
4450 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564451 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4452
4453 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4454
mmenked3641e12016-01-28 16:06:154455 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4456 "a", MAXIMUM_PRIORITY,
4457 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564458 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4459
mmenked3641e12016-01-28 16:06:154460 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4461 // created.
4462 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4463 "a", MAXIMUM_PRIORITY,
4464 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334465 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4466
mmenked3641e12016-01-28 16:06:154467 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334468 // should not be cancelled.
4469 request(1)->handle()->Reset();
4470 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4471
robpercival214763f2016-07-01 23:27:014472 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334473 EXPECT_FALSE(request(1)->have_result());
4474}
4475
[email protected]f6d1d6eb2009-06-24 20:16:094476} // namespace
4477
4478} // namespace net