blob: be7e7dfe266a6648165fc413afcff0ee4c179fb8 [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 }
Helen Liac3c51e2018-04-24 00:02:13243 std::unique_ptr<ProxyClientSocket> CreateProxyClientSocket(
244 std::unique_ptr<ClientSocketHandle> transport_socket,
245 const std::string& user_agent,
246 const HostPortPair& endpoint,
Wojciech Dzierżanowski1f823562019-01-18 11:26:00247 const ProxyServer& proxy_server,
Helen Liac3c51e2018-04-24 00:02:13248 HttpAuthController* http_auth_controller,
249 bool tunnel,
250 bool using_spdy,
251 NextProto negotiated_protocol,
Wojciech Dzierżanowski1f823562019-01-18 11:26:00252 ProxyDelegate* proxy_delegate,
Helen Liac3c51e2018-04-24 00:02:13253 bool is_https_proxy,
254 const NetworkTrafficAnnotationTag& traffic_annotation) override {
255 NOTIMPLEMENTED();
256 return nullptr;
257 }
[email protected]f6d1d6eb2009-06-24 20:16:09258
dchengb03027d2014-10-21 12:00:20259 void ClearSSLSessionCache() override { NOTIMPLEMENTED(); }
[email protected]25f47352011-02-25 16:31:59260
[email protected]5fc08e32009-07-15 17:09:57261 void WaitForSignal(TestConnectJob* job) { waiting_jobs_.push_back(job); }
[email protected]03b7c8c2013-07-20 04:38:55262
[email protected]5fc08e32009-07-15 17:09:57263 void SignalJobs();
264
[email protected]03b7c8c2013-07-20 04:38:55265 void SignalJob(size_t job);
266
267 void SetJobLoadState(size_t job, LoadState load_state);
268
[email protected]f6d1d6eb2009-06-24 20:16:09269 int allocation_count() const { return allocation_count_; }
270
[email protected]f6d1d6eb2009-06-24 20:16:09271 private:
272 int allocation_count_;
[email protected]5fc08e32009-07-15 17:09:57273 std::vector<TestConnectJob*> waiting_jobs_;
[email protected]f6d1d6eb2009-06-24 20:16:09274};
275
[email protected]ab838892009-06-30 18:49:05276class TestConnectJob : public ConnectJob {
277 public:
278 enum JobType {
279 kMockJob,
280 kMockFailingJob,
281 kMockPendingJob,
282 kMockPendingFailingJob,
[email protected]5fc08e32009-07-15 17:09:57283 kMockWaitingJob,
[email protected]e772db3f2010-07-12 18:11:13284 kMockRecoverableJob,
285 kMockPendingRecoverableJob,
[email protected]e60e47a2010-07-14 03:37:18286 kMockAdditionalErrorStateJob,
287 kMockPendingAdditionalErrorStateJob,
[email protected]0dc88b32014-03-26 20:12:28288 kMockUnreadDataJob,
[email protected]ab838892009-06-30 18:49:05289 };
290
[email protected]994d4932010-07-12 17:55:13291 // The kMockPendingJob uses a slight delay before allowing the connect
292 // to complete.
293 static const int kPendingConnectDelay = 2;
294
[email protected]ab838892009-06-30 18:49:05295 TestConnectJob(JobType job_type,
296 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49297 const TestClientSocketPoolBase::Request& request,
[email protected]974ebd62009-08-03 23:14:34298 base::TimeDelta timeout_duration,
[email protected]ab838892009-06-30 18:49:05299 ConnectJob::Delegate* delegate,
[email protected]fd7b7c92009-08-20 19:38:30300 MockClientSocketFactory* client_socket_factory,
[email protected]06650c52010-06-03 00:49:17301 NetLog* net_log)
tfarina428341112016-09-22 13:38:20302 : ConnectJob(
303 group_name,
304 timeout_duration,
305 request.priority(),
Paul Jensen8d6f87ec2018-01-13 00:46:54306 request.socket_tag(),
Matt Menke977e61b2019-01-10 19:36:02307 request.respect_limits() ==
308 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:20309 delegate,
davidbenb7048f092016-11-30 21:20:26310 NetLogWithSource::Make(net_log,
311 NetLogSourceType::TRANSPORT_CONNECT_JOB)),
[email protected]2ab05b52009-07-01 23:57:58312 job_type_(job_type),
[email protected]ab838892009-06-30 18:49:05313 client_socket_factory_(client_socket_factory),
[email protected]e60e47a2010-07-14 03:37:18314 load_state_(LOAD_STATE_IDLE),
[email protected]d5492c52013-11-10 20:44:39315 store_additional_error_state_(false),
mmenked3641e12016-01-28 16:06:15316 weak_factory_(this) {}
[email protected]ab838892009-06-30 18:49:05317
[email protected]974ebd62009-08-03 23:14:34318 void Signal() {
[email protected]e772db3f2010-07-12 18:11:13319 DoConnect(waiting_success_, true /* async */, false /* recoverable */);
[email protected]974ebd62009-08-03 23:14:34320 }
321
[email protected]03b7c8c2013-07-20 04:38:55322 void set_load_state(LoadState load_state) { load_state_ = load_state; }
323
324 // From ConnectJob:
325
dchengb03027d2014-10-21 12:00:20326 LoadState GetLoadState() const override { return load_state_; }
[email protected]46451352009-09-01 14:54:21327
dchengb03027d2014-10-21 12:00:20328 void GetAdditionalErrorState(ClientSocketHandle* handle) override {
[email protected]e60e47a2010-07-14 03:37:18329 if (store_additional_error_state_) {
330 // Set all of the additional error state fields in some way.
331 handle->set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43332 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45333 info.headers = new HttpResponseHeaders(std::string());
[email protected]8b498692010-07-16 17:11:43334 handle->set_ssl_error_response_info(info);
[email protected]e60e47a2010-07-14 03:37:18335 }
336 }
337
[email protected]974ebd62009-08-03 23:14:34338 private:
[email protected]03b7c8c2013-07-20 04:38:55339 // From ConnectJob:
[email protected]ab838892009-06-30 18:49:05340
dchengb03027d2014-10-21 12:00:20341 int ConnectInternal() override {
[email protected]ab838892009-06-30 18:49:05342 AddressList ignored;
tbansal7b403bcc2016-04-13 22:33:21343 client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
mikecironef22f9812016-10-04 03:40:19344 NetLogSource());
danakj655b66c2016-04-16 00:51:38345 SetSocket(std::unique_ptr<StreamSocket>(
346 new MockClientSocket(net_log().net_log())));
[email protected]ab838892009-06-30 18:49:05347 switch (job_type_) {
348 case kMockJob:
[email protected]e772db3f2010-07-12 18:11:13349 return DoConnect(true /* successful */, false /* sync */,
350 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05351 case kMockFailingJob:
[email protected]e772db3f2010-07-12 18:11:13352 return DoConnect(false /* error */, false /* sync */,
353 false /* recoverable */);
[email protected]ab838892009-06-30 18:49:05354 case kMockPendingJob:
[email protected]5fc08e32009-07-15 17:09:57355 set_load_state(LOAD_STATE_CONNECTING);
[email protected]6b175382009-10-13 06:47:47356
357 // Depending on execution timings, posting a delayed task can result
358 // in the task getting executed the at the earliest possible
359 // opportunity or only after returning once from the message loop and
360 // then a second call into the message loop. In order to make behavior
361 // more deterministic, we change the default delay to 2ms. This should
362 // always require us to wait for the second call into the message loop.
363 //
364 // N.B. The correct fix for this and similar timing problems is to
365 // abstract time for the purpose of unittests. Unfortunately, we have
366 // a lot of third-party components that directly call the various
367 // time functions, so this change would be rather invasive.
skyostil4891b25b2015-06-11 11:43:45368 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05369 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13370 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45371 weak_factory_.GetWeakPtr(), true /* successful */,
372 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53373 base::TimeDelta::FromMilliseconds(kPendingConnectDelay));
[email protected]ab838892009-06-30 18:49:05374 return ERR_IO_PENDING;
375 case kMockPendingFailingJob:
[email protected]5fc08e32009-07-15 17:09:57376 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45377 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]ab838892009-06-30 18:49:05378 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13379 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45380 weak_factory_.GetWeakPtr(), false /* error */,
381 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53382 base::TimeDelta::FromMilliseconds(2));
[email protected]ab838892009-06-30 18:49:05383 return ERR_IO_PENDING;
[email protected]5fc08e32009-07-15 17:09:57384 case kMockWaitingJob:
[email protected]03b7c8c2013-07-20 04:38:55385 set_load_state(LOAD_STATE_CONNECTING);
[email protected]5fc08e32009-07-15 17:09:57386 client_socket_factory_->WaitForSignal(this);
387 waiting_success_ = true;
388 return ERR_IO_PENDING;
[email protected]e772db3f2010-07-12 18:11:13389 case kMockRecoverableJob:
390 return DoConnect(false /* error */, false /* sync */,
391 true /* recoverable */);
392 case kMockPendingRecoverableJob:
393 set_load_state(LOAD_STATE_CONNECTING);
skyostil4891b25b2015-06-11 11:43:45394 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e772db3f2010-07-12 18:11:13395 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13396 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45397 weak_factory_.GetWeakPtr(), false /* error */,
398 true /* async */, true /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53399 base::TimeDelta::FromMilliseconds(2));
[email protected]e772db3f2010-07-12 18:11:13400 return ERR_IO_PENDING;
[email protected]e60e47a2010-07-14 03:37:18401 case kMockAdditionalErrorStateJob:
402 store_additional_error_state_ = true;
403 return DoConnect(false /* error */, false /* sync */,
404 false /* recoverable */);
405 case kMockPendingAdditionalErrorStateJob:
406 set_load_state(LOAD_STATE_CONNECTING);
407 store_additional_error_state_ = true;
skyostil4891b25b2015-06-11 11:43:45408 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]e60e47a2010-07-14 03:37:18409 FROM_HERE,
[email protected]6ea7b152011-12-21 21:21:13410 base::Bind(base::IgnoreResult(&TestConnectJob::DoConnect),
skyostil4891b25b2015-06-11 11:43:45411 weak_factory_.GetWeakPtr(), false /* error */,
412 true /* async */, false /* recoverable */),
[email protected]5761ab9c2012-02-04 16:44:53413 base::TimeDelta::FromMilliseconds(2));
[email protected]e60e47a2010-07-14 03:37:18414 return ERR_IO_PENDING;
[email protected]0dc88b32014-03-26 20:12:28415 case kMockUnreadDataJob: {
416 int ret = DoConnect(true /* successful */, false /* sync */,
417 false /* recoverable */);
418 static_cast<MockClientSocket*>(socket())->set_has_unread_data(true);
419 return ret;
420 }
[email protected]ab838892009-06-30 18:49:05421 default:
422 NOTREACHED();
danakj655b66c2016-04-16 00:51:38423 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05424 return ERR_FAILED;
425 }
426 }
427
Lily Chen02ef29a2018-11-30 16:31:43428 void ChangePriorityInternal(RequestPriority priority) override {}
429
[email protected]e772db3f2010-07-12 18:11:13430 int DoConnect(bool succeed, bool was_async, bool recoverable) {
431 int result = OK;
[email protected]ab838892009-06-30 18:49:05432 if (succeed) {
Bence Békybdbb0e72018-08-07 21:42:59433 socket()->Connect(CompletionOnceCallback());
[email protected]e772db3f2010-07-12 18:11:13434 } else if (recoverable) {
435 result = ERR_PROXY_AUTH_REQUESTED;
[email protected]6e713f02009-08-06 02:56:40436 } else {
[email protected]e772db3f2010-07-12 18:11:13437 result = ERR_CONNECTION_FAILED;
danakj655b66c2016-04-16 00:51:38438 SetSocket(std::unique_ptr<StreamSocket>());
[email protected]ab838892009-06-30 18:49:05439 }
[email protected]2ab05b52009-07-01 23:57:58440
441 if (was_async)
[email protected]fd7b7c92009-08-20 19:38:30442 NotifyDelegateOfCompletion(result);
[email protected]ab838892009-06-30 18:49:05443 return result;
444 }
445
[email protected]5fc08e32009-07-15 17:09:57446 bool waiting_success_;
[email protected]ab838892009-06-30 18:49:05447 const JobType job_type_;
[email protected]5fc08e32009-07-15 17:09:57448 MockClientSocketFactory* const client_socket_factory_;
[email protected]46451352009-09-01 14:54:21449 LoadState load_state_;
[email protected]e60e47a2010-07-14 03:37:18450 bool store_additional_error_state_;
[email protected]ab838892009-06-30 18:49:05451
[email protected]d5492c52013-11-10 20:44:39452 base::WeakPtrFactory<TestConnectJob> weak_factory_;
453
[email protected]ab838892009-06-30 18:49:05454 DISALLOW_COPY_AND_ASSIGN(TestConnectJob);
455};
456
[email protected]d80a4322009-08-14 07:07:49457class TestConnectJobFactory
458 : public TestClientSocketPoolBase::ConnectJobFactory {
[email protected]ab838892009-06-30 18:49:05459 public:
[email protected]034df0f32013-01-07 23:17:48460 TestConnectJobFactory(MockClientSocketFactory* client_socket_factory,
461 NetLog* net_log)
[email protected]ab838892009-06-30 18:49:05462 : job_type_(TestConnectJob::kMockJob),
[email protected]51fdc7c2012-04-10 19:19:48463 job_types_(NULL),
[email protected]034df0f32013-01-07 23:17:48464 client_socket_factory_(client_socket_factory),
465 net_log_(net_log) {
[email protected]b021ece62013-06-11 11:06:33466 }
[email protected]ab838892009-06-30 18:49:05467
Chris Watkins7a41d3552017-12-01 02:13:27468 ~TestConnectJobFactory() override = default;
[email protected]ab838892009-06-30 18:49:05469
470 void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
471
[email protected]51fdc7c2012-04-10 19:19:48472 void set_job_types(std::list<TestConnectJob::JobType>* job_types) {
473 job_types_ = job_types;
474 CHECK(!job_types_->empty());
475 }
476
[email protected]974ebd62009-08-03 23:14:34477 void set_timeout_duration(base::TimeDelta timeout_duration) {
478 timeout_duration_ = timeout_duration;
479 }
480
[email protected]3f55aa12011-12-07 02:03:33481 // ConnectJobFactory implementation.
[email protected]83039bb2011-12-09 18:43:55482
danakj655b66c2016-04-16 00:51:38483 std::unique_ptr<ConnectJob> NewConnectJob(
[email protected]ab838892009-06-30 18:49:05484 const std::string& group_name,
[email protected]d80a4322009-08-14 07:07:49485 const TestClientSocketPoolBase::Request& request,
mostynbba063d6032014-10-09 11:01:13486 ConnectJob::Delegate* delegate) const override {
[email protected]51fdc7c2012-04-10 19:19:48487 EXPECT_TRUE(!job_types_ || !job_types_->empty());
488 TestConnectJob::JobType job_type = job_type_;
489 if (job_types_ && !job_types_->empty()) {
490 job_type = job_types_->front();
491 job_types_->pop_front();
492 }
danakj655b66c2016-04-16 00:51:38493 return std::unique_ptr<ConnectJob>(
494 new TestConnectJob(job_type, group_name, request, timeout_duration_,
495 delegate, client_socket_factory_, net_log_));
[email protected]ab838892009-06-30 18:49:05496 }
497
[email protected]ab838892009-06-30 18:49:05498 private:
499 TestConnectJob::JobType job_type_;
[email protected]51fdc7c2012-04-10 19:19:48500 std::list<TestConnectJob::JobType>* job_types_;
[email protected]974ebd62009-08-03 23:14:34501 base::TimeDelta timeout_duration_;
[email protected]5fc08e32009-07-15 17:09:57502 MockClientSocketFactory* const client_socket_factory_;
[email protected]034df0f32013-01-07 23:17:48503 NetLog* net_log_;
[email protected]ab838892009-06-30 18:49:05504
505 DISALLOW_COPY_AND_ASSIGN(TestConnectJobFactory);
506};
507
508class TestClientSocketPool : public ClientSocketPool {
509 public:
[email protected]12322e7e2013-08-15 17:49:26510 typedef TestSocketParams SocketParams;
511
[email protected]ab838892009-06-30 18:49:05512 TestClientSocketPool(
[email protected]211d21722009-07-22 15:48:53513 int max_sockets,
[email protected]ab838892009-06-30 18:49:05514 int max_sockets_per_group,
[email protected]9bf28db2009-08-29 01:35:16515 base::TimeDelta unused_idle_socket_timeout,
516 base::TimeDelta used_idle_socket_timeout,
[email protected]d80a4322009-08-14 07:07:49517 TestClientSocketPoolBase::ConnectJobFactory* connect_job_factory)
rkaplowd90695c2015-03-25 22:12:41518 : base_(NULL,
519 max_sockets,
520 max_sockets_per_group,
521 unused_idle_socket_timeout,
522 used_idle_socket_timeout,
[email protected]66761b952010-06-25 21:30:38523 connect_job_factory) {}
[email protected]ab838892009-06-30 18:49:05524
Chris Watkins7a41d3552017-12-01 02:13:27525 ~TestClientSocketPool() override = default;
[email protected]2431756e2010-09-29 20:26:13526
dchengb03027d2014-10-21 12:00:20527 int RequestSocket(const std::string& group_name,
528 const void* params,
ttuttle859dc7a2015-04-23 19:42:29529 RequestPriority priority,
Paul Jensen8d6f87ec2018-01-13 00:46:54530 const SocketTag& socket_tag,
mmenked3641e12016-01-28 16:06:15531 RespectLimits respect_limits,
dchengb03027d2014-10-21 12:00:20532 ClientSocketHandle* handle,
Bence Béky5a8662b2018-07-03 13:04:03533 CompletionOnceCallback callback,
tfarina428341112016-09-22 13:38:20534 const NetLogWithSource& net_log) override {
[email protected]df4b4ef2010-07-12 18:25:21535 const scoped_refptr<TestSocketParams>* casted_socket_params =
536 static_cast<const scoped_refptr<TestSocketParams>*>(params);
537 return base_.RequestSocket(group_name, *casted_socket_params, priority,
Bence Béky5a8662b2018-07-03 13:04:03538 socket_tag, respect_limits, handle,
539 std::move(callback), net_log);
[email protected]ab838892009-06-30 18:49:05540 }
541
dchengb03027d2014-10-21 12:00:20542 void RequestSockets(const std::string& group_name,
543 const void* params,
544 int num_sockets,
Charlie Harrison55ce6082018-05-14 02:25:57545 const NetLogWithSource& net_log) override {
[email protected]2c2bef152010-10-13 00:55:03546 const scoped_refptr<TestSocketParams>* casted_params =
547 static_cast<const scoped_refptr<TestSocketParams>*>(params);
548
Charlie Harrison55ce6082018-05-14 02:25:57549 base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
[email protected]2c2bef152010-10-13 00:55:03550 }
551
rdsmith29dbad12017-02-17 02:22:18552 void SetPriority(const std::string& group_name,
553 ClientSocketHandle* handle,
554 RequestPriority priority) override {
555 base_.SetPriority(group_name, handle, priority);
556 }
557
dchengb03027d2014-10-21 12:00:20558 void CancelRequest(const std::string& group_name,
559 ClientSocketHandle* handle) override {
[email protected]d80a4322009-08-14 07:07:49560 base_.CancelRequest(group_name, handle);
[email protected]ab838892009-06-30 18:49:05561 }
562
dchengb03027d2014-10-21 12:00:20563 void ReleaseSocket(const std::string& group_name,
danakj655b66c2016-04-16 00:51:38564 std::unique_ptr<StreamSocket> socket,
dchengb03027d2014-10-21 12:00:20565 int id) override {
dchengc7eeda422015-12-26 03:56:48566 base_.ReleaseSocket(group_name, std::move(socket), id);
[email protected]a7e38572010-06-07 18:22:24567 }
568
dchengb03027d2014-10-21 12:00:20569 void FlushWithError(int error) override { base_.FlushWithError(error); }
[email protected]ab838892009-06-30 18:49:05570
dchengb03027d2014-10-21 12:00:20571 bool IsStalled() const override { return base_.IsStalled(); }
[email protected]51fdc7c2012-04-10 19:19:48572
dchengb03027d2014-10-21 12:00:20573 void CloseIdleSockets() override { base_.CloseIdleSockets(); }
[email protected]ab838892009-06-30 18:49:05574
xunjieli92feb332017-03-03 17:19:23575 void CloseIdleSocketsInGroup(const std::string& group_name) override {
576 base_.CloseIdleSocketsInGroup(group_name);
577 }
578
dchengb03027d2014-10-21 12:00:20579 int IdleSocketCount() const override { return base_.idle_socket_count(); }
[email protected]ab838892009-06-30 18:49:05580
dchengb03027d2014-10-21 12:00:20581 int IdleSocketCountInGroup(const std::string& group_name) const override {
[email protected]d80a4322009-08-14 07:07:49582 return base_.IdleSocketCountInGroup(group_name);
[email protected]ab838892009-06-30 18:49:05583 }
584
dchengb03027d2014-10-21 12:00:20585 LoadState GetLoadState(const std::string& group_name,
586 const ClientSocketHandle* handle) const override {
[email protected]d80a4322009-08-14 07:07:49587 return base_.GetLoadState(group_name, handle);
[email protected]ab838892009-06-30 18:49:05588 }
589
dchengb03027d2014-10-21 12:00:20590 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52591 base_.AddHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48592 }
593
dchengb03027d2014-10-21 12:00:20594 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override {
[email protected]043b68c82013-08-22 23:41:52595 base_.RemoveHigherLayeredPool(higher_pool);
[email protected]51fdc7c2012-04-10 19:19:48596 }
597
danakj655b66c2016-04-16 00:51:38598 std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
[email protected]d4dfdab2011-12-07 16:56:59599 const std::string& name,
600 const std::string& type,
mostynbba063d6032014-10-09 11:01:13601 bool include_nested_pools) const override {
[email protected]59d7a5a2010-08-30 16:44:27602 return base_.GetInfoAsValue(name, type);
603 }
604
[email protected]d80a4322009-08-14 07:07:49605 const TestClientSocketPoolBase* base() const { return &base_; }
[email protected]c9d6a1d2009-07-14 16:15:20606
Lily Chenecebf932018-11-02 17:15:43607 int NumNeverAssignedConnectJobsInGroup(const std::string& group_name) const {
608 return base_.NumNeverAssignedConnectJobsInGroup(group_name);
609 }
610
[email protected]8159a1c2012-06-07 00:00:10611 int NumUnassignedConnectJobsInGroup(const std::string& group_name) const {
612 return base_.NumUnassignedConnectJobsInGroup(group_name);
613 }
614
[email protected]974ebd62009-08-03 23:14:34615 int NumConnectJobsInGroup(const std::string& group_name) const {
[email protected]d80a4322009-08-14 07:07:49616 return base_.NumConnectJobsInGroup(group_name);
[email protected]974ebd62009-08-03 23:14:34617 }
618
[email protected]2c2bef152010-10-13 00:55:03619 int NumActiveSocketsInGroup(const std::string& group_name) const {
620 return base_.NumActiveSocketsInGroup(group_name);
621 }
622
Lily Chenecebf932018-11-02 17:15:43623 bool RequestInGroupWithHandleHasJobForTesting(
624 const std::string& group_name,
625 const ClientSocketHandle* handle) const {
626 return base_.RequestInGroupWithHandleHasJobForTesting(group_name, handle);
627 }
628
[email protected]2abfe90a2010-08-25 17:49:51629 bool HasGroup(const std::string& group_name) const {
630 return base_.HasGroup(group_name);
631 }
632
[email protected]9bf28db2009-08-29 01:35:16633 void CleanupTimedOutIdleSockets() { base_.CleanupIdleSockets(false); }
634
[email protected]06d94042010-08-25 01:45:22635 void EnableConnectBackupJobs() { base_.EnableConnectBackupJobs(); }
[email protected]43a21b82010-06-10 21:30:54636
[email protected]043b68c82013-08-22 23:41:52637 bool CloseOneIdleConnectionInHigherLayeredPool() {
638 return base_.CloseOneIdleConnectionInHigherLayeredPool();
[email protected]51fdc7c2012-04-10 19:19:48639 }
640
[email protected]ab838892009-06-30 18:49:05641 private:
[email protected]d80a4322009-08-14 07:07:49642 TestClientSocketPoolBase base_;
[email protected]ab838892009-06-30 18:49:05643
644 DISALLOW_COPY_AND_ASSIGN(TestClientSocketPool);
645};
646
[email protected]a937a06d2009-08-19 21:19:24647} // namespace
648
[email protected]a937a06d2009-08-19 21:19:24649namespace {
650
[email protected]5fc08e32009-07-15 17:09:57651void MockClientSocketFactory::SignalJobs() {
jdoerrie22a91d8b92018-10-05 08:43:26652 for (auto it = waiting_jobs_.begin(); it != waiting_jobs_.end(); ++it) {
[email protected]5fc08e32009-07-15 17:09:57653 (*it)->Signal();
654 }
655 waiting_jobs_.clear();
656}
657
[email protected]03b7c8c2013-07-20 04:38:55658void MockClientSocketFactory::SignalJob(size_t job) {
659 ASSERT_LT(job, waiting_jobs_.size());
660 waiting_jobs_[job]->Signal();
661 waiting_jobs_.erase(waiting_jobs_.begin() + job);
662}
663
664void MockClientSocketFactory::SetJobLoadState(size_t job,
665 LoadState load_state) {
666 ASSERT_LT(job, waiting_jobs_.size());
667 waiting_jobs_[job]->set_load_state(load_state);
668}
669
Bence Béky98447b12018-05-08 03:14:01670class ClientSocketPoolBaseTest : public TestWithScopedTaskEnvironment {
[email protected]f6d1d6eb2009-06-24 20:16:09671 protected:
Alex Clarke0def2092018-12-10 12:01:45672 ClientSocketPoolBaseTest()
673 : TestWithScopedTaskEnvironment(
674 base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
675 params_(new TestSocketParams()) {
[email protected]636b8252011-04-08 19:56:54676 connect_backup_jobs_enabled_ =
677 internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
678 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true);
679 }
[email protected]2431756e2010-09-29 20:26:13680
dcheng67be2b1f2014-10-27 21:47:29681 ~ClientSocketPoolBaseTest() override {
[email protected]636b8252011-04-08 19:56:54682 internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
683 connect_backup_jobs_enabled_);
684 }
[email protected]c9d6a1d2009-07-14 16:15:20685
[email protected]211d21722009-07-22 15:48:53686 void CreatePool(int max_sockets, int max_sockets_per_group) {
[email protected]9bf28db2009-08-29 01:35:16687 CreatePoolWithIdleTimeouts(
688 max_sockets,
689 max_sockets_per_group,
[email protected]82b8c962011-10-12 09:17:30690 ClientSocketPool::unused_idle_socket_timeout(),
691 ClientSocketPool::used_idle_socket_timeout());
[email protected]9bf28db2009-08-29 01:35:16692 }
693
694 void CreatePoolWithIdleTimeouts(
695 int max_sockets, int max_sockets_per_group,
696 base::TimeDelta unused_idle_socket_timeout,
697 base::TimeDelta used_idle_socket_timeout) {
[email protected]c9d6a1d2009-07-14 16:15:20698 DCHECK(!pool_.get());
[email protected]034df0f32013-01-07 23:17:48699 connect_job_factory_ = new TestConnectJobFactory(&client_socket_factory_,
700 &net_log_);
[email protected]2431756e2010-09-29 20:26:13701 pool_.reset(new TestClientSocketPool(max_sockets,
702 max_sockets_per_group,
[email protected]2431756e2010-09-29 20:26:13703 unused_idle_socket_timeout,
704 used_idle_socket_timeout,
705 connect_job_factory_));
[email protected]c9d6a1d2009-07-14 16:15:20706 }
[email protected]f6d1d6eb2009-06-24 20:16:09707
mmenked3641e12016-01-28 16:06:15708 int StartRequestWithIgnoreLimits(
[email protected]b021ece62013-06-11 11:06:33709 const std::string& group_name,
710 RequestPriority priority,
mmenked3641e12016-01-28 16:06:15711 ClientSocketPool::RespectLimits respect_limits) {
712 return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority,
713 respect_limits, params_);
[email protected]b021ece62013-06-11 11:06:33714 }
715
716 int StartRequest(const std::string& group_name, RequestPriority priority) {
mmenked3641e12016-01-28 16:06:15717 return StartRequestWithIgnoreLimits(
718 group_name, priority, ClientSocketPool::RespectLimits::ENABLED);
[email protected]f6d1d6eb2009-06-24 20:16:09719 }
720
[email protected]2431756e2010-09-29 20:26:13721 int GetOrderOfRequest(size_t index) const {
722 return test_base_.GetOrderOfRequest(index);
[email protected]f6d1d6eb2009-06-24 20:16:09723 }
724
[email protected]2431756e2010-09-29 20:26:13725 bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
726 return test_base_.ReleaseOneConnection(keep_alive);
727 }
728
729 void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
730 test_base_.ReleaseAllConnections(keep_alive);
731 }
732
733 TestSocketRequest* request(int i) { return test_base_.request(i); }
734 size_t requests_size() const { return test_base_.requests_size(); }
danakj655b66c2016-04-16 00:51:38735 std::vector<std::unique_ptr<TestSocketRequest>>* requests() {
olli.raula9d66b7d2015-11-23 08:30:42736 return test_base_.requests();
737 }
rdsmith29dbad12017-02-17 02:22:18738 // Only counts the requests that get sockets asynchronously;
739 // synchronous completions are not registered by this count.
[email protected]2431756e2010-09-29 20:26:13740 size_t completion_count() const { return test_base_.completion_count(); }
741
vishal.b62985ca92015-04-17 08:45:51742 TestNetLog net_log_;
[email protected]636b8252011-04-08 19:56:54743 bool connect_backup_jobs_enabled_;
[email protected]f6d1d6eb2009-06-24 20:16:09744 MockClientSocketFactory client_socket_factory_;
[email protected]17a0c6c2009-08-04 00:07:04745 TestConnectJobFactory* connect_job_factory_;
[email protected]df4b4ef2010-07-12 18:25:21746 scoped_refptr<TestSocketParams> params_;
danakj655b66c2016-04-16 00:51:38747 std::unique_ptr<TestClientSocketPool> pool_;
[email protected]2431756e2010-09-29 20:26:13748 ClientSocketPoolTest test_base_;
[email protected]f6d1d6eb2009-06-24 20:16:09749};
750
[email protected]5fc08e32009-07-15 17:09:57751TEST_F(ClientSocketPoolBaseTest, BasicSynchronous) {
[email protected]211d21722009-07-22 15:48:53752 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20753
[email protected]6ecf2b92011-12-15 01:14:52754 TestCompletionCallback callback;
[email protected]a512f5982009-08-18 16:01:06755 ClientSocketHandle handle;
vishal.b62985ca92015-04-17 08:45:51756 BoundTestNetLog log;
[email protected]034df0f32013-01-07 23:17:48757 TestLoadTimingInfoNotConnected(handle);
[email protected]9e743cd2010-03-16 07:03:53758
Paul Jensen8d6f87ec2018-01-13 00:46:54759 EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15760 ClientSocketPool::RespectLimits::ENABLED,
761 callback.callback(), pool_.get(), log.bound()));
[email protected]f6d1d6eb2009-06-24 20:16:09762 EXPECT_TRUE(handle.is_initialized());
763 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:48764 TestLoadTimingInfoConnectedNotReused(handle);
765
[email protected]f6d1d6eb2009-06-24 20:16:09766 handle.Reset();
[email protected]034df0f32013-01-07 23:17:48767 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30768
mmenke43758e62015-05-04 21:09:46769 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40770 log.GetEntries(&entries);
771
772 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:00773 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]9e743cd2010-03-16 07:03:53774 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00775 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
776 NetLogEventPhase::NONE));
777 EXPECT_TRUE(LogContainsEvent(entries, 2,
778 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
779 NetLogEventPhase::NONE));
780 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09781}
782
[email protected]ab838892009-06-30 18:49:05783TEST_F(ClientSocketPoolBaseTest, InitConnectionFailure) {
[email protected]211d21722009-07-22 15:48:53784 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:20785
[email protected]ab838892009-06-30 18:49:05786 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
vishal.b62985ca92015-04-17 08:45:51787 BoundTestNetLog log;
[email protected]9e743cd2010-03-16 07:03:53788
[email protected]2431756e2010-09-29 20:26:13789 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:52790 TestCompletionCallback callback;
[email protected]e60e47a2010-07-14 03:37:18791 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:13792 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:43793 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:45794 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:13795 handle.set_ssl_error_response_info(info);
796 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:54797 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:15798 ClientSocketPool::RespectLimits::ENABLED,
799 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:13800 EXPECT_FALSE(handle.socket());
801 EXPECT_FALSE(handle.is_ssl_error());
802 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]034df0f32013-01-07 23:17:48803 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:30804
mmenke43758e62015-05-04 21:09:46805 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:40806 log.GetEntries(&entries);
807
808 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:00809 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:17810 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:00811 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
812 NetLogEventPhase::NONE));
813 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]f6d1d6eb2009-06-24 20:16:09814}
815
[email protected]211d21722009-07-22 15:48:53816TEST_F(ClientSocketPoolBaseTest, TotalLimit) {
817 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
818
[email protected]9e743cd2010-03-16 07:03:53819 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30820
robpercival214763f2016-07-01 23:27:01821 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
822 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
823 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
824 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53825
[email protected]2431756e2010-09-29 20:26:13826 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53827 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13828 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53829
robpercival214763f2016-07-01 23:27:01830 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
831 EXPECT_THAT(StartRequest("f", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
832 EXPECT_THAT(StartRequest("g", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53833
[email protected]2431756e2010-09-29 20:26:13834 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53835
[email protected]2431756e2010-09-29 20:26:13836 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53837 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13838 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53839
840 EXPECT_EQ(1, GetOrderOfRequest(1));
841 EXPECT_EQ(2, GetOrderOfRequest(2));
842 EXPECT_EQ(3, GetOrderOfRequest(3));
843 EXPECT_EQ(4, GetOrderOfRequest(4));
844 EXPECT_EQ(5, GetOrderOfRequest(5));
845 EXPECT_EQ(6, GetOrderOfRequest(6));
846 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17847
848 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13849 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:53850}
851
852TEST_F(ClientSocketPoolBaseTest, TotalLimitReachedNewGroup) {
853 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
854
[email protected]9e743cd2010-03-16 07:03:53855 // TODO(eroman): Check that the NetLog contains this event.
[email protected]fd7b7c92009-08-20 19:38:30856
[email protected]211d21722009-07-22 15:48:53857 // Reach all limits: max total sockets, and max sockets per group.
robpercival214763f2016-07-01 23:27:01858 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
859 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
860 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
861 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:53862
[email protected]2431756e2010-09-29 20:26:13863 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53864 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13865 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53866
867 // Now create a new group and verify that we don't starve it.
robpercival214763f2016-07-01 23:27:01868 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53869
[email protected]2431756e2010-09-29 20:26:13870 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53871
[email protected]2431756e2010-09-29 20:26:13872 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53873 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:13874 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53875
876 EXPECT_EQ(1, GetOrderOfRequest(1));
877 EXPECT_EQ(2, GetOrderOfRequest(2));
878 EXPECT_EQ(3, GetOrderOfRequest(3));
879 EXPECT_EQ(4, GetOrderOfRequest(4));
880 EXPECT_EQ(5, GetOrderOfRequest(5));
[email protected]75439d3b2009-07-23 22:11:17881
882 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13883 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:53884}
885
886TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsPriority) {
887 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
888
robpercival214763f2016-07-01 23:27:01889 EXPECT_THAT(StartRequest("b", LOWEST), IsOk());
890 EXPECT_THAT(StartRequest("a", MEDIUM), IsOk());
891 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
892 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
[email protected]211d21722009-07-22 15:48:53893
[email protected]2431756e2010-09-29 20:26:13894 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:53895 client_socket_factory_.allocation_count());
896
robpercival214763f2016-07-01 23:27:01897 EXPECT_THAT(StartRequest("c", LOWEST), IsError(ERR_IO_PENDING));
898 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
899 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:53900
[email protected]2431756e2010-09-29 20:26:13901 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:53902
[email protected]2431756e2010-09-29 20:26:13903 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:53904
905 // First 4 requests don't have to wait, and finish in order.
906 EXPECT_EQ(1, GetOrderOfRequest(1));
907 EXPECT_EQ(2, GetOrderOfRequest(2));
908 EXPECT_EQ(3, GetOrderOfRequest(3));
909 EXPECT_EQ(4, GetOrderOfRequest(4));
910
[email protected]ac790b42009-12-02 04:31:31911 // Request ("b", HIGHEST) has the highest priority, then ("a", MEDIUM),
912 // and then ("c", LOWEST).
[email protected]211d21722009-07-22 15:48:53913 EXPECT_EQ(7, GetOrderOfRequest(5));
914 EXPECT_EQ(6, GetOrderOfRequest(6));
915 EXPECT_EQ(5, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:17916
917 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:13918 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]211d21722009-07-22 15:48:53919}
920
rdsmith29dbad12017-02-17 02:22:18921// Test reprioritizing a request before completion doesn't interfere with
922// its completion.
923TEST_F(ClientSocketPoolBaseTest, ReprioritizeOne) {
924 CreatePool(kDefaultMaxSockets, 1);
925
926 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
927 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
928 EXPECT_TRUE(request(0)->handle()->socket());
929 EXPECT_FALSE(request(1)->handle()->socket());
930
Lily Chenecebf932018-11-02 17:15:43931 request(1)->handle()->SetPriority(HIGHEST);
rdsmith29dbad12017-02-17 02:22:18932
933 ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE);
934
935 EXPECT_TRUE(request(1)->handle()->socket());
936}
937
938// Reprioritize a request up past another one and make sure that changes the
939// completion order.
940TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpReorder) {
941 CreatePool(kDefaultMaxSockets, 1);
942
943 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
944 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
945 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
946 EXPECT_TRUE(request(0)->handle()->socket());
947 EXPECT_FALSE(request(1)->handle()->socket());
948 EXPECT_FALSE(request(2)->handle()->socket());
949
950 request(2)->handle()->SetPriority(HIGHEST);
951
952 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
953
954 EXPECT_EQ(1, GetOrderOfRequest(1));
955 EXPECT_EQ(3, GetOrderOfRequest(2));
956 EXPECT_EQ(2, GetOrderOfRequest(3));
957}
958
959// Reprioritize a request without changing relative priorities and check
960// that the order doesn't change.
961TEST_F(ClientSocketPoolBaseTest, ReprioritizeUpNoReorder) {
962 CreatePool(kDefaultMaxSockets, 1);
963
964 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
965 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
966 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
967 EXPECT_TRUE(request(0)->handle()->socket());
968 EXPECT_FALSE(request(1)->handle()->socket());
969 EXPECT_FALSE(request(2)->handle()->socket());
970
971 request(2)->handle()->SetPriority(MEDIUM);
972
973 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
974
975 EXPECT_EQ(1, GetOrderOfRequest(1));
976 EXPECT_EQ(2, GetOrderOfRequest(2));
977 EXPECT_EQ(3, GetOrderOfRequest(3));
978}
979
980// Reprioritize a request past down another one and make sure that changes the
981// completion order.
982TEST_F(ClientSocketPoolBaseTest, ReprioritizeDownReorder) {
983 CreatePool(kDefaultMaxSockets, 1);
984
985 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
986 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
987 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
988 EXPECT_TRUE(request(0)->handle()->socket());
989 EXPECT_FALSE(request(1)->handle()->socket());
990 EXPECT_FALSE(request(2)->handle()->socket());
991
992 request(1)->handle()->SetPriority(LOW);
993
994 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
995
996 EXPECT_EQ(1, GetOrderOfRequest(1));
997 EXPECT_EQ(3, GetOrderOfRequest(2));
998 EXPECT_EQ(2, GetOrderOfRequest(3));
999}
1000
1001// Reprioritize a request to the same level as another and confirm it is
1002// put after the old request.
1003TEST_F(ClientSocketPoolBaseTest, ReprioritizeResetFIFO) {
1004 CreatePool(kDefaultMaxSockets, 1);
1005
1006 EXPECT_THAT(StartRequest("a", LOWEST), IsError(OK));
1007 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1008 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1009 EXPECT_TRUE(request(0)->handle()->socket());
1010 EXPECT_FALSE(request(1)->handle()->socket());
1011 EXPECT_FALSE(request(2)->handle()->socket());
1012
1013 request(1)->handle()->SetPriority(MEDIUM);
1014
1015 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
1016
1017 EXPECT_EQ(1, GetOrderOfRequest(1));
1018 EXPECT_EQ(3, GetOrderOfRequest(2));
1019 EXPECT_EQ(2, GetOrderOfRequest(3));
1020}
1021
[email protected]211d21722009-07-22 15:48:531022TEST_F(ClientSocketPoolBaseTest, TotalLimitRespectsGroupLimit) {
1023 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1024
robpercival214763f2016-07-01 23:27:011025 EXPECT_THAT(StartRequest("a", LOWEST), IsOk());
1026 EXPECT_THAT(StartRequest("a", LOW), IsOk());
1027 EXPECT_THAT(StartRequest("b", HIGHEST), IsOk());
1028 EXPECT_THAT(StartRequest("b", MEDIUM), IsOk());
[email protected]211d21722009-07-22 15:48:531029
[email protected]2431756e2010-09-29 20:26:131030 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531031 client_socket_factory_.allocation_count());
1032
robpercival214763f2016-07-01 23:27:011033 EXPECT_THAT(StartRequest("c", MEDIUM), IsError(ERR_IO_PENDING));
1034 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1035 EXPECT_THAT(StartRequest("b", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531036
[email protected]2431756e2010-09-29 20:26:131037 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531038
[email protected]2431756e2010-09-29 20:26:131039 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531040 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131041 EXPECT_EQ(requests_size() - kDefaultMaxSockets, completion_count());
[email protected]211d21722009-07-22 15:48:531042
1043 // First 4 requests don't have to wait, and finish in order.
1044 EXPECT_EQ(1, GetOrderOfRequest(1));
1045 EXPECT_EQ(2, GetOrderOfRequest(2));
1046 EXPECT_EQ(3, GetOrderOfRequest(3));
1047 EXPECT_EQ(4, GetOrderOfRequest(4));
1048
1049 // Request ("b", 7) has the highest priority, but we can't make new socket for
1050 // group "b", because it has reached the per-group limit. Then we make
1051 // socket for ("c", 6), because it has higher priority than ("a", 4),
1052 // and we still can't make a socket for group "b".
1053 EXPECT_EQ(5, GetOrderOfRequest(5));
1054 EXPECT_EQ(6, GetOrderOfRequest(6));
1055 EXPECT_EQ(7, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171056
1057 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131058 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]211d21722009-07-22 15:48:531059}
1060
1061// Make sure that we count connecting sockets against the total limit.
1062TEST_F(ClientSocketPoolBaseTest, TotalLimitCountsConnectingSockets) {
1063 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1064
robpercival214763f2016-07-01 23:27:011065 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1066 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
1067 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsOk());
[email protected]211d21722009-07-22 15:48:531068
1069 // Create one asynchronous request.
1070 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
robpercival214763f2016-07-01 23:27:011071 EXPECT_THAT(StartRequest("d", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531072
[email protected]6b175382009-10-13 06:47:471073 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
1074 // actually become pending until 2ms after they have been created. In order
1075 // to flush all tasks, we need to wait so that we know there are no
1076 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:451077 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]6b175382009-10-13 06:47:471078
[email protected]211d21722009-07-22 15:48:531079 // The next synchronous request should wait for its turn.
1080 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
robpercival214763f2016-07-01 23:27:011081 EXPECT_THAT(StartRequest("e", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]211d21722009-07-22 15:48:531082
[email protected]2431756e2010-09-29 20:26:131083 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]211d21722009-07-22 15:48:531084
[email protected]2431756e2010-09-29 20:26:131085 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]211d21722009-07-22 15:48:531086 client_socket_factory_.allocation_count());
1087
1088 EXPECT_EQ(1, GetOrderOfRequest(1));
1089 EXPECT_EQ(2, GetOrderOfRequest(2));
1090 EXPECT_EQ(3, GetOrderOfRequest(3));
1091 EXPECT_EQ(4, GetOrderOfRequest(4));
[email protected]75439d3b2009-07-23 22:11:171092 EXPECT_EQ(5, GetOrderOfRequest(5));
1093
1094 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131095 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(6));
[email protected]211d21722009-07-22 15:48:531096}
1097
[email protected]6427fe22010-04-16 22:27:411098TEST_F(ClientSocketPoolBaseTest, CorrectlyCountStalledGroups) {
1099 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1100 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1101
robpercival214763f2016-07-01 23:27:011102 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1103 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1104 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1105 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]6427fe22010-04-16 22:27:411106
1107 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1108
1109 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1110
robpercival214763f2016-07-01 23:27:011111 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1112 EXPECT_THAT(StartRequest("c", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]6427fe22010-04-16 22:27:411113
1114 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1115
[email protected]2431756e2010-09-29 20:26:131116 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411117 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131118 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411119 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131120 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1121 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]6427fe22010-04-16 22:27:411122 EXPECT_EQ(kDefaultMaxSockets + 2, client_socket_factory_.allocation_count());
1123}
1124
[email protected]d7027bb2010-05-10 18:58:541125TEST_F(ClientSocketPoolBaseTest, StallAndThenCancelAndTriggerAvailableSocket) {
1126 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
1127 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1128
1129 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521130 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131131 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541132 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151133 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201134 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541135
1136 ClientSocketHandle handles[4];
Avi Drissman4365a4782018-12-28 19:26:241137 for (size_t i = 0; i < base::size(handles); ++i) {
[email protected]6ecf2b92011-12-15 01:14:521138 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201139 EXPECT_EQ(
1140 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541141 handles[i].Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201142 ClientSocketPool::RespectLimits::ENABLED,
1143 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:541144 }
1145
1146 // One will be stalled, cancel all the handles now.
1147 // This should hit the OnAvailableSocketSlot() code where we previously had
1148 // stalled groups, but no longer have any.
Avi Drissman4365a4782018-12-28 19:26:241149 for (size_t i = 0; i < base::size(handles); ++i)
[email protected]d7027bb2010-05-10 18:58:541150 handles[i].Reset();
1151}
1152
[email protected]eb5a99382010-07-11 03:18:261153TEST_F(ClientSocketPoolBaseTest, CancelStalledSocketAtSocketLimit) {
[email protected]43a21b82010-06-10 21:30:541154 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1155 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1156
[email protected]eb5a99382010-07-11 03:18:261157 {
1158 ClientSocketHandle handles[kDefaultMaxSockets];
[email protected]6ecf2b92011-12-15 01:14:521159 TestCompletionCallback callbacks[kDefaultMaxSockets];
[email protected]eb5a99382010-07-11 03:18:261160 for (int i = 0; i < kDefaultMaxSockets; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:541161 EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), params_,
1162 DEFAULT_PRIORITY, SocketTag(),
1163 ClientSocketPool::RespectLimits::ENABLED,
1164 callbacks[i].callback(), pool_.get(),
1165 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261166 }
1167
1168 // Force a stalled group.
1169 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521170 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201171 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541172 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201173 ClientSocketPool::RespectLimits::ENABLED,
1174 callback.callback(), pool_.get(),
1175 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261176
1177 // Cancel the stalled request.
1178 stalled_handle.Reset();
1179
1180 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1181 EXPECT_EQ(0, pool_->IdleSocketCount());
1182
1183 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541184 }
1185
[email protected]43a21b82010-06-10 21:30:541186 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1187 EXPECT_EQ(kDefaultMaxSockets, pool_->IdleSocketCount());
[email protected]eb5a99382010-07-11 03:18:261188}
[email protected]43a21b82010-06-10 21:30:541189
[email protected]eb5a99382010-07-11 03:18:261190TEST_F(ClientSocketPoolBaseTest, CancelPendingSocketAtSocketLimit) {
1191 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1192 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1193
1194 {
1195 ClientSocketHandle handles[kDefaultMaxSockets];
1196 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521197 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201198 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541199 handles[i].Init(
1200 base::IntToString(i), params_, DEFAULT_PRIORITY,
1201 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
1202 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261203 }
1204
1205 // Force a stalled group.
1206 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1207 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521208 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201209 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541210 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201211 ClientSocketPool::RespectLimits::ENABLED,
1212 callback.callback(), pool_.get(),
1213 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261214
1215 // Since it is stalled, it should have no connect jobs.
1216 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
Lily Chenecebf932018-11-02 17:15:431217 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101218 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261219
1220 // Cancel the stalled request.
1221 handles[0].Reset();
1222
[email protected]eb5a99382010-07-11 03:18:261223 // Now we should have a connect job.
1224 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("foo"));
Lily Chenecebf932018-11-02 17:15:431225 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101226 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261227
1228 // The stalled socket should connect.
robpercival214763f2016-07-01 23:27:011229 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261230
1231 EXPECT_EQ(kDefaultMaxSockets + 1,
1232 client_socket_factory_.allocation_count());
1233 EXPECT_EQ(0, pool_->IdleSocketCount());
1234 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo"));
Lily Chenecebf932018-11-02 17:15:431235 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("foo"));
[email protected]8159a1c2012-06-07 00:00:101236 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("foo"));
[email protected]eb5a99382010-07-11 03:18:261237
1238 // Dropping out of scope will close all handles and return them to idle.
[email protected]43a21b82010-06-10 21:30:541239 }
1240
[email protected]eb5a99382010-07-11 03:18:261241 EXPECT_EQ(1, pool_->IdleSocketCount());
1242}
[email protected]43a21b82010-06-10 21:30:541243
[email protected]eb5a99382010-07-11 03:18:261244TEST_F(ClientSocketPoolBaseTest, WaitForStalledSocketAtSocketLimit) {
1245 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1246 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]43a21b82010-06-10 21:30:541247
[email protected]eb5a99382010-07-11 03:18:261248 ClientSocketHandle stalled_handle;
[email protected]6ecf2b92011-12-15 01:14:521249 TestCompletionCallback callback;
[email protected]eb5a99382010-07-11 03:18:261250 {
[email protected]51fdc7c2012-04-10 19:19:481251 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261252 ClientSocketHandle handles[kDefaultMaxSockets];
1253 for (int i = 0; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:521254 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201255 EXPECT_EQ(OK, handles[i].Init(base::StringPrintf("Take 2: %d", i),
Paul Jensen8d6f87ec2018-01-13 00:46:541256 params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201257 ClientSocketPool::RespectLimits::ENABLED,
1258 callback.callback(), pool_.get(),
1259 NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:261260 }
1261
1262 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1263 EXPECT_EQ(0, pool_->IdleSocketCount());
[email protected]51fdc7c2012-04-10 19:19:481264 EXPECT_FALSE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261265
1266 // Now we will hit the socket limit.
tfarina428341112016-09-22 13:38:201267 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541268 stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201269 ClientSocketPool::RespectLimits::ENABLED,
1270 callback.callback(), pool_.get(),
1271 NetLogWithSource()));
[email protected]51fdc7c2012-04-10 19:19:481272 EXPECT_TRUE(pool_->IsStalled());
[email protected]eb5a99382010-07-11 03:18:261273
1274 // Dropping out of scope will close all handles and return them to idle.
1275 }
[email protected]43a21b82010-06-10 21:30:541276
1277 // But if we wait for it, the released idle sockets will be closed in
1278 // preference of the waiting request.
robpercival214763f2016-07-01 23:27:011279 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:261280
1281 EXPECT_EQ(kDefaultMaxSockets + 1, client_socket_factory_.allocation_count());
1282 EXPECT_EQ(3, pool_->IdleSocketCount());
[email protected]43a21b82010-06-10 21:30:541283}
1284
1285// Regression test for http://crbug.com/40952.
1286TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketAtSocketLimitDeleteGroup) {
1287 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]06d94042010-08-25 01:45:221288 pool_->EnableConnectBackupJobs();
[email protected]43a21b82010-06-10 21:30:541289 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
1290
1291 for (int i = 0; i < kDefaultMaxSockets; ++i) {
1292 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521293 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:201294 EXPECT_EQ(
1295 OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY,
Paul Jensen8d6f87ec2018-01-13 00:46:541296 SocketTag(), ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201297 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541298 }
1299
1300 // Flush all the DoReleaseSocket tasks.
fdoray5eeb7642016-06-22 16:11:281301 base::RunLoop().RunUntilIdle();
[email protected]43a21b82010-06-10 21:30:541302
1303 // Stall a group. Set a pending job so it'll trigger a backup job if we don't
1304 // reuse a socket.
1305 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1306 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521307 TestCompletionCallback callback;
[email protected]43a21b82010-06-10 21:30:541308
1309 // "0" is special here, since it should be the first entry in the sorted map,
1310 // which is the one which we would close an idle socket for. We shouldn't
1311 // close an idle socket though, since we should reuse the idle socket.
tfarina428341112016-09-22 13:38:201312 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:541313 handle.Init("0", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201314 ClientSocketPool::RespectLimits::ENABLED,
1315 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]43a21b82010-06-10 21:30:541316
1317 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
1318 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount());
1319}
1320
[email protected]ab838892009-06-30 18:49:051321TEST_F(ClientSocketPoolBaseTest, PendingRequests) {
[email protected]211d21722009-07-22 15:48:531322 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091323
robpercival214763f2016-07-01 23:27:011324 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1325 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1326 EXPECT_THAT(StartRequest("a", IDLE), IsError(ERR_IO_PENDING));
1327 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1328 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1329 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1330 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1331 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091332
[email protected]2431756e2010-09-29 20:26:131333 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]c9d6a1d2009-07-14 16:15:201334 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1335 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131336 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1337 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091338
[email protected]c9d6a1d2009-07-14 16:15:201339 EXPECT_EQ(1, GetOrderOfRequest(1));
1340 EXPECT_EQ(2, GetOrderOfRequest(2));
[email protected]c9c6f5c2010-07-31 01:30:031341 EXPECT_EQ(8, GetOrderOfRequest(3));
1342 EXPECT_EQ(6, GetOrderOfRequest(4));
1343 EXPECT_EQ(4, GetOrderOfRequest(5));
1344 EXPECT_EQ(3, GetOrderOfRequest(6));
1345 EXPECT_EQ(5, GetOrderOfRequest(7));
1346 EXPECT_EQ(7, GetOrderOfRequest(8));
[email protected]75439d3b2009-07-23 22:11:171347
1348 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131349 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(9));
[email protected]f6d1d6eb2009-06-24 20:16:091350}
1351
[email protected]ab838892009-06-30 18:49:051352TEST_F(ClientSocketPoolBaseTest, PendingRequests_NoKeepAlive) {
[email protected]211d21722009-07-22 15:48:531353 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091354
robpercival214763f2016-07-01 23:27:011355 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1356 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1357 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1358 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1359 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1360 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1361 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091362
[email protected]2431756e2010-09-29 20:26:131363 ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091364
[email protected]2431756e2010-09-29 20:26:131365 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i)
robpercival214763f2016-07-01 23:27:011366 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]c9d6a1d2009-07-14 16:15:201367
[email protected]2431756e2010-09-29 20:26:131368 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]c9d6a1d2009-07-14 16:15:201369 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131370 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1371 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091372}
1373
1374// This test will start up a RequestSocket() and then immediately Cancel() it.
[email protected]ab838892009-06-30 18:49:051375// The pending connect job will be cancelled and should not call back into
1376// ClientSocketPoolBase.
1377TEST_F(ClientSocketPoolBaseTest, CancelRequestClearGroup) {
[email protected]211d21722009-07-22 15:48:531378 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201379
[email protected]ab838892009-06-30 18:49:051380 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131381 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521382 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:151383 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541384 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151385 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201386 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:131387 handle.Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091388}
1389
[email protected]ab838892009-06-30 18:49:051390TEST_F(ClientSocketPoolBaseTest, ConnectCancelConnect) {
[email protected]211d21722009-07-22 15:48:531391 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201392
[email protected]ab838892009-06-30 18:49:051393 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061394 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521395 TestCompletionCallback callback;
[email protected]f6d1d6eb2009-06-24 20:16:091396
mmenked3641e12016-01-28 16:06:151397 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541398 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151399 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201400 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091401
1402 handle.Reset();
1403
[email protected]6ecf2b92011-12-15 01:14:521404 TestCompletionCallback callback2;
[email protected]2431756e2010-09-29 20:26:131405 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541406 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151407 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201408 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]f6d1d6eb2009-06-24 20:16:091409
robpercival214763f2016-07-01 23:27:011410 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091411 EXPECT_FALSE(callback.have_result());
1412
1413 handle.Reset();
1414}
1415
[email protected]ab838892009-06-30 18:49:051416TEST_F(ClientSocketPoolBaseTest, CancelRequest) {
[email protected]211d21722009-07-22 15:48:531417 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]f6d1d6eb2009-06-24 20:16:091418
robpercival214763f2016-07-01 23:27:011419 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1420 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1421 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1422 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1423 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
1424 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1425 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091426
1427 // Cancel a request.
[email protected]c9d6a1d2009-07-14 16:15:201428 size_t index_to_cancel = kDefaultMaxSocketsPerGroup + 2;
[email protected]2431756e2010-09-29 20:26:131429 EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
1430 (*requests())[index_to_cancel]->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091431
[email protected]2431756e2010-09-29 20:26:131432 ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
[email protected]f6d1d6eb2009-06-24 20:16:091433
[email protected]c9d6a1d2009-07-14 16:15:201434 EXPECT_EQ(kDefaultMaxSocketsPerGroup,
1435 client_socket_factory_.allocation_count());
[email protected]2431756e2010-09-29 20:26:131436 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup - 1,
1437 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091438
[email protected]c9d6a1d2009-07-14 16:15:201439 EXPECT_EQ(1, GetOrderOfRequest(1));
1440 EXPECT_EQ(2, GetOrderOfRequest(2));
1441 EXPECT_EQ(5, GetOrderOfRequest(3));
1442 EXPECT_EQ(3, GetOrderOfRequest(4));
[email protected]2431756e2010-09-29 20:26:131443 EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
1444 GetOrderOfRequest(5)); // Canceled request.
[email protected]c9d6a1d2009-07-14 16:15:201445 EXPECT_EQ(4, GetOrderOfRequest(6));
1446 EXPECT_EQ(6, GetOrderOfRequest(7));
[email protected]75439d3b2009-07-23 22:11:171447
1448 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:131449 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(8));
[email protected]f6d1d6eb2009-06-24 20:16:091450}
1451
mmenke33d24423d2015-05-19 19:41:091452// Function to be used as a callback on socket request completion. It first
1453// disconnects the successfully connected socket from the first request, and
1454// then reuses the ClientSocketHandle to request another socket.
1455//
1456// |nested_callback| is called with the result of the second socket request.
1457void RequestSocketOnComplete(ClientSocketHandle* handle,
1458 TestClientSocketPool* pool,
1459 TestConnectJobFactory* test_connect_job_factory,
1460 TestConnectJob::JobType next_job_type,
Bence Békya4a50932018-08-10 13:39:411461 TestCompletionCallback* nested_callback,
mmenke33d24423d2015-05-19 19:41:091462 int first_request_result) {
robpercival214763f2016-07-01 23:27:011463 EXPECT_THAT(first_request_result, IsOk());
mmenke33d24423d2015-05-19 19:41:091464
1465 test_connect_job_factory->set_job_type(next_job_type);
1466
1467 // Don't allow reuse of the socket. Disconnect it and then release it.
1468 if (handle->socket())
1469 handle->socket()->Disconnect();
1470 handle->Reset();
1471
mmenked3641e12016-01-28 16:06:151472 scoped_refptr<TestSocketParams> params(new TestSocketParams());
mmenke33d24423d2015-05-19 19:41:091473 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541474 int rv = handle->Init("a", params, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151475 ClientSocketPool::RespectLimits::ENABLED,
Bence Békya4a50932018-08-10 13:39:411476 nested_callback->callback(), pool, NetLogWithSource());
mmenke33d24423d2015-05-19 19:41:091477 if (rv != ERR_IO_PENDING) {
1478 DCHECK_EQ(TestConnectJob::kMockJob, next_job_type);
Bence Békya4a50932018-08-10 13:39:411479 nested_callback->callback().Run(rv);
mmenke33d24423d2015-05-19 19:41:091480 } else {
1481 DCHECK_EQ(TestConnectJob::kMockPendingJob, next_job_type);
[email protected]6ecf2b92011-12-15 01:14:521482 }
mmenke33d24423d2015-05-19 19:41:091483}
[email protected]f6d1d6eb2009-06-24 20:16:091484
mmenke33d24423d2015-05-19 19:41:091485// Tests the case where a second socket is requested in a completion callback,
1486// and the second socket connects asynchronously. Reuses the same
1487// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581488TEST_F(ClientSocketPoolBaseTest, RequestPendingJobTwice) {
[email protected]211d21722009-07-22 15:48:531489 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201490
[email protected]0b7648c2009-07-06 20:14:011491 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061492 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091493 TestCompletionCallback second_result_callback;
1494 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541495 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1496 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091497 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1498 connect_job_factory_, TestConnectJob::kMockPendingJob,
Bence Békya4a50932018-08-10 13:39:411499 &second_result_callback),
tfarina428341112016-09-22 13:38:201500 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011501 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091502
robpercival214763f2016-07-01 23:27:011503 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]2ab05b52009-07-01 23:57:581504}
[email protected]f6d1d6eb2009-06-24 20:16:091505
mmenke33d24423d2015-05-19 19:41:091506// Tests the case where a second socket is requested in a completion callback,
1507// and the second socket connects synchronously. Reuses the same
1508// ClientSocketHandle for the second socket, after disconnecting the first.
[email protected]2ab05b52009-07-01 23:57:581509TEST_F(ClientSocketPoolBaseTest, RequestPendingJobThenSynchronous) {
[email protected]211d21722009-07-22 15:48:531510 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201511
[email protected]0b7648c2009-07-06 20:14:011512 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]a512f5982009-08-18 16:01:061513 ClientSocketHandle handle;
mmenke33d24423d2015-05-19 19:41:091514 TestCompletionCallback second_result_callback;
1515 int rv = handle.Init(
Paul Jensen8d6f87ec2018-01-13 00:46:541516 "a", params_, DEFAULT_PRIORITY, SocketTag(),
1517 ClientSocketPool::RespectLimits::ENABLED,
mmenke33d24423d2015-05-19 19:41:091518 base::Bind(&RequestSocketOnComplete, &handle, pool_.get(),
1519 connect_job_factory_, TestConnectJob::kMockPendingJob,
Bence Békya4a50932018-08-10 13:39:411520 &second_result_callback),
tfarina428341112016-09-22 13:38:201521 pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011522 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2ab05b52009-07-01 23:57:581523
robpercival214763f2016-07-01 23:27:011524 EXPECT_THAT(second_result_callback.WaitForResult(), IsOk());
[email protected]f6d1d6eb2009-06-24 20:16:091525}
1526
1527// Make sure that pending requests get serviced after active requests get
1528// cancelled.
[email protected]ab838892009-06-30 18:49:051529TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531530 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201531
[email protected]0b7648c2009-07-06 20:14:011532 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091533
robpercival214763f2016-07-01 23:27:011534 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1535 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1536 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1537 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1538 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1539 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1540 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091541
[email protected]c9d6a1d2009-07-14 16:15:201542 // Now, kDefaultMaxSocketsPerGroup requests should be active.
1543 // Let's cancel them.
1544 for (int i = 0; i < kDefaultMaxSocketsPerGroup; ++i) {
[email protected]2431756e2010-09-29 20:26:131545 ASSERT_FALSE(request(i)->handle()->is_initialized());
1546 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091547 }
1548
[email protected]f6d1d6eb2009-06-24 20:16:091549 // Let's wait for the rest to complete now.
[email protected]2431756e2010-09-29 20:26:131550 for (size_t i = kDefaultMaxSocketsPerGroup; i < requests_size(); ++i) {
robpercival214763f2016-07-01 23:27:011551 EXPECT_THAT(request(i)->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131552 request(i)->handle()->Reset();
[email protected]f6d1d6eb2009-06-24 20:16:091553 }
1554
[email protected]2431756e2010-09-29 20:26:131555 EXPECT_EQ(requests_size() - kDefaultMaxSocketsPerGroup,
1556 completion_count());
[email protected]f6d1d6eb2009-06-24 20:16:091557}
1558
1559// Make sure that pending requests get serviced after active requests fail.
[email protected]ab838892009-06-30 18:49:051560TEST_F(ClientSocketPoolBaseTest, FailingActiveRequestWithPendingRequests) {
[email protected]211d21722009-07-22 15:48:531561 const size_t kMaxSockets = 5;
1562 CreatePool(kMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]c9d6a1d2009-07-14 16:15:201563
[email protected]0b7648c2009-07-06 20:14:011564 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]f6d1d6eb2009-06-24 20:16:091565
[email protected]211d21722009-07-22 15:48:531566 const size_t kNumberOfRequests = 2 * kDefaultMaxSocketsPerGroup + 1;
1567 ASSERT_LE(kNumberOfRequests, kMaxSockets); // Otherwise the test will hang.
[email protected]f6d1d6eb2009-06-24 20:16:091568
1569 // Queue up all the requests
[email protected]211d21722009-07-22 15:48:531570 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011571 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]f6d1d6eb2009-06-24 20:16:091572
[email protected]211d21722009-07-22 15:48:531573 for (size_t i = 0; i < kNumberOfRequests; ++i)
robpercival214763f2016-07-01 23:27:011574 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]f6d1d6eb2009-06-24 20:16:091575}
1576
mmenke9d72fe42017-05-18 22:36:071577// Make sure that pending requests that complete synchronously get serviced
1578// after active requests fail. See https://crbug.com/723748
1579TEST_F(ClientSocketPoolBaseTest, HandleMultipleSyncFailuresAfterAsyncFailure) {
1580 const size_t kNumberOfRequests = 10;
1581 const size_t kMaxSockets = 1;
1582 CreatePool(kMaxSockets, kMaxSockets);
1583
1584 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1585
1586 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1587
1588 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
1589
1590 // Queue up all the other requests
1591 for (size_t i = 1; i < kNumberOfRequests; ++i)
1592 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1593
1594 // Make sure all requests fail, instead of hanging.
1595 for (size_t i = 0; i < kNumberOfRequests; ++i)
1596 EXPECT_THAT(request(i)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1597}
1598
[email protected]5fc08e32009-07-15 17:09:571599TEST_F(ClientSocketPoolBaseTest, CancelActiveRequestThenRequestSocket) {
[email protected]211d21722009-07-22 15:48:531600 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571601
1602 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1603
[email protected]2431756e2010-09-29 20:26:131604 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521605 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541606 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151607 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201608 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011609 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571610
1611 // Cancel the active request.
[email protected]2431756e2010-09-29 20:26:131612 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571613
Paul Jensen8d6f87ec2018-01-13 00:46:541614 rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151615 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201616 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011617 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1618 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571619
[email protected]2431756e2010-09-29 20:26:131620 EXPECT_FALSE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:481621 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]5fc08e32009-07-15 17:09:571622 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1623}
1624
xunjieli26619e72016-11-23 19:39:551625TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsForced) {
xunjieli26619e72016-11-23 19:39:551626 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1627 ClientSocketHandle handle;
1628 TestCompletionCallback callback;
1629 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541630 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551631 ClientSocketPool::RespectLimits::ENABLED,
1632 callback.callback(), pool_.get(), log.bound());
1633 EXPECT_THAT(rv, IsOk());
1634 handle.Reset();
1635 EXPECT_EQ(1, pool_->IdleSocketCount());
1636 pool_->CloseIdleSockets();
xunjieli26619e72016-11-23 19:39:551637}
1638
xunjieli92feb332017-03-03 17:19:231639TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsInGroupForced) {
xunjieli92feb332017-03-03 17:19:231640 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1641 TestCompletionCallback callback;
1642 BoundTestNetLog log;
1643 ClientSocketHandle handle1;
Paul Jensen8d6f87ec2018-01-13 00:46:541644 int rv = handle1.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231645 ClientSocketPool::RespectLimits::ENABLED,
1646 callback.callback(), pool_.get(), log.bound());
1647 EXPECT_THAT(rv, IsOk());
1648 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541649 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231650 ClientSocketPool::RespectLimits::ENABLED,
1651 callback.callback(), pool_.get(), log.bound());
1652 ClientSocketHandle handle3;
Paul Jensen8d6f87ec2018-01-13 00:46:541653 rv = handle3.Init("b", params_, LOWEST, SocketTag(),
xunjieli92feb332017-03-03 17:19:231654 ClientSocketPool::RespectLimits::ENABLED,
1655 callback.callback(), pool_.get(), log.bound());
1656 EXPECT_THAT(rv, IsOk());
1657 handle1.Reset();
1658 handle2.Reset();
1659 handle3.Reset();
1660 EXPECT_EQ(3, pool_->IdleSocketCount());
1661 pool_->CloseIdleSocketsInGroup("a");
1662 EXPECT_EQ(1, pool_->IdleSocketCount());
xunjieli92feb332017-03-03 17:19:231663}
1664
xunjieli26619e72016-11-23 19:39:551665TEST_F(ClientSocketPoolBaseTest, CleanUpUnusableIdleSockets) {
xunjieli26619e72016-11-23 19:39:551666 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1667 ClientSocketHandle handle;
1668 TestCompletionCallback callback;
1669 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541670 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551671 ClientSocketPool::RespectLimits::ENABLED,
1672 callback.callback(), pool_.get(), log.bound());
1673 EXPECT_THAT(rv, IsOk());
1674 StreamSocket* socket = handle.socket();
1675 handle.Reset();
1676 EXPECT_EQ(1, pool_->IdleSocketCount());
1677
1678 // Disconnect socket now to make the socket unusable.
1679 socket->Disconnect();
1680 ClientSocketHandle handle2;
Paul Jensen8d6f87ec2018-01-13 00:46:541681 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
xunjieli26619e72016-11-23 19:39:551682 ClientSocketPool::RespectLimits::ENABLED,
1683 callback.callback(), pool_.get(), log.bound());
1684 EXPECT_THAT(rv, IsOk());
1685 EXPECT_FALSE(handle2.is_reused());
xunjieli26619e72016-11-23 19:39:551686}
1687
[email protected]2b7523d2009-07-29 20:29:231688// Regression test for http://crbug.com/17985.
1689TEST_F(ClientSocketPoolBaseTest, GroupWithPendingRequestsIsNotEmpty) {
1690 const int kMaxSockets = 3;
1691 const int kMaxSocketsPerGroup = 2;
1692 CreatePool(kMaxSockets, kMaxSocketsPerGroup);
1693
[email protected]ac790b42009-12-02 04:31:311694 const RequestPriority kHighPriority = HIGHEST;
[email protected]2b7523d2009-07-29 20:29:231695
robpercival214763f2016-07-01 23:27:011696 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
1697 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231698
1699 // This is going to be a pending request in an otherwise empty group.
robpercival214763f2016-07-01 23:27:011700 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231701
1702 // Reach the maximum socket limit.
robpercival214763f2016-07-01 23:27:011703 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]2b7523d2009-07-29 20:29:231704
1705 // Create a stalled group with high priorities.
robpercival214763f2016-07-01 23:27:011706 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
1707 EXPECT_THAT(StartRequest("c", kHighPriority), IsError(ERR_IO_PENDING));
[email protected]2b7523d2009-07-29 20:29:231708
[email protected]eb5a99382010-07-11 03:18:261709 // Release the first two sockets from "a". Because this is a keepalive,
1710 // the first release will unblock the pending request for "a". The
1711 // second release will unblock a request for "c", becaue it is the next
1712 // high priority socket.
[email protected]2431756e2010-09-29 20:26:131713 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
1714 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::KEEP_ALIVE));
[email protected]2b7523d2009-07-29 20:29:231715
1716 // Closing idle sockets should not get us into trouble, but in the bug
1717 // we were hitting a CHECK here.
[email protected]93054cc12010-06-08 06:12:411718 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]43a21b82010-06-10 21:30:541719 pool_->CloseIdleSockets();
[email protected]eb5a99382010-07-11 03:18:261720
[email protected]2da659e2013-05-23 20:51:341721 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281722 base::RunLoop().RunUntilIdle();
[email protected]2b7523d2009-07-29 20:29:231723}
1724
[email protected]4d3b05d2010-01-27 21:27:291725TEST_F(ClientSocketPoolBaseTest, BasicAsynchronous) {
[email protected]211d21722009-07-22 15:48:531726 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571727
1728 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131729 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521730 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511731 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:541732 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:151733 ClientSocketPool::RespectLimits::ENABLED,
1734 callback.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:011735 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131736 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
[email protected]034df0f32013-01-07 23:17:481737 TestLoadTimingInfoNotConnected(handle);
1738
robpercival214763f2016-07-01 23:27:011739 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131740 EXPECT_TRUE(handle.is_initialized());
1741 EXPECT_TRUE(handle.socket());
[email protected]034df0f32013-01-07 23:17:481742 TestLoadTimingInfoConnectedNotReused(handle);
1743
[email protected]2431756e2010-09-29 20:26:131744 handle.Reset();
[email protected]034df0f32013-01-07 23:17:481745 TestLoadTimingInfoNotConnected(handle);
[email protected]fd7b7c92009-08-20 19:38:301746
mmenke43758e62015-05-04 21:09:461747 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401748 log.GetEntries(&entries);
1749
1750 EXPECT_EQ(4u, entries.size());
mikecirone8b85c432016-09-08 19:11:001751 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171752 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001753 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1754 NetLogEventPhase::NONE));
1755 EXPECT_TRUE(LogContainsEvent(entries, 2,
1756 NetLogEventType::SOCKET_POOL_BOUND_TO_SOCKET,
1757 NetLogEventPhase::NONE));
1758 EXPECT_TRUE(LogContainsEndEvent(entries, 3, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571759}
1760
[email protected]4d3b05d2010-01-27 21:27:291761TEST_F(ClientSocketPoolBaseTest,
[email protected]5fc08e32009-07-15 17:09:571762 InitConnectionAsynchronousFailure) {
[email protected]211d21722009-07-22 15:48:531763 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571764
1765 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]2431756e2010-09-29 20:26:131766 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521767 TestCompletionCallback callback;
vishal.b62985ca92015-04-17 08:45:511768 BoundTestNetLog log;
[email protected]e60e47a2010-07-14 03:37:181769 // Set the additional error state members to ensure that they get cleared.
[email protected]2431756e2010-09-29 20:26:131770 handle.set_is_ssl_error(true);
[email protected]8b498692010-07-16 17:11:431771 HttpResponseInfo info;
[email protected]007b3f82013-04-09 08:46:451772 info.headers = new HttpResponseHeaders(std::string());
[email protected]2431756e2010-09-29 20:26:131773 handle.set_ssl_error_response_info(info);
mmenked3641e12016-01-28 16:06:151774 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541775 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151776 ClientSocketPool::RespectLimits::ENABLED,
1777 callback.callback(), pool_.get(), log.bound()));
[email protected]2431756e2010-09-29 20:26:131778 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:011779 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:131780 EXPECT_FALSE(handle.is_ssl_error());
1781 EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]fd7b7c92009-08-20 19:38:301782
mmenke43758e62015-05-04 21:09:461783 TestNetLogEntry::List entries;
[email protected]b2fcd0e2010-12-01 15:19:401784 log.GetEntries(&entries);
1785
1786 EXPECT_EQ(3u, entries.size());
mikecirone8b85c432016-09-08 19:11:001787 EXPECT_TRUE(LogContainsBeginEvent(entries, 0, NetLogEventType::SOCKET_POOL));
[email protected]06650c52010-06-03 00:49:171788 EXPECT_TRUE(LogContainsEvent(
mikecirone8b85c432016-09-08 19:11:001789 entries, 1, NetLogEventType::SOCKET_POOL_BOUND_TO_CONNECT_JOB,
1790 NetLogEventPhase::NONE));
1791 EXPECT_TRUE(LogContainsEndEvent(entries, 2, NetLogEventType::SOCKET_POOL));
[email protected]5fc08e32009-07-15 17:09:571792}
1793
mmenke6be122f2015-03-09 22:22:471794// Check that an async ConnectJob failure does not result in creation of a new
1795// ConnectJob when there's another pending request also waiting on its own
1796// ConnectJob. See http://crbug.com/463960.
1797TEST_F(ClientSocketPoolBaseTest, AsyncFailureWithPendingRequestWithJob) {
1798 CreatePool(2, 2);
1799 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
1800
robpercival214763f2016-07-01 23:27:011801 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
1802 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
mmenke6be122f2015-03-09 22:22:471803
robpercival214763f2016-07-01 23:27:011804 EXPECT_THAT(request(0)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1805 EXPECT_THAT(request(1)->WaitForResult(), IsError(ERR_CONNECTION_FAILED));
mmenke6be122f2015-03-09 22:22:471806
1807 EXPECT_EQ(2, client_socket_factory_.allocation_count());
1808}
1809
[email protected]4d3b05d2010-01-27 21:27:291810TEST_F(ClientSocketPoolBaseTest, TwoRequestsCancelOne) {
[email protected]b22b5162010-03-16 07:53:101811 // TODO(eroman): Add back the log expectations! Removed them because the
1812 // ordering is difficult, and some may fire during destructor.
[email protected]211d21722009-07-22 15:48:531813 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571814
1815 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]2431756e2010-09-29 20:26:131816 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521817 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:131818 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:521819 TestCompletionCallback callback2;
[email protected]5fc08e32009-07-15 17:09:571820
[email protected]2431756e2010-09-29 20:26:131821 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541822 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151823 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201824 callback.callback(), pool_.get(), NetLogWithSource()));
vishal.b62985ca92015-04-17 08:45:511825 BoundTestNetLog log2;
tfarina428341112016-09-22 13:38:201826 EXPECT_EQ(
1827 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:541828 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:201829 ClientSocketPool::RespectLimits::ENABLED,
1830 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]5fc08e32009-07-15 17:09:571831
[email protected]2431756e2010-09-29 20:26:131832 handle.Reset();
[email protected]5fc08e32009-07-15 17:09:571833
[email protected]fd7b7c92009-08-20 19:38:301834
1835 // At this point, request 2 is just waiting for the connect job to finish.
[email protected]fd7b7c92009-08-20 19:38:301836
robpercival214763f2016-07-01 23:27:011837 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:131838 handle2.Reset();
[email protected]fd7b7c92009-08-20 19:38:301839
1840 // Now request 2 has actually finished.
[email protected]9e743cd2010-03-16 07:03:531841 // TODO(eroman): Add back log expectations.
[email protected]5fc08e32009-07-15 17:09:571842}
1843
[email protected]4d3b05d2010-01-27 21:27:291844TEST_F(ClientSocketPoolBaseTest, CancelRequestLimitsJobs) {
[email protected]974ebd62009-08-03 23:14:341845 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
1846
[email protected]17a0c6c2009-08-04 00:07:041847 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
1848
robpercival214763f2016-07-01 23:27:011849 EXPECT_THAT(StartRequest("a", LOWEST), IsError(ERR_IO_PENDING));
1850 EXPECT_THAT(StartRequest("a", LOW), IsError(ERR_IO_PENDING));
1851 EXPECT_THAT(StartRequest("a", MEDIUM), IsError(ERR_IO_PENDING));
1852 EXPECT_THAT(StartRequest("a", HIGHEST), IsError(ERR_IO_PENDING));
[email protected]974ebd62009-08-03 23:14:341853
1854 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]2431756e2010-09-29 20:26:131855 (*requests())[2]->handle()->Reset();
1856 (*requests())[3]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341857 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1858
[email protected]2431756e2010-09-29 20:26:131859 (*requests())[1]->handle()->Reset();
[email protected]974ebd62009-08-03 23:14:341860 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
1861
[email protected]2431756e2010-09-29 20:26:131862 (*requests())[0]->handle()->Reset();
[email protected]eb5a99382010-07-11 03:18:261863 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->NumConnectJobsInGroup("a"));
[email protected]974ebd62009-08-03 23:14:341864}
1865
[email protected]5fc08e32009-07-15 17:09:571866// When requests and ConnectJobs are not coupled, the request will get serviced
1867// by whatever comes first.
[email protected]4d3b05d2010-01-27 21:27:291868TEST_F(ClientSocketPoolBaseTest, ReleaseSockets) {
[email protected]211d21722009-07-22 15:48:531869 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571870
1871 // Start job 1 (async OK)
[email protected]b59ff372009-07-15 22:04:321872 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]5fc08e32009-07-15 17:09:571873
[email protected]2431756e2010-09-29 20:26:131874 std::vector<TestSocketRequest*> request_order;
1875 size_t completion_count; // unused
1876 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541877 int rv =
1878 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1879 ClientSocketPool::RespectLimits::ENABLED,
1880 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011881 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1882 EXPECT_THAT(req1.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571883
1884 // Job 1 finished OK. Start job 2 (also async OK). Request 3 is pending
1885 // without a job.
1886 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1887
[email protected]2431756e2010-09-29 20:26:131888 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541889 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151890 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201891 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011892 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]2431756e2010-09-29 20:26:131893 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541894 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151895 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201896 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011897 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571898
1899 // Both Requests 2 and 3 are pending. We release socket 1 which should
1900 // service request 2. Request 3 should still be waiting.
[email protected]a6c59f62009-07-29 16:33:331901 req1.handle()->Reset();
[email protected]2da659e2013-05-23 20:51:341902 // Run the released socket wakeups.
fdoray5eeb7642016-06-22 16:11:281903 base::RunLoop().RunUntilIdle();
[email protected]a6c59f62009-07-29 16:33:331904 ASSERT_TRUE(req2.handle()->socket());
robpercival214763f2016-07-01 23:27:011905 EXPECT_THAT(req2.WaitForResult(), IsOk());
[email protected]a6c59f62009-07-29 16:33:331906 EXPECT_FALSE(req3.handle()->socket());
[email protected]5fc08e32009-07-15 17:09:571907
1908 // Signal job 2, which should service request 3.
1909
1910 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:011911 EXPECT_THAT(req3.WaitForResult(), IsOk());
[email protected]5fc08e32009-07-15 17:09:571912
[email protected]2431756e2010-09-29 20:26:131913 ASSERT_EQ(3U, request_order.size());
1914 EXPECT_EQ(&req1, request_order[0]);
1915 EXPECT_EQ(&req2, request_order[1]);
1916 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571917 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
1918}
1919
1920// The requests are not coupled to the jobs. So, the requests should finish in
1921// their priority / insertion order.
[email protected]4d3b05d2010-01-27 21:27:291922TEST_F(ClientSocketPoolBaseTest, PendingJobCompletionOrder) {
[email protected]211d21722009-07-22 15:48:531923 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]5fc08e32009-07-15 17:09:571924 // First two jobs are async.
[email protected]b59ff372009-07-15 22:04:321925 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
[email protected]5fc08e32009-07-15 17:09:571926
[email protected]2431756e2010-09-29 20:26:131927 std::vector<TestSocketRequest*> request_order;
1928 size_t completion_count; // unused
1929 TestSocketRequest req1(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541930 int rv =
1931 req1.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
1932 ClientSocketPool::RespectLimits::ENABLED,
1933 req1.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011934 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571935
[email protected]2431756e2010-09-29 20:26:131936 TestSocketRequest req2(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541937 rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151938 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201939 req2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011940 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571941
1942 // The pending job is sync.
[email protected]b59ff372009-07-15 22:04:321943 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
[email protected]5fc08e32009-07-15 17:09:571944
[email protected]2431756e2010-09-29 20:26:131945 TestSocketRequest req3(&request_order, &completion_count);
Paul Jensen8d6f87ec2018-01-13 00:46:541946 rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151947 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201948 req3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011949 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]5fc08e32009-07-15 17:09:571950
robpercival214763f2016-07-01 23:27:011951 EXPECT_THAT(req1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
1952 EXPECT_THAT(req2.WaitForResult(), IsOk());
1953 EXPECT_THAT(req3.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]5fc08e32009-07-15 17:09:571954
[email protected]2431756e2010-09-29 20:26:131955 ASSERT_EQ(3U, request_order.size());
1956 EXPECT_EQ(&req1, request_order[0]);
1957 EXPECT_EQ(&req2, request_order[1]);
1958 EXPECT_EQ(&req3, request_order[2]);
[email protected]5fc08e32009-07-15 17:09:571959}
1960
[email protected]03b7c8c2013-07-20 04:38:551961// Test GetLoadState in the case there's only one socket request.
1962TEST_F(ClientSocketPoolBaseTest, LoadStateOneRequest) {
[email protected]211d21722009-07-22 15:48:531963 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
[email protected]03b7c8c2013-07-20 04:38:551964 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]5fc08e32009-07-15 17:09:571965
[email protected]2431756e2010-09-29 20:26:131966 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:521967 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541968 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151969 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201970 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011971 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:551972 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:571973
[email protected]03b7c8c2013-07-20 04:38:551974 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
1975 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
1976
1977 // No point in completing the connection, since ClientSocketHandles only
1978 // expect the LoadState to be checked while connecting.
1979}
1980
1981// Test GetLoadState in the case there are two socket requests.
haavardm835c1d62015-04-22 08:18:001982// Only the first connection in the pool should affect the pool's load status.
[email protected]03b7c8c2013-07-20 04:38:551983TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequests) {
1984 CreatePool(2, 2);
1985 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
1986
1987 ClientSocketHandle handle;
1988 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:541989 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151990 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201991 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:011992 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:001993 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST);
1994
1995 ClientSocketHandle handle2;
1996 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:541997 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:151998 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:201999 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012000 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002001 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
2002
2003 // Check that both handles report the state of the first job.
2004 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle.GetLoadState());
2005 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
2006
2007 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_CONNECTING);
2008
2009 // Check that both handles change to LOAD_STATE_CONNECTING.
2010 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2011 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2012}
2013
2014// Test that the second connection request does not affect the pool's load
2015// status.
2016TEST_F(ClientSocketPoolBaseTest, LoadStateTwoRequestsChangeSecondRequestState) {
2017 CreatePool(2, 2);
2018 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2019
2020 ClientSocketHandle handle;
2021 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]5fc08e32009-07-15 17:09:572026
[email protected]2431756e2010-09-29 20:26:132027 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522028 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542029 rv = handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152030 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202031 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012032 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
haavardm835c1d62015-04-22 08:18:002033 client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST);
[email protected]03b7c8c2013-07-20 04:38:552034
[email protected]03b7c8c2013-07-20 04:38:552035 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2036 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2037
haavardm835c1d62015-04-22 08:18:002038 // First job connects and the first request gets the socket. The
[email protected]03b7c8c2013-07-20 04:38:552039 // second handle switches to the state of the remaining ConnectJob.
2040 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012041 EXPECT_THAT(callback.WaitForResult(), IsOk());
haavardm835c1d62015-04-22 08:18:002042 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST, handle2.GetLoadState());
[email protected]03b7c8c2013-07-20 04:38:552043}
2044
2045// Test GetLoadState in the case the per-group limit is reached.
2046TEST_F(ClientSocketPoolBaseTest, LoadStateGroupLimit) {
2047 CreatePool(2, 1);
2048 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2049
2050 ClientSocketHandle handle;
2051 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542052 int rv = handle.Init("a", params_, MEDIUM, SocketTag(),
mmenked3641e12016-01-28 16:06:152053 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202054 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012055 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552056 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2057
2058 // Request another socket from the same pool, buth with a higher priority.
2059 // The first request should now be stalled at the socket group limit.
2060 ClientSocketHandle handle2;
2061 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542062 rv = handle2.Init("a", params_, HIGHEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152063 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202064 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012065 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552066 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2067 EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState());
2068
2069 // The first handle should remain stalled as the other socket goes through
2070 // the connect process.
2071
2072 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2073 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2074 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle2.GetLoadState());
2075
2076 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012077 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552078 EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState());
2079
2080 // Closing the second socket should cause the stalled handle to finally get a
2081 // ConnectJob.
2082 handle2.socket()->Disconnect();
2083 handle2.Reset();
2084 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2085}
2086
2087// Test GetLoadState in the case the per-pool limit is reached.
2088TEST_F(ClientSocketPoolBaseTest, LoadStatePoolLimit) {
2089 CreatePool(2, 2);
2090 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2091
2092 ClientSocketHandle handle;
2093 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542094 int rv = handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152095 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202096 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012097 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552098
2099 // Request for socket from another pool.
2100 ClientSocketHandle handle2;
2101 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542102 rv = handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152103 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202104 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012105 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552106
2107 // Request another socket from the first pool. Request should stall at the
2108 // socket pool limit.
2109 ClientSocketHandle handle3;
2110 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542111 rv = handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152112 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202113 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012114 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]03b7c8c2013-07-20 04:38:552115
2116 // The third handle should remain stalled as the other sockets in its group
2117 // goes through the connect process.
2118
2119 EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState());
2120 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2121
2122 client_socket_factory_.SetJobLoadState(0, LOAD_STATE_SSL_HANDSHAKE);
2123 EXPECT_EQ(LOAD_STATE_SSL_HANDSHAKE, handle.GetLoadState());
2124 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2125
2126 client_socket_factory_.SignalJob(0);
robpercival214763f2016-07-01 23:27:012127 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]03b7c8c2013-07-20 04:38:552128 EXPECT_EQ(LOAD_STATE_WAITING_FOR_STALLED_SOCKET_POOL, handle3.GetLoadState());
2129
2130 // Closing a socket should allow the stalled handle to finally get a new
2131 // ConnectJob.
2132 handle.socket()->Disconnect();
2133 handle.Reset();
2134 EXPECT_EQ(LOAD_STATE_CONNECTING, handle3.GetLoadState());
[email protected]5fc08e32009-07-15 17:09:572135}
2136
[email protected]e772db3f2010-07-12 18:11:132137TEST_F(ClientSocketPoolBaseTest, Recoverable) {
2138 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2139 connect_job_factory_->set_job_type(TestConnectJob::kMockRecoverableJob);
2140
[email protected]2431756e2010-09-29 20:26:132141 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522142 TestCompletionCallback callback;
2143 EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED,
Paul Jensen8d6f87ec2018-01-13 00:46:542144 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152145 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202146 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132147 EXPECT_TRUE(handle.is_initialized());
2148 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132149}
2150
2151TEST_F(ClientSocketPoolBaseTest, AsyncRecoverable) {
2152 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2153
2154 connect_job_factory_->set_job_type(
2155 TestConnectJob::kMockPendingRecoverableJob);
[email protected]2431756e2010-09-29 20:26:132156 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522157 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132158 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542159 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152160 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202161 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132162 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012163 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_PROXY_AUTH_REQUESTED));
[email protected]2431756e2010-09-29 20:26:132164 EXPECT_TRUE(handle.is_initialized());
2165 EXPECT_TRUE(handle.socket());
[email protected]e772db3f2010-07-12 18:11:132166}
2167
[email protected]e60e47a2010-07-14 03:37:182168TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateSynchronous) {
2169 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2170 connect_job_factory_->set_job_type(
2171 TestConnectJob::kMockAdditionalErrorStateJob);
2172
[email protected]2431756e2010-09-29 20:26:132173 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522174 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132175 EXPECT_EQ(ERR_CONNECTION_FAILED,
Paul Jensen8d6f87ec2018-01-13 00:46:542176 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152177 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202178 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132179 EXPECT_FALSE(handle.is_initialized());
2180 EXPECT_FALSE(handle.socket());
2181 EXPECT_TRUE(handle.is_ssl_error());
2182 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182183}
2184
2185TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
2186 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2187
2188 connect_job_factory_->set_job_type(
2189 TestConnectJob::kMockPendingAdditionalErrorStateJob);
[email protected]2431756e2010-09-29 20:26:132190 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522191 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132192 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542193 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152194 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202195 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]2431756e2010-09-29 20:26:132196 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012197 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2431756e2010-09-29 20:26:132198 EXPECT_FALSE(handle.is_initialized());
2199 EXPECT_FALSE(handle.socket());
2200 EXPECT_TRUE(handle.is_ssl_error());
2201 EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182202}
2203
martijn003cd612016-05-19 22:24:382204// Make sure we can reuse sockets.
2205TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsReuse) {
[email protected]64770b7d2011-11-16 04:30:412206 CreatePoolWithIdleTimeouts(
2207 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
[email protected]e7b1c6d2c2012-05-05 00:54:032208 base::TimeDelta(), // Time out unused sockets immediately.
2209 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2210
2211 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2212
2213 ClientSocketHandle handle;
2214 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542215 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152216 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202217 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012218 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]e7b1c6d2c2012-05-05 00:54:032219 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
robpercival214763f2016-07-01 23:27:012220 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032221
2222 // Use and release the socket.
Bence Békybdbb0e72018-08-07 21:42:592223 EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382224 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]034df0f32013-01-07 23:17:482225 TestLoadTimingInfoConnectedNotReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032226 handle.Reset();
2227
2228 // Should now have one idle socket.
2229 ASSERT_EQ(1, pool_->IdleSocketCount());
2230
2231 // Request a new socket. This should reuse the old socket and complete
2232 // synchronously.
vishal.b62985ca92015-04-17 08:45:512233 BoundTestNetLog log;
Paul Jensen8d6f87ec2018-01-13 00:46:542234 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152235 ClientSocketPool::RespectLimits::ENABLED,
Bence Békybdbb0e72018-08-07 21:42:592236 CompletionOnceCallback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012237 ASSERT_THAT(rv, IsOk());
[email protected]e7b1c6d2c2012-05-05 00:54:032238 EXPECT_TRUE(handle.is_reused());
[email protected]034df0f32013-01-07 23:17:482239 TestLoadTimingInfoConnectedReused(handle);
[email protected]e7b1c6d2c2012-05-05 00:54:032240
2241 ASSERT_TRUE(pool_->HasGroup("a"));
2242 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2243 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2244
mmenke43758e62015-05-04 21:09:462245 TestNetLogEntry::List entries;
[email protected]e7b1c6d2c2012-05-05 00:54:032246 log.GetEntries(&entries);
2247 EXPECT_TRUE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002248 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]e7b1c6d2c2012-05-05 00:54:032249}
2250
martijn003cd612016-05-19 22:24:382251// Make sure we cleanup old unused sockets.
Eric Romanb49715e2018-04-24 22:41:172252TEST_F(ClientSocketPoolBaseTest, CleanupTimedOutIdleSocketsNoReuse) {
[email protected]e7b1c6d2c2012-05-05 00:54:032253 CreatePoolWithIdleTimeouts(
2254 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2255 base::TimeDelta(), // Time out unused sockets immediately
2256 base::TimeDelta()); // Time out used sockets immediately
[email protected]64770b7d2011-11-16 04:30:412257
2258 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2259
2260 // Startup two mock pending connect jobs, which will sit in the MessageLoop.
2261
2262 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522263 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542264 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152265 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202266 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012267 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412268 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
2269
2270 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522271 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542272 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152273 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202274 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012275 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]64770b7d2011-11-16 04:30:412276 EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2));
2277
2278 // Cancel one of the requests. Wait for the other, which will get the first
2279 // job. Release the socket. Run the loop again to make sure the second
2280 // socket is sitting idle and the first one is released (since ReleaseSocket()
2281 // just posts a DoReleaseSocket() task).
2282
2283 handle.Reset();
robpercival214763f2016-07-01 23:27:012284 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412285 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:592286 EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382287 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]64770b7d2011-11-16 04:30:412288 handle2.Reset();
2289
[email protected]e7b1c6d2c2012-05-05 00:54:032290 // We post all of our delayed tasks with a 2ms delay. I.e. they don't
2291 // actually become pending until 2ms after they have been created. In order
2292 // to flush all tasks, we need to wait so that we know there are no
2293 // soon-to-be-pending tasks waiting.
Alex Clarke0def2092018-12-10 12:01:452294 FastForwardBy(base::TimeDelta::FromMilliseconds(10));
[email protected]64770b7d2011-11-16 04:30:412295
[email protected]e7b1c6d2c2012-05-05 00:54:032296 // Both sockets should now be idle.
[email protected]64770b7d2011-11-16 04:30:412297 ASSERT_EQ(2, pool_->IdleSocketCount());
2298
2299 // Request a new socket. This should cleanup the unused and timed out ones.
2300 // A new socket will be created rather than reusing the idle one.
vishal.b62985ca92015-04-17 08:45:512301 BoundTestNetLog log;
[email protected]6ecf2b92011-12-15 01:14:522302 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542303 rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152304 ClientSocketPool::RespectLimits::ENABLED,
2305 callback3.callback(), pool_.get(), log.bound());
robpercival214763f2016-07-01 23:27:012306 ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
2307 ASSERT_THAT(callback3.WaitForResult(), IsOk());
[email protected]64770b7d2011-11-16 04:30:412308 EXPECT_FALSE(handle.is_reused());
2309
[email protected]e7b1c6d2c2012-05-05 00:54:032310 // Make sure the idle socket is closed.
[email protected]64770b7d2011-11-16 04:30:412311 ASSERT_TRUE(pool_->HasGroup("a"));
2312 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
2313 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
2314
mmenke43758e62015-05-04 21:09:462315 TestNetLogEntry::List entries;
[email protected]64770b7d2011-11-16 04:30:412316 log.GetEntries(&entries);
2317 EXPECT_FALSE(LogContainsEntryWithType(
mikecirone8b85c432016-09-08 19:11:002318 entries, 1, NetLogEventType::SOCKET_POOL_REUSED_AN_EXISTING_SOCKET));
[email protected]64770b7d2011-11-16 04:30:412319}
2320
[email protected]2041cf342010-02-19 03:15:592321// Make sure that we process all pending requests even when we're stalling
[email protected]4f2abec2010-02-03 18:10:162322// because of multiple releasing disconnected sockets.
2323TEST_F(ClientSocketPoolBaseTest, MultipleReleasingDisconnectedSockets) {
2324 CreatePoolWithIdleTimeouts(
2325 kDefaultMaxSockets, kDefaultMaxSocketsPerGroup,
2326 base::TimeDelta(), // Time out unused sockets immediately.
2327 base::TimeDelta::FromDays(1)); // Don't time out used sockets.
2328
2329 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2330
2331 // Startup 4 connect jobs. Two of them will be pending.
2332
[email protected]2431756e2010-09-29 20:26:132333 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522334 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542335 int rv = handle.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152336 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202337 callback.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012338 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162339
[email protected]2431756e2010-09-29 20:26:132340 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522341 TestCompletionCallback callback2;
Paul Jensen8d6f87ec2018-01-13 00:46:542342 rv = handle2.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152343 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202344 callback2.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012345 EXPECT_THAT(rv, IsOk());
[email protected]4f2abec2010-02-03 18:10:162346
[email protected]2431756e2010-09-29 20:26:132347 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522348 TestCompletionCallback callback3;
Paul Jensen8d6f87ec2018-01-13 00:46:542349 rv = handle3.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152350 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202351 callback3.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012352 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162353
[email protected]2431756e2010-09-29 20:26:132354 ClientSocketHandle handle4;
[email protected]6ecf2b92011-12-15 01:14:522355 TestCompletionCallback callback4;
Paul Jensen8d6f87ec2018-01-13 00:46:542356 rv = handle4.Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152357 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202358 callback4.callback(), pool_.get(), NetLogWithSource());
robpercival214763f2016-07-01 23:27:012359 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
[email protected]4f2abec2010-02-03 18:10:162360
2361 // Release two disconnected sockets.
2362
[email protected]2431756e2010-09-29 20:26:132363 handle.socket()->Disconnect();
2364 handle.Reset();
2365 handle2.socket()->Disconnect();
2366 handle2.Reset();
[email protected]4f2abec2010-02-03 18:10:162367
robpercival214763f2016-07-01 23:27:012368 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132369 EXPECT_FALSE(handle3.is_reused());
robpercival214763f2016-07-01 23:27:012370 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132371 EXPECT_FALSE(handle4.is_reused());
[email protected]4f2abec2010-02-03 18:10:162372}
2373
[email protected]d7027bb2010-05-10 18:58:542374// Regression test for http://crbug.com/42267.
2375// When DoReleaseSocket() is processed for one socket, it is blocked because the
2376// other stalled groups all have releasing sockets, so no progress can be made.
2377TEST_F(ClientSocketPoolBaseTest, SocketLimitReleasingSockets) {
2378 CreatePoolWithIdleTimeouts(
2379 4 /* socket limit */, 4 /* socket limit per group */,
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 // Max out the socket limit with 2 per group.
2386
[email protected]2431756e2010-09-29 20:26:132387 ClientSocketHandle handle_a[4];
[email protected]6ecf2b92011-12-15 01:14:522388 TestCompletionCallback callback_a[4];
[email protected]2431756e2010-09-29 20:26:132389 ClientSocketHandle handle_b[4];
[email protected]6ecf2b92011-12-15 01:14:522390 TestCompletionCallback callback_b[4];
[email protected]d7027bb2010-05-10 18:58:542391
2392 for (int i = 0; i < 2; ++i) {
Paul Jensen8d6f87ec2018-01-13 00:46:542393 EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152394 ClientSocketPool::RespectLimits::ENABLED,
2395 callback_a[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202396 NetLogWithSource()));
Paul Jensen8d6f87ec2018-01-13 00:46:542397 EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST, SocketTag(),
mmenked3641e12016-01-28 16:06:152398 ClientSocketPool::RespectLimits::ENABLED,
2399 callback_b[i].callback(), pool_.get(),
tfarina428341112016-09-22 13:38:202400 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542401 }
[email protected]b89f7e42010-05-20 20:37:002402
[email protected]d7027bb2010-05-10 18:58:542403 // Make 4 pending requests, 2 per group.
2404
2405 for (int i = 2; i < 4; ++i) {
tfarina428341112016-09-22 13:38:202406 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542407 handle_a[i].Init("a", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202408 ClientSocketPool::RespectLimits::ENABLED,
2409 callback_a[i].callback(), pool_.get(),
2410 NetLogWithSource()));
2411 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542412 handle_b[i].Init("b", params_, LOWEST, SocketTag(),
tfarina428341112016-09-22 13:38:202413 ClientSocketPool::RespectLimits::ENABLED,
2414 callback_b[i].callback(), pool_.get(),
2415 NetLogWithSource()));
[email protected]d7027bb2010-05-10 18:58:542416 }
2417
2418 // Release b's socket first. The order is important, because in
2419 // DoReleaseSocket(), we'll process b's released socket, and since both b and
2420 // a are stalled, but 'a' is lower lexicographically, we'll process group 'a'
2421 // first, which has a releasing socket, so it refuses to start up another
2422 // ConnectJob. So, we used to infinite loop on this.
[email protected]2431756e2010-09-29 20:26:132423 handle_b[0].socket()->Disconnect();
2424 handle_b[0].Reset();
2425 handle_a[0].socket()->Disconnect();
2426 handle_a[0].Reset();
[email protected]d7027bb2010-05-10 18:58:542427
2428 // Used to get stuck here.
fdoray5eeb7642016-06-22 16:11:282429 base::RunLoop().RunUntilIdle();
[email protected]d7027bb2010-05-10 18:58:542430
[email protected]2431756e2010-09-29 20:26:132431 handle_b[1].socket()->Disconnect();
2432 handle_b[1].Reset();
2433 handle_a[1].socket()->Disconnect();
2434 handle_a[1].Reset();
[email protected]d7027bb2010-05-10 18:58:542435
2436 for (int i = 2; i < 4; ++i) {
robpercival214763f2016-07-01 23:27:012437 EXPECT_THAT(callback_b[i].WaitForResult(), IsOk());
2438 EXPECT_THAT(callback_a[i].WaitForResult(), IsOk());
[email protected]d7027bb2010-05-10 18:58:542439 }
2440}
2441
[email protected]fd4fe0b2010-02-08 23:02:152442TEST_F(ClientSocketPoolBaseTest,
2443 ReleasingDisconnectedSocketsMaintainsPriorityOrder) {
2444 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2445
2446 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2447
robpercival214763f2016-07-01 23:27:012448 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2449 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2450 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
2451 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsError(ERR_IO_PENDING));
[email protected]fd4fe0b2010-02-08 23:02:152452
robpercival214763f2016-07-01 23:27:012453 EXPECT_THAT((*requests())[0]->WaitForResult(), IsOk());
2454 EXPECT_THAT((*requests())[1]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132455 EXPECT_EQ(2u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152456
2457 // Releases one connection.
[email protected]2431756e2010-09-29 20:26:132458 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012459 EXPECT_THAT((*requests())[2]->WaitForResult(), IsOk());
[email protected]fd4fe0b2010-02-08 23:02:152460
[email protected]2431756e2010-09-29 20:26:132461 EXPECT_TRUE(ReleaseOneConnection(ClientSocketPoolTest::NO_KEEP_ALIVE));
robpercival214763f2016-07-01 23:27:012462 EXPECT_THAT((*requests())[3]->WaitForResult(), IsOk());
[email protected]2431756e2010-09-29 20:26:132463 EXPECT_EQ(4u, completion_count());
[email protected]fd4fe0b2010-02-08 23:02:152464
2465 EXPECT_EQ(1, GetOrderOfRequest(1));
2466 EXPECT_EQ(2, GetOrderOfRequest(2));
2467 EXPECT_EQ(3, GetOrderOfRequest(3));
2468 EXPECT_EQ(4, GetOrderOfRequest(4));
2469
2470 // Make sure we test order of all requests made.
[email protected]2431756e2010-09-29 20:26:132471 EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(5));
[email protected]fd4fe0b2010-02-08 23:02:152472}
2473
[email protected]6ecf2b92011-12-15 01:14:522474class TestReleasingSocketRequest : public TestCompletionCallbackBase {
[email protected]4f1e4982010-03-02 18:31:042475 public:
[email protected]2431756e2010-09-29 20:26:132476 TestReleasingSocketRequest(TestClientSocketPool* pool,
2477 int expected_result,
[email protected]e60e47a2010-07-14 03:37:182478 bool reset_releasing_handle)
2479 : pool_(pool),
2480 expected_result_(expected_result),
Bence Béky8ddc2492018-06-13 01:02:042481 reset_releasing_handle_(reset_releasing_handle) {}
[email protected]6ecf2b92011-12-15 01:14:522482
Chris Watkins7a41d3552017-12-01 02:13:272483 ~TestReleasingSocketRequest() override = default;
[email protected]4f1e4982010-03-02 18:31:042484
2485 ClientSocketHandle* handle() { return &handle_; }
2486
Bence Béky8ddc2492018-06-13 01:02:042487 CompletionOnceCallback callback() {
2488 return base::BindOnce(&TestReleasingSocketRequest::OnComplete,
2489 base::Unretained(this));
2490 }
[email protected]4f1e4982010-03-02 18:31:042491
2492 private:
[email protected]6ecf2b92011-12-15 01:14:522493 void OnComplete(int result) {
2494 SetResult(result);
2495 if (reset_releasing_handle_)
2496 handle_.Reset();
2497
mmenked3641e12016-01-28 16:06:152498 scoped_refptr<TestSocketParams> con_params(new TestSocketParams());
Bence Béky8ddc2492018-06-13 01:02:042499 EXPECT_EQ(
2500 expected_result_,
2501 handle2_.Init("a", con_params, DEFAULT_PRIORITY, SocketTag(),
2502 ClientSocketPool::RespectLimits::ENABLED,
2503 CompletionOnceCallback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522504 }
2505
[email protected]2431756e2010-09-29 20:26:132506 TestClientSocketPool* const pool_;
[email protected]e60e47a2010-07-14 03:37:182507 int expected_result_;
2508 bool reset_releasing_handle_;
[email protected]4f1e4982010-03-02 18:31:042509 ClientSocketHandle handle_;
2510 ClientSocketHandle handle2_;
[email protected]4f1e4982010-03-02 18:31:042511};
2512
[email protected]e60e47a2010-07-14 03:37:182513
2514TEST_F(ClientSocketPoolBaseTest, AdditionalErrorSocketsDontUseSlot) {
2515 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2516
robpercival214763f2016-07-01 23:27:012517 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
2518 EXPECT_THAT(StartRequest("a", DEFAULT_PRIORITY), IsOk());
2519 EXPECT_THAT(StartRequest("b", DEFAULT_PRIORITY), IsOk());
[email protected]e60e47a2010-07-14 03:37:182520
[email protected]2431756e2010-09-29 20:26:132521 EXPECT_EQ(static_cast<int>(requests_size()),
[email protected]e60e47a2010-07-14 03:37:182522 client_socket_factory_.allocation_count());
2523
2524 connect_job_factory_->set_job_type(
2525 TestConnectJob::kMockPendingAdditionalErrorStateJob);
2526 TestReleasingSocketRequest req(pool_.get(), OK, false);
tfarina428341112016-09-22 13:38:202527 EXPECT_EQ(
2528 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542529 req.handle()->Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202530 ClientSocketPool::RespectLimits::ENABLED,
2531 req.callback(), pool_.get(), NetLogWithSource()));
[email protected]e60e47a2010-07-14 03:37:182532 // The next job should complete synchronously
2533 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2534
robpercival214763f2016-07-01 23:27:012535 EXPECT_THAT(req.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]e60e47a2010-07-14 03:37:182536 EXPECT_FALSE(req.handle()->is_initialized());
2537 EXPECT_FALSE(req.handle()->socket());
2538 EXPECT_TRUE(req.handle()->is_ssl_error());
[email protected]8b498692010-07-16 17:11:432539 EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
[email protected]e60e47a2010-07-14 03:37:182540}
2541
[email protected]b6501d3d2010-06-03 23:53:342542// http://crbug.com/44724 regression test.
2543// We start releasing the pool when we flush on network change. When that
2544// happens, the only active references are in the ClientSocketHandles. When a
2545// ConnectJob completes and calls back into the last ClientSocketHandle, that
2546// callback can release the last reference and delete the pool. After the
2547// callback finishes, we go back to the stack frame within the now-deleted pool.
2548// Executing any code that refers to members of the now-deleted pool can cause
2549// crashes.
2550TEST_F(ClientSocketPoolBaseTest, CallbackThatReleasesPool) {
2551 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2552 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2553
2554 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522555 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152556 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542557 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152558 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202559 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b6501d3d2010-06-03 23:53:342560
[email protected]7af985a2012-12-14 22:40:422561 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]b6501d3d2010-06-03 23:53:342562
2563 // We'll call back into this now.
2564 callback.WaitForResult();
2565}
2566
[email protected]a7e38572010-06-07 18:22:242567TEST_F(ClientSocketPoolBaseTest, DoNotReuseSocketAfterFlush) {
2568 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2569 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2570
2571 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522572 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152573 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542574 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152575 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202576 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012577 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242578 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2579
[email protected]7af985a2012-12-14 22:40:422580 pool_->FlushWithError(ERR_NETWORK_CHANGED);
[email protected]a7e38572010-06-07 18:22:242581
2582 handle.Reset();
fdoray5eeb7642016-06-22 16:11:282583 base::RunLoop().RunUntilIdle();
[email protected]a7e38572010-06-07 18:22:242584
mmenked3641e12016-01-28 16:06:152585 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542586 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152587 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202588 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012589 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]a7e38572010-06-07 18:22:242590 EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type());
2591}
2592
[email protected]6ecf2b92011-12-15 01:14:522593class ConnectWithinCallback : public TestCompletionCallbackBase {
[email protected]06f92462010-08-31 19:24:142594 public:
Bence Béky8ddc2492018-06-13 01:02:042595 ConnectWithinCallback(const std::string& group_name,
2596 const scoped_refptr<TestSocketParams>& params,
2597 TestClientSocketPool* pool)
2598 : group_name_(group_name), params_(params), pool_(pool) {}
[email protected]06f92462010-08-31 19:24:142599
Chris Watkins7a41d3552017-12-01 02:13:272600 ~ConnectWithinCallback() override = default;
[email protected]06f92462010-08-31 19:24:142601
2602 int WaitForNestedResult() {
2603 return nested_callback_.WaitForResult();
2604 }
2605
Bence Béky8ddc2492018-06-13 01:02:042606 CompletionOnceCallback callback() {
2607 return base::BindOnce(&ConnectWithinCallback::OnComplete,
2608 base::Unretained(this));
2609 }
[email protected]6ecf2b92011-12-15 01:14:522610
[email protected]06f92462010-08-31 19:24:142611 private:
[email protected]6ecf2b92011-12-15 01:14:522612 void OnComplete(int result) {
2613 SetResult(result);
tfarina428341112016-09-22 13:38:202614 EXPECT_EQ(
2615 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542616 handle_.Init(group_name_, params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202617 ClientSocketPool::RespectLimits::ENABLED,
2618 nested_callback_.callback(), pool_, NetLogWithSource()));
[email protected]6ecf2b92011-12-15 01:14:522619 }
2620
[email protected]06f92462010-08-31 19:24:142621 const std::string group_name_;
2622 const scoped_refptr<TestSocketParams> params_;
[email protected]2431756e2010-09-29 20:26:132623 TestClientSocketPool* const pool_;
[email protected]06f92462010-08-31 19:24:142624 ClientSocketHandle handle_;
[email protected]6ecf2b92011-12-15 01:14:522625 TestCompletionCallback nested_callback_;
2626
2627 DISALLOW_COPY_AND_ASSIGN(ConnectWithinCallback);
[email protected]06f92462010-08-31 19:24:142628};
2629
2630TEST_F(ClientSocketPoolBaseTest, AbortAllRequestsOnFlush) {
2631 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2632
2633 // First job will be waiting until it gets aborted.
2634 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2635
2636 ClientSocketHandle handle;
[email protected]2431756e2010-09-29 20:26:132637 ConnectWithinCallback callback("a", params_, pool_.get());
mmenked3641e12016-01-28 16:06:152638 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542639 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152640 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202641 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]06f92462010-08-31 19:24:142642
2643 // Second job will be started during the first callback, and will
2644 // asynchronously complete with OK.
2645 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
[email protected]7af985a2012-12-14 22:40:422646 pool_->FlushWithError(ERR_NETWORK_CHANGED);
robpercival214763f2016-07-01 23:27:012647 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NETWORK_CHANGED));
2648 EXPECT_THAT(callback.WaitForNestedResult(), IsOk());
[email protected]06f92462010-08-31 19:24:142649}
2650
[email protected]25eea382010-07-10 23:55:262651// Cancel a pending socket request while we're at max sockets,
2652// and verify that the backup socket firing doesn't cause a crash.
2653TEST_F(ClientSocketPoolBaseTest, BackupSocketCancelAtMaxSockets) {
2654 // Max 4 sockets globally, max 4 sockets per group.
2655 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
[email protected]06d94042010-08-25 01:45:222656 pool_->EnableConnectBackupJobs();
[email protected]25eea382010-07-10 23:55:262657
[email protected]4baaf9d2010-08-31 15:15:442658 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2659 // timer.
[email protected]25eea382010-07-10 23:55:262660 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2661 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522662 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152663 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542664 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152665 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202666 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262667
2668 // Start (MaxSockets - 1) connected sockets to reach max sockets.
2669 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
2670 ClientSocketHandle handles[kDefaultMaxSockets];
2671 for (int i = 1; i < kDefaultMaxSockets; ++i) {
[email protected]6ecf2b92011-12-15 01:14:522672 TestCompletionCallback callback;
Paul Jensen8d6f87ec2018-01-13 00:46:542673 EXPECT_EQ(OK, handles[i].Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202674 ClientSocketPool::RespectLimits::ENABLED,
2675 callback.callback(), pool_.get(),
2676 NetLogWithSource()));
[email protected]25eea382010-07-10 23:55:262677 }
2678
fdoray5eeb7642016-06-22 16:11:282679 base::RunLoop().RunUntilIdle();
[email protected]25eea382010-07-10 23:55:262680
2681 // Cancel the pending request.
2682 handle.Reset();
2683
2684 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452685 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002686 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]25eea382010-07-10 23:55:262687
[email protected]25eea382010-07-10 23:55:262688 EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count());
2689}
2690
[email protected]3f00be82010-09-27 19:50:022691TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterCancelingAllRequests) {
[email protected]4baaf9d2010-08-31 15:15:442692 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2693 pool_->EnableConnectBackupJobs();
2694
2695 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2696 // timer.
2697 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2698 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522699 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152700 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542701 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152702 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202703 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]4baaf9d2010-08-31 15:15:442704 ASSERT_TRUE(pool_->HasGroup("bar"));
2705 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
Lily Chenecebf932018-11-02 17:15:432706 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("bar"));
[email protected]8159a1c2012-06-07 00:00:102707 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar"));
[email protected]4baaf9d2010-08-31 15:15:442708
2709 // Cancel the socket request. This should cancel the backup timer. Wait for
2710 // the backup time to see if it indeed got canceled.
2711 handle.Reset();
2712 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452713 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002714 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]4baaf9d2010-08-31 15:15:442715 ASSERT_TRUE(pool_->HasGroup("bar"));
2716 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar"));
2717}
2718
[email protected]3f00be82010-09-27 19:50:022719TEST_F(ClientSocketPoolBaseTest, CancelBackupSocketAfterFinishingAllRequests) {
2720 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2721 pool_->EnableConnectBackupJobs();
2722
2723 // Create the first socket and set to ERR_IO_PENDING. This starts the backup
2724 // timer.
2725 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2726 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:522727 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:152728 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542729 handle.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152730 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202731 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022732 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2733 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522734 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202735 EXPECT_EQ(
2736 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542737 handle2.Init("bar", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202738 ClientSocketPool::RespectLimits::ENABLED,
2739 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]3f00be82010-09-27 19:50:022740 ASSERT_TRUE(pool_->HasGroup("bar"));
2741 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar"));
2742
2743 // Cancel request 1 and then complete request 2. With the requests finished,
2744 // the backup timer should be cancelled.
2745 handle.Reset();
robpercival214763f2016-07-01 23:27:012746 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]3f00be82010-09-27 19:50:022747 // Wait for the backup timer to fire (add some slop to ensure it fires)
Alex Clarke0def2092018-12-10 12:01:452748 FastForwardBy(base::TimeDelta::FromMilliseconds(
[email protected]26b9973962012-01-28 00:57:002749 ClientSocketPool::kMaxConnectRetryIntervalMs / 2 * 3));
[email protected]3f00be82010-09-27 19:50:022750}
2751
[email protected]eb5a99382010-07-11 03:18:262752// Test delayed socket binding for the case where we have two connects,
2753// and while one is waiting on a connect, the other frees up.
2754// The socket waiting on a connect should switch immediately to the freed
2755// up socket.
2756TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingWaitingForConnect) {
2757 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2758 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2759
2760 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522761 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132762 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542763 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152764 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202765 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012766 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262767
2768 // No idle sockets, no pending jobs.
2769 EXPECT_EQ(0, pool_->IdleSocketCount());
2770 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2771
2772 // Create a second socket to the same host, but this one will wait.
2773 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2774 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132775 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542776 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152777 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202778 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262779 // No idle sockets, and one connecting job.
2780 EXPECT_EQ(0, pool_->IdleSocketCount());
2781 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2782
2783 // Return the first handle to the pool. This will initiate the delayed
2784 // binding.
2785 handle1.Reset();
2786
fdoray5eeb7642016-06-22 16:11:282787 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262788
2789 // Still no idle sockets, still one pending connect job.
2790 EXPECT_EQ(0, pool_->IdleSocketCount());
2791 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2792
2793 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012794 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262795
2796 // And we can see there is still one job waiting.
2797 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2798
2799 // Finally, signal the waiting Connect.
2800 client_socket_factory_.SignalJobs();
2801 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2802
fdoray5eeb7642016-06-22 16:11:282803 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262804}
2805
2806// Test delayed socket binding when a group is at capacity and one
2807// of the group's sockets frees up.
2808TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtGroupCapacity) {
2809 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2810 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2811
2812 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522813 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132814 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542815 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152816 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202817 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012818 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262819
2820 // No idle sockets, no pending jobs.
2821 EXPECT_EQ(0, pool_->IdleSocketCount());
2822 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2823
2824 // Create a second socket to the same host, but this one will wait.
2825 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2826 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132827 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542828 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152829 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202830 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262831 // No idle sockets, and one connecting job.
2832 EXPECT_EQ(0, pool_->IdleSocketCount());
2833 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2834
2835 // Return the first handle to the pool. This will initiate the delayed
2836 // binding.
2837 handle1.Reset();
2838
fdoray5eeb7642016-06-22 16:11:282839 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262840
2841 // Still no idle sockets, still one pending connect job.
2842 EXPECT_EQ(0, pool_->IdleSocketCount());
2843 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2844
2845 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012846 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262847
2848 // And we can see there is still one job waiting.
2849 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2850
2851 // Finally, signal the waiting Connect.
2852 client_socket_factory_.SignalJobs();
2853 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2854
fdoray5eeb7642016-06-22 16:11:282855 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262856}
2857
2858// Test out the case where we have one socket connected, one
2859// connecting, when the first socket finishes and goes idle.
[email protected]2abfe90a2010-08-25 17:49:512860// Although the second connection is pending, the second request
[email protected]eb5a99382010-07-11 03:18:262861// should complete, by taking the first socket's idle socket.
2862TEST_F(ClientSocketPoolBaseTest, DelayedSocketBindingAtStall) {
2863 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
2864 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2865
2866 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522867 TestCompletionCallback callback;
[email protected]2431756e2010-09-29 20:26:132868 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542869 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152870 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202871 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:012872 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262873
2874 // No idle sockets, no pending jobs.
2875 EXPECT_EQ(0, pool_->IdleSocketCount());
2876 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2877
2878 // Create a second socket to the same host, but this one will wait.
2879 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
2880 ClientSocketHandle handle2;
[email protected]2431756e2010-09-29 20:26:132881 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542882 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:152883 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:202884 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]eb5a99382010-07-11 03:18:262885 // No idle sockets, and one connecting job.
2886 EXPECT_EQ(0, pool_->IdleSocketCount());
2887 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2888
2889 // Return the first handle to the pool. This will initiate the delayed
2890 // binding.
2891 handle1.Reset();
2892
fdoray5eeb7642016-06-22 16:11:282893 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262894
2895 // Still no idle sockets, still one pending connect job.
2896 EXPECT_EQ(0, pool_->IdleSocketCount());
2897 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2898
2899 // The second socket connected, even though it was a Waiting Job.
robpercival214763f2016-07-01 23:27:012900 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]eb5a99382010-07-11 03:18:262901
2902 // And we can see there is still one job waiting.
2903 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2904
2905 // Finally, signal the waiting Connect.
2906 client_socket_factory_.SignalJobs();
2907 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
2908
fdoray5eeb7642016-06-22 16:11:282909 base::RunLoop().RunUntilIdle();
[email protected]eb5a99382010-07-11 03:18:262910}
2911
[email protected]2abfe90a2010-08-25 17:49:512912// Cover the case where on an available socket slot, we have one pending
2913// request that completes synchronously, thereby making the Group empty.
2914TEST_F(ClientSocketPoolBaseTest, SynchronouslyProcessOnePendingRequest) {
2915 const int kUnlimitedSockets = 100;
2916 const int kOneSocketPerGroup = 1;
2917 CreatePool(kUnlimitedSockets, kOneSocketPerGroup);
2918
2919 // Make the first request asynchronous fail.
2920 // This will free up a socket slot later.
2921 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingFailingJob);
2922
2923 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522924 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:202925 EXPECT_EQ(
2926 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542927 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202928 ClientSocketPool::RespectLimits::ENABLED,
2929 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:512930 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2931
2932 // Make the second request synchronously fail. This should make the Group
2933 // empty.
2934 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
2935 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522936 TestCompletionCallback callback2;
[email protected]2abfe90a2010-08-25 17:49:512937 // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail
2938 // when created.
tfarina428341112016-09-22 13:38:202939 EXPECT_EQ(
2940 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542941 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202942 ClientSocketPool::RespectLimits::ENABLED,
2943 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2abfe90a2010-08-25 17:49:512944
2945 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
2946
robpercival214763f2016-07-01 23:27:012947 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
2948 EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
[email protected]2abfe90a2010-08-25 17:49:512949 EXPECT_FALSE(pool_->HasGroup("a"));
2950}
2951
[email protected]e1b54dc2010-10-06 21:27:222952TEST_F(ClientSocketPoolBaseTest, PreferUsedSocketToUnusedSocket) {
2953 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
2954
2955 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
2956
2957 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:522958 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:202959 EXPECT_EQ(
2960 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542961 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202962 ClientSocketPool::RespectLimits::ENABLED,
2963 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:222964
2965 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:522966 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:202967 EXPECT_EQ(
2968 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542969 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202970 ClientSocketPool::RespectLimits::ENABLED,
2971 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:222972 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:522973 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:202974 EXPECT_EQ(
2975 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:542976 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202977 ClientSocketPool::RespectLimits::ENABLED,
2978 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:222979
robpercival214763f2016-07-01 23:27:012980 EXPECT_THAT(callback1.WaitForResult(), IsOk());
2981 EXPECT_THAT(callback2.WaitForResult(), IsOk());
2982 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]e1b54dc2010-10-06 21:27:222983
2984 // Use the socket.
Bence Békybdbb0e72018-08-07 21:42:592985 EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382986 TRAFFIC_ANNOTATION_FOR_TESTS));
Bence Békybdbb0e72018-08-07 21:42:592987 EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionOnceCallback(),
Ramin Halavati0a08cc82018-02-06 07:46:382988 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]e1b54dc2010-10-06 21:27:222989
2990 handle1.Reset();
2991 handle2.Reset();
2992 handle3.Reset();
2993
tfarina428341112016-09-22 13:38:202994 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:542995 OK, handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:202996 ClientSocketPool::RespectLimits::ENABLED,
2997 callback1.callback(), pool_.get(), NetLogWithSource()));
2998 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:542999 OK, handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203000 ClientSocketPool::RespectLimits::ENABLED,
3001 callback2.callback(), pool_.get(), NetLogWithSource()));
3002 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:543003 OK, handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203004 ClientSocketPool::RespectLimits::ENABLED,
3005 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]e1b54dc2010-10-06 21:27:223006
3007 EXPECT_TRUE(handle1.socket()->WasEverUsed());
3008 EXPECT_TRUE(handle2.socket()->WasEverUsed());
3009 EXPECT_FALSE(handle3.socket()->WasEverUsed());
3010}
3011
[email protected]2c2bef152010-10-13 00:55:033012TEST_F(ClientSocketPoolBaseTest, RequestSockets) {
3013 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3014 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3015
Charlie Harrison55ce6082018-05-14 02:25:573016 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033017
3018 ASSERT_TRUE(pool_->HasGroup("a"));
3019 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433020 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103021 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033022 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3023
3024 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523025 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203026 EXPECT_EQ(
3027 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543028 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203029 ClientSocketPool::RespectLimits::ENABLED,
3030 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033031
3032 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523033 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203034 EXPECT_EQ(
3035 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543036 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203037 ClientSocketPool::RespectLimits::ENABLED,
3038 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033039
3040 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433041 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103042 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033043 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3044
robpercival214763f2016-07-01 23:27:013045 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3046 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033047 handle1.Reset();
3048 handle2.Reset();
3049
3050 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433051 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103052 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033053 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3054}
3055
3056TEST_F(ClientSocketPoolBaseTest, RequestSocketsWhenAlreadyHaveAConnectJob) {
3057 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3058 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3059
3060 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523061 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203062 EXPECT_EQ(
3063 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543064 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203065 ClientSocketPool::RespectLimits::ENABLED,
3066 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033067
3068 ASSERT_TRUE(pool_->HasGroup("a"));
3069 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433070 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103071 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033072 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3073
Charlie Harrison55ce6082018-05-14 02:25:573074 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033075
3076 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433077 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103078 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033079 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3080
3081 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523082 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203083 EXPECT_EQ(
3084 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543085 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203086 ClientSocketPool::RespectLimits::ENABLED,
3087 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033088
3089 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433090 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103091 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033092 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3093
robpercival214763f2016-07-01 23:27:013094 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3095 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033096 handle1.Reset();
3097 handle2.Reset();
3098
3099 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433100 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103101 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033102 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3103}
3104
3105TEST_F(ClientSocketPoolBaseTest,
3106 RequestSocketsWhenAlreadyHaveMultipleConnectJob) {
3107 CreatePool(4, 4);
3108 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3109
3110 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523111 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203112 EXPECT_EQ(
3113 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543114 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203115 ClientSocketPool::RespectLimits::ENABLED,
3116 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033117
3118 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523119 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203120 EXPECT_EQ(
3121 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543122 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203123 ClientSocketPool::RespectLimits::ENABLED,
3124 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033125
3126 ClientSocketHandle handle3;
[email protected]6ecf2b92011-12-15 01:14:523127 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:203128 EXPECT_EQ(
3129 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543130 handle3.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203131 ClientSocketPool::RespectLimits::ENABLED,
3132 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033133
3134 ASSERT_TRUE(pool_->HasGroup("a"));
3135 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433136 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103137 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033138 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3139
Charlie Harrison55ce6082018-05-14 02:25:573140 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033141
3142 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433143 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103144 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033145 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3146
robpercival214763f2016-07-01 23:27:013147 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3148 EXPECT_THAT(callback2.WaitForResult(), IsOk());
3149 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033150 handle1.Reset();
3151 handle2.Reset();
3152 handle3.Reset();
3153
3154 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433155 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103156 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033157 EXPECT_EQ(3, pool_->IdleSocketCountInGroup("a"));
3158}
3159
3160TEST_F(ClientSocketPoolBaseTest, RequestSocketsAtMaxSocketLimit) {
3161 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3162 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3163
3164 ASSERT_FALSE(pool_->HasGroup("a"));
3165
Charlie Harrison55ce6082018-05-14 02:25:573166 pool_->RequestSockets("a", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033167
3168 ASSERT_TRUE(pool_->HasGroup("a"));
3169 EXPECT_EQ(kDefaultMaxSockets, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433170 EXPECT_EQ(kDefaultMaxSockets, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103171 EXPECT_EQ(kDefaultMaxSockets, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033172
3173 ASSERT_FALSE(pool_->HasGroup("b"));
3174
Charlie Harrison55ce6082018-05-14 02:25:573175 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033176
3177 ASSERT_FALSE(pool_->HasGroup("b"));
3178}
3179
3180TEST_F(ClientSocketPoolBaseTest, RequestSocketsHitMaxSocketLimit) {
3181 CreatePool(kDefaultMaxSockets, kDefaultMaxSockets);
3182 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3183
3184 ASSERT_FALSE(pool_->HasGroup("a"));
3185
3186 pool_->RequestSockets("a", &params_, kDefaultMaxSockets - 1,
Charlie Harrison55ce6082018-05-14 02:25:573187 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033188
3189 ASSERT_TRUE(pool_->HasGroup("a"));
3190 EXPECT_EQ(kDefaultMaxSockets - 1, pool_->NumConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103191 EXPECT_EQ(kDefaultMaxSockets - 1,
Lily Chenecebf932018-11-02 17:15:433192 pool_->NumNeverAssignedConnectJobsInGroup("a"));
3193 EXPECT_EQ(kDefaultMaxSockets - 1,
[email protected]8159a1c2012-06-07 00:00:103194 pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]51fdc7c2012-04-10 19:19:483195 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033196
3197 ASSERT_FALSE(pool_->HasGroup("b"));
3198
Charlie Harrison55ce6082018-05-14 02:25:573199 pool_->RequestSockets("b", &params_, kDefaultMaxSockets, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033200
3201 ASSERT_TRUE(pool_->HasGroup("b"));
3202 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("b"));
[email protected]51fdc7c2012-04-10 19:19:483203 EXPECT_FALSE(pool_->IsStalled());
[email protected]2c2bef152010-10-13 00:55:033204}
3205
3206TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountIdleSockets) {
3207 CreatePool(4, 4);
3208 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3209
3210 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523211 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203212 EXPECT_EQ(
3213 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543214 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203215 ClientSocketPool::RespectLimits::ENABLED,
3216 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013217 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033218 handle1.Reset();
3219
3220 ASSERT_TRUE(pool_->HasGroup("a"));
3221 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433222 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103223 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033224 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3225
Charlie Harrison55ce6082018-05-14 02:25:573226 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033227
3228 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433229 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103230 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033231 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3232}
3233
3234TEST_F(ClientSocketPoolBaseTest, RequestSocketsCountActiveSockets) {
3235 CreatePool(4, 4);
3236 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3237
3238 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523239 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203240 EXPECT_EQ(
3241 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543242 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203243 ClientSocketPool::RespectLimits::ENABLED,
3244 callback1.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:013245 ASSERT_THAT(callback1.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033246
3247 ASSERT_TRUE(pool_->HasGroup("a"));
3248 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433249 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103250 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033251 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3252 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3253
Charlie Harrison55ce6082018-05-14 02:25:573254 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033255
3256 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433257 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103258 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033259 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3260 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3261}
3262
3263TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronous) {
3264 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3265 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
3266
3267 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573268 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033269
3270 ASSERT_TRUE(pool_->HasGroup("a"));
3271 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433272 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103273 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033274 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("a"));
3275
3276 pool_->RequestSockets("b", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573277 NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033278
3279 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433280 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103281 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]2c2bef152010-10-13 00:55:033282 EXPECT_EQ(kDefaultMaxSocketsPerGroup, pool_->IdleSocketCountInGroup("b"));
3283}
3284
[email protected]3c819f522010-12-02 02:03:123285TEST_F(ClientSocketPoolBaseTest, RequestSocketsSynchronousError) {
3286 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3287 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3288
3289 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573290 NetLogWithSource());
[email protected]3c819f522010-12-02 02:03:123291
3292 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]fd2e53e2011-01-14 20:40:523293
3294 connect_job_factory_->set_job_type(
3295 TestConnectJob::kMockAdditionalErrorStateJob);
3296 pool_->RequestSockets("a", &params_, kDefaultMaxSocketsPerGroup,
Charlie Harrison55ce6082018-05-14 02:25:573297 NetLogWithSource());
[email protected]fd2e53e2011-01-14 20:40:523298
3299 ASSERT_FALSE(pool_->HasGroup("a"));
[email protected]3c819f522010-12-02 02:03:123300}
3301
[email protected]8159a1c2012-06-07 00:00:103302TEST_F(ClientSocketPoolBaseTest, RequestSocketsMultipleTimesDoesNothing) {
[email protected]2c2bef152010-10-13 00:55:033303 CreatePool(4, 4);
Lily Chenecebf932018-11-02 17:15:433304 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033305
Charlie Harrison55ce6082018-05-14 02:25:573306 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033307
3308 ASSERT_TRUE(pool_->HasGroup("a"));
3309 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433310 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103311 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433312 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033313 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3314
Charlie Harrison55ce6082018-05-14 02:25:573315 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033316 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433317 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103318 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433319 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033320 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3321
3322 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523323 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203324 EXPECT_EQ(
3325 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543326 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203327 ClientSocketPool::RespectLimits::ENABLED,
3328 callback1.callback(), pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433329
3330 client_socket_factory_.SignalJob(0);
3331 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3332
3333 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3334 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3335 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3336 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3337 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033338
3339 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523340 TestCompletionCallback callback2;
Lily Chenecebf932018-11-02 17:15:433341 EXPECT_EQ(
3342 ERR_IO_PENDING,
3343 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3344 ClientSocketPool::RespectLimits::ENABLED,
3345 callback2.callback(), pool_.get(), NetLogWithSource()));
3346 client_socket_factory_.SignalJob(0);
3347 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]2c2bef152010-10-13 00:55:033348
[email protected]8159a1c2012-06-07 00:00:103349 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433350 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103351 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3352 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("a"));
3353 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3354
[email protected]2c2bef152010-10-13 00:55:033355 handle1.Reset();
3356 handle2.Reset();
3357
[email protected]8159a1c2012-06-07 00:00:103358 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433359 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103360 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433361 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033362 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3363
Charlie Harrison55ce6082018-05-14 02:25:573364 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033365 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433366 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103367 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433368 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033369 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("a"));
3370}
3371
3372TEST_F(ClientSocketPoolBaseTest, RequestSocketsDifferentNumSockets) {
3373 CreatePool(4, 4);
3374 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3375
Charlie Harrison55ce6082018-05-14 02:25:573376 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033377
3378 ASSERT_TRUE(pool_->HasGroup("a"));
3379 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433380 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103381 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033382 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3383
Charlie Harrison55ce6082018-05-14 02:25:573384 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033385 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433386 EXPECT_EQ(2, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103387 EXPECT_EQ(2, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033388 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3389
Charlie Harrison55ce6082018-05-14 02:25:573390 pool_->RequestSockets("a", &params_, 3, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033391 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433392 EXPECT_EQ(3, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103393 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033394 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3395
Charlie Harrison55ce6082018-05-14 02:25:573396 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033397 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433398 EXPECT_EQ(3, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103399 EXPECT_EQ(3, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033400 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3401}
3402
3403TEST_F(ClientSocketPoolBaseTest, PreconnectJobsTakenByNormalRequests) {
3404 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433405 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]2c2bef152010-10-13 00:55:033406
Charlie Harrison55ce6082018-05-14 02:25:573407 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]2c2bef152010-10-13 00:55:033408
3409 ASSERT_TRUE(pool_->HasGroup("a"));
3410 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433411 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103412 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033413 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3414
3415 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523416 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203417 EXPECT_EQ(
3418 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543419 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203420 ClientSocketPool::RespectLimits::ENABLED,
3421 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]2c2bef152010-10-13 00:55:033422
3423 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433424 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103425 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033426 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3427
Lily Chenecebf932018-11-02 17:15:433428 client_socket_factory_.SignalJobs();
3429 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3430
3431 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3432 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3433 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3434 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3435 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
[email protected]2c2bef152010-10-13 00:55:033436
[email protected]0dc88b32014-03-26 20:12:283437 // Make sure if a preconnected socket is not fully connected when a request
[email protected]034df0f32013-01-07 23:17:483438 // starts, it has a connect start time.
3439 TestLoadTimingInfoConnectedNotReused(handle1);
[email protected]2c2bef152010-10-13 00:55:033440 handle1.Reset();
3441
3442 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3443}
3444
[email protected]034df0f32013-01-07 23:17:483445// Checks that fully connected preconnect jobs have no connect times, and are
3446// marked as reused.
3447TEST_F(ClientSocketPoolBaseTest, ConnectedPreconnectJobsHaveNoConnectTimes) {
3448 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3449 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
Charlie Harrison55ce6082018-05-14 02:25:573450 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]034df0f32013-01-07 23:17:483451
3452 ASSERT_TRUE(pool_->HasGroup("a"));
3453 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433454 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]034df0f32013-01-07 23:17:483455 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3456 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3457
3458 ClientSocketHandle handle;
3459 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203460 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543461 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203462 ClientSocketPool::RespectLimits::ENABLED,
3463 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]034df0f32013-01-07 23:17:483464
3465 // Make sure the idle socket was used.
3466 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3467
3468 TestLoadTimingInfoConnectedReused(handle);
3469 handle.Reset();
3470 TestLoadTimingInfoNotConnected(handle);
3471}
3472
[email protected]dcbe168a2010-12-02 03:14:463473// http://crbug.com/64940 regression test.
3474TEST_F(ClientSocketPoolBaseTest, PreconnectClosesIdleSocketRemovesGroup) {
3475 const int kMaxTotalSockets = 3;
3476 const int kMaxSocketsPerGroup = 2;
3477 CreatePool(kMaxTotalSockets, kMaxSocketsPerGroup);
Lily Chenecebf932018-11-02 17:15:433478 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
[email protected]dcbe168a2010-12-02 03:14:463479
3480 // Note that group name ordering matters here. "a" comes before "b", so
3481 // CloseOneIdleSocket() will try to close "a"'s idle socket.
3482
3483 // Set up one idle socket in "a".
3484 ClientSocketHandle handle1;
[email protected]6ecf2b92011-12-15 01:14:523485 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:203486 EXPECT_EQ(
3487 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543488 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203489 ClientSocketPool::RespectLimits::ENABLED,
3490 callback1.callback(), pool_.get(), NetLogWithSource()));
Lily Chenecebf932018-11-02 17:15:433491 ASSERT_TRUE(pool_->HasGroup("a"));
3492 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3493 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3494 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3495 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463496
Lily Chenecebf932018-11-02 17:15:433497 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013498 ASSERT_THAT(callback1.WaitForResult(), IsOk());
Lily Chenecebf932018-11-02 17:15:433499 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
3500 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3501 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3502 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3503
[email protected]dcbe168a2010-12-02 03:14:463504 handle1.Reset();
3505 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3506
3507 // Set up two active sockets in "b".
3508 ClientSocketHandle handle2;
[email protected]6ecf2b92011-12-15 01:14:523509 TestCompletionCallback callback2;
tfarina428341112016-09-22 13:38:203510 EXPECT_EQ(
3511 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543512 handle1.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203513 ClientSocketPool::RespectLimits::ENABLED,
3514 callback1.callback(), pool_.get(), NetLogWithSource()));
3515 EXPECT_EQ(
3516 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543517 handle2.Init("b", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203518 ClientSocketPool::RespectLimits::ENABLED,
3519 callback2.callback(), pool_.get(), NetLogWithSource()));
[email protected]dcbe168a2010-12-02 03:14:463520
Lily Chenecebf932018-11-02 17:15:433521 ASSERT_TRUE(pool_->HasGroup("b"));
3522 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("b"));
3523 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
3524 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
3525 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3526
3527 client_socket_factory_.SignalJobs();
robpercival214763f2016-07-01 23:27:013528 ASSERT_THAT(callback1.WaitForResult(), IsOk());
3529 ASSERT_THAT(callback2.WaitForResult(), IsOk());
[email protected]dcbe168a2010-12-02 03:14:463530 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433531 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103532 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463533 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3534
3535 // Now we have 1 idle socket in "a" and 2 active sockets in "b". This means
3536 // we've maxed out on sockets, since we set |kMaxTotalSockets| to 3.
3537 // Requesting 2 preconnected sockets for "a" should fail to allocate any more
3538 // sockets for "a", and "b" should still have 2 active sockets.
3539
Charlie Harrison55ce6082018-05-14 02:25:573540 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463541 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433542 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103543 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463544 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3545 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3546 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433547 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103548 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463549 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("b"));
3550 EXPECT_EQ(2, pool_->NumActiveSocketsInGroup("b"));
3551
3552 // Now release the 2 active sockets for "b". This will give us 1 idle socket
3553 // in "a" and 2 idle sockets in "b". Requesting 2 preconnected sockets for
3554 // "a" should result in closing 1 for "b".
3555 handle1.Reset();
3556 handle2.Reset();
3557 EXPECT_EQ(2, pool_->IdleSocketCountInGroup("b"));
3558 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3559
Charlie Harrison55ce6082018-05-14 02:25:573560 pool_->RequestSockets("a", &params_, 2, NetLogWithSource());
[email protected]dcbe168a2010-12-02 03:14:463561 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433562 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103563 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]dcbe168a2010-12-02 03:14:463564 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3565 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
3566 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("b"));
Lily Chenecebf932018-11-02 17:15:433567 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("b"));
[email protected]8159a1c2012-06-07 00:00:103568 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("b"));
[email protected]dcbe168a2010-12-02 03:14:463569 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("b"));
3570 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("b"));
3571}
3572
[email protected]b7b8be42011-07-12 12:46:413573TEST_F(ClientSocketPoolBaseTest, PreconnectWithoutBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073574 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3575 pool_->EnableConnectBackupJobs();
3576
3577 // Make the ConnectJob hang until it times out, shorten the timeout.
3578 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3579 connect_job_factory_->set_timeout_duration(
3580 base::TimeDelta::FromMilliseconds(500));
Charlie Harrison55ce6082018-05-14 02:25:573581 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073582 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433583 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103584 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073585 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073586
[email protected]b7b8be42011-07-12 12:46:413587 // Verify the backup timer doesn't create a backup job, by making
3588 // the backup job a pending job instead of a waiting job, so it
3589 // *would* complete if it were created.
[email protected]a9fc8fc2011-05-10 02:41:073590 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
skyostil4891b25b2015-06-11 11:43:453591 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
Gabriel Charetteea918012018-05-16 11:53:443592 FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
[email protected]2da659e2013-05-23 20:51:343593 base::TimeDelta::FromSeconds(1));
fdoray5eeb7642016-06-22 16:11:283594 base::RunLoop().Run();
[email protected]a9fc8fc2011-05-10 02:41:073595 EXPECT_FALSE(pool_->HasGroup("a"));
3596}
3597
[email protected]b7b8be42011-07-12 12:46:413598TEST_F(ClientSocketPoolBaseTest, PreconnectWithBackupJob) {
[email protected]a9fc8fc2011-05-10 02:41:073599 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3600 pool_->EnableConnectBackupJobs();
3601
3602 // Make the ConnectJob hang forever.
3603 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
Charlie Harrison55ce6082018-05-14 02:25:573604 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]a9fc8fc2011-05-10 02:41:073605 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433606 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103607 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073608 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
fdoray5eeb7642016-06-22 16:11:283609 base::RunLoop().RunUntilIdle();
[email protected]a9fc8fc2011-05-10 02:41:073610
3611 // Make the backup job be a pending job, so it completes normally.
3612 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
3613 ClientSocketHandle handle;
[email protected]6ecf2b92011-12-15 01:14:523614 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:153615 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:543616 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:153617 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:203618 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]b7b8be42011-07-12 12:46:413619 // Timer has started, but the backup connect job shouldn't be created yet.
[email protected]a9fc8fc2011-05-10 02:41:073620 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433621 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]8159a1c2012-06-07 00:00:103622 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073623 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3624 EXPECT_EQ(0, pool_->NumActiveSocketsInGroup("a"));
robpercival214763f2016-07-01 23:27:013625 ASSERT_THAT(callback.WaitForResult(), IsOk());
[email protected]a9fc8fc2011-05-10 02:41:073626
3627 // The hung connect job should still be there, but everything else should be
3628 // complete.
3629 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433630 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3631 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
[email protected]a9fc8fc2011-05-10 02:41:073632 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3633 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3634}
3635
[email protected]0dc88b32014-03-26 20:12:283636// Tests that a preconnect that starts out with unread data can still be used.
3637// http://crbug.com/334467
3638TEST_F(ClientSocketPoolBaseTest, PreconnectWithUnreadData) {
3639 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3640 connect_job_factory_->set_job_type(TestConnectJob::kMockUnreadDataJob);
3641
Charlie Harrison55ce6082018-05-14 02:25:573642 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
[email protected]0dc88b32014-03-26 20:12:283643
3644 ASSERT_TRUE(pool_->HasGroup("a"));
3645 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433646 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283647 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3648 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3649
3650 // Fail future jobs to be sure that handle receives the preconnected socket
3651 // rather than closing it and making a new one.
3652 connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob);
3653 ClientSocketHandle handle;
3654 TestCompletionCallback callback;
tfarina428341112016-09-22 13:38:203655 EXPECT_EQ(OK,
Paul Jensen8d6f87ec2018-01-13 00:46:543656 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:203657 ClientSocketPool::RespectLimits::ENABLED,
3658 callback.callback(), pool_.get(), NetLogWithSource()));
[email protected]0dc88b32014-03-26 20:12:283659
3660 ASSERT_TRUE(pool_->HasGroup("a"));
3661 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433662 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283663 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3664 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
Lily Chenecebf932018-11-02 17:15:433665 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
[email protected]0dc88b32014-03-26 20:12:283666
3667 // Drain the pending read.
Bence Békybdbb0e72018-08-07 21:42:593668 EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionOnceCallback()));
[email protected]0dc88b32014-03-26 20:12:283669
3670 TestLoadTimingInfoConnectedReused(handle);
3671 handle.Reset();
3672
3673 // The socket should be usable now that it's idle again.
3674 EXPECT_EQ(1, pool_->IdleSocketCountInGroup("a"));
3675}
3676
Lily Chenecebf932018-11-02 17:15:433677TEST_F(ClientSocketPoolBaseTest, RequestGetsAssignedJob) {
3678 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3679 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3680
3681 ClientSocketHandle handle1;
3682 TestCompletionCallback callback1;
3683 EXPECT_EQ(
3684 ERR_IO_PENDING,
3685 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3686 ClientSocketPool::RespectLimits::ENABLED,
3687 callback1.callback(), pool_.get(), NetLogWithSource()));
3688
3689 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3690 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3691 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3692 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3693
3694 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3695}
3696
3697TEST_F(ClientSocketPoolBaseTest, MultipleRequestsGetAssignedJobs) {
3698 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3699 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3700
3701 ClientSocketHandle handle1;
3702 TestCompletionCallback callback1;
3703 EXPECT_EQ(
3704 ERR_IO_PENDING,
3705 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3706 ClientSocketPool::RespectLimits::ENABLED,
3707 callback1.callback(), pool_.get(), NetLogWithSource()));
3708
3709 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3710 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3711 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3712 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3713
3714 ClientSocketHandle handle2;
3715 TestCompletionCallback callback2;
3716 EXPECT_EQ(
3717 ERR_IO_PENDING,
3718 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3719 ClientSocketPool::RespectLimits::ENABLED,
3720 callback2.callback(), pool_.get(), NetLogWithSource()));
3721
3722 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3723 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3724 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3725 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3726
3727 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3728 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3729
3730 // One job completes. The other request should still have its job.
3731 client_socket_factory_.SignalJob(0);
3732 EXPECT_THAT(callback1.WaitForResult(), IsOk());
3733
3734 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3735 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3736 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3737 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
3738 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3739
3740 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3741}
3742
3743TEST_F(ClientSocketPoolBaseTest, PreconnectJobGetsAssignedToRequest) {
3744 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3745 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3746
3747 pool_->RequestSockets("a", &params_, 1, NetLogWithSource());
3748
3749 ASSERT_TRUE(pool_->HasGroup("a"));
3750 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3751 EXPECT_EQ(1, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3752 EXPECT_EQ(1, pool_->NumUnassignedConnectJobsInGroup("a"));
3753 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3754
3755 ClientSocketHandle handle1;
3756 TestCompletionCallback callback1;
3757 EXPECT_EQ(
3758 ERR_IO_PENDING,
3759 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3760 ClientSocketPool::RespectLimits::ENABLED,
3761 callback1.callback(), pool_.get(), NetLogWithSource()));
3762
3763 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3764 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3765 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3766 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3767
3768 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3769}
3770
3771TEST_F(ClientSocketPoolBaseTest, HigherPriorityRequestStealsJob) {
3772 CreatePool(kDefaultMaxSockets, 1);
3773 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3774
3775 ClientSocketHandle handle1;
3776 TestCompletionCallback callback1;
3777 EXPECT_EQ(
3778 ERR_IO_PENDING,
3779 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3780 ClientSocketPool::RespectLimits::ENABLED,
3781 callback1.callback(), pool_.get(), NetLogWithSource()));
3782
3783 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3784 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3785 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3786 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3787
3788 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3789
3790 // Insert a higher priority request
3791 ClientSocketHandle handle2;
3792 TestCompletionCallback callback2;
3793 EXPECT_EQ(
3794 ERR_IO_PENDING,
3795 handle2.Init("a", params_, HIGHEST, SocketTag(),
3796 ClientSocketPool::RespectLimits::ENABLED,
3797 callback2.callback(), pool_.get(), NetLogWithSource()));
3798
3799 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3800 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3801 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3802 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3803
3804 // The highest priority request should steal the job from the default priority
3805 // request.
3806 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3807 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3808}
3809
3810TEST_F(ClientSocketPoolBaseTest, RequestStealsJobFromLowestRequestWithJob) {
3811 CreatePool(3, 3);
3812 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3813
3814 ClientSocketHandle handle_lowest;
3815 TestCompletionCallback callback_lowest;
3816 EXPECT_EQ(ERR_IO_PENDING,
3817 handle_lowest.Init("a", params_, LOWEST, SocketTag(),
3818 ClientSocketPool::RespectLimits::ENABLED,
3819 callback_lowest.callback(), pool_.get(),
3820 NetLogWithSource()));
3821
3822 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3823 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3824 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3825 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3826
3827 ClientSocketHandle handle_highest;
3828 TestCompletionCallback callback_highest;
3829 EXPECT_EQ(ERR_IO_PENDING,
3830 handle_highest.Init("a", params_, HIGHEST, SocketTag(),
3831 ClientSocketPool::RespectLimits::ENABLED,
3832 callback_highest.callback(), pool_.get(),
3833 NetLogWithSource()));
3834
3835 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
3836 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3837 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3838 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3839
3840 ClientSocketHandle handle_low;
3841 TestCompletionCallback callback_low;
3842 EXPECT_EQ(ERR_IO_PENDING,
3843 handle_low.Init("a", params_, LOW, SocketTag(),
3844 ClientSocketPool::RespectLimits::ENABLED,
3845 callback_low.callback(), pool_.get(),
3846 NetLogWithSource()));
3847
3848 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3849 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3850 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3851 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3852
3853 ClientSocketHandle handle_lowest2;
3854 TestCompletionCallback callback_lowest2;
3855 EXPECT_EQ(ERR_IO_PENDING,
3856 handle_lowest2.Init("a", params_, LOWEST, SocketTag(),
3857 ClientSocketPool::RespectLimits::ENABLED,
3858 callback_lowest2.callback(), pool_.get(),
3859 NetLogWithSource()));
3860
3861 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3862 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3863 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3864 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3865
3866 // The top three requests in the queue should have jobs.
3867 EXPECT_TRUE(
3868 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_highest));
3869 EXPECT_TRUE(
3870 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_low));
3871 EXPECT_TRUE(
3872 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest));
3873 EXPECT_FALSE(
3874 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest2));
3875
3876 // Add another request with medium priority. It should steal the job from the
3877 // lowest priority request with a job.
3878 ClientSocketHandle handle_medium;
3879 TestCompletionCallback callback_medium;
3880 EXPECT_EQ(ERR_IO_PENDING,
3881 handle_medium.Init("a", params_, MEDIUM, SocketTag(),
3882 ClientSocketPool::RespectLimits::ENABLED,
3883 callback_medium.callback(), pool_.get(),
3884 NetLogWithSource()));
3885
3886 EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a"));
3887 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3888 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3889 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3890 EXPECT_TRUE(
3891 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_highest));
3892 EXPECT_TRUE(
3893 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_medium));
3894 EXPECT_TRUE(
3895 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_low));
3896 EXPECT_FALSE(
3897 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest));
3898 EXPECT_FALSE(
3899 pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle_lowest2));
3900}
3901
3902TEST_F(ClientSocketPoolBaseTest, ReprioritizeRequestStealsJob) {
3903 CreatePool(kDefaultMaxSockets, 1);
3904 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3905
3906 ClientSocketHandle handle1;
3907 TestCompletionCallback callback1;
3908 EXPECT_EQ(
3909 ERR_IO_PENDING,
3910 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3911 ClientSocketPool::RespectLimits::ENABLED,
3912 callback1.callback(), pool_.get(), NetLogWithSource()));
3913
3914 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3915 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3916 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3917 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3918
3919 ClientSocketHandle handle2;
3920 TestCompletionCallback callback2;
3921 EXPECT_EQ(
3922 ERR_IO_PENDING,
3923 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3924 ClientSocketPool::RespectLimits::ENABLED,
3925 callback2.callback(), pool_.get(), NetLogWithSource()));
3926
3927 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3928 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3929 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3930 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3931
3932 // The second request doesn't get a job because we are at the limit.
3933 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3934 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3935
3936 // Reprioritizing the second request places it above the first, and it steals
3937 // the job from the first request.
3938 pool_->SetPriority("a", &handle2, HIGHEST);
3939 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3940 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3941}
3942
3943TEST_F(ClientSocketPoolBaseTest, CancelRequestReassignsJob) {
3944 CreatePool(kDefaultMaxSockets, 1);
3945 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3946
3947 ClientSocketHandle handle1;
3948 TestCompletionCallback callback1;
3949 EXPECT_EQ(
3950 ERR_IO_PENDING,
3951 handle1.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3952 ClientSocketPool::RespectLimits::ENABLED,
3953 callback1.callback(), pool_.get(), NetLogWithSource()));
3954
3955 EXPECT_EQ(1, 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 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3961
3962 ClientSocketHandle handle2;
3963 TestCompletionCallback callback2;
3964 EXPECT_EQ(
3965 ERR_IO_PENDING,
3966 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
3967 ClientSocketPool::RespectLimits::ENABLED,
3968 callback2.callback(), pool_.get(), NetLogWithSource()));
3969
3970 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3971 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3972 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3973 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3974
3975 // The second request doesn't get a job because we are the limit.
3976 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
3977 EXPECT_FALSE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3978
3979 // The second request should get a job upon cancelling the first request.
3980 handle1.Reset();
3981 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
3982 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
3983 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
3984 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
3985
3986 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
3987}
3988
3989TEST_F(ClientSocketPoolBaseTest, JobCompletionReassignsJob) {
3990 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
3991 connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob);
3992
3993 ClientSocketHandle handle1;
3994 TestCompletionCallback callback1;
3995 EXPECT_EQ(
3996 ERR_IO_PENDING,
3997 handle1.Init("a", params_, HIGHEST, SocketTag(),
3998 ClientSocketPool::RespectLimits::ENABLED,
3999 callback1.callback(), pool_.get(), NetLogWithSource()));
4000
4001 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4002 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4003 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4004 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4005
4006 ClientSocketHandle handle2;
4007 TestCompletionCallback callback2;
4008 EXPECT_EQ(
4009 ERR_IO_PENDING,
4010 handle2.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
4011 ClientSocketPool::RespectLimits::ENABLED,
4012 callback2.callback(), pool_.get(), NetLogWithSource()));
4013
4014 EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a"));
4015 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4016 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4017 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4018
4019 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle1));
4020 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4021
4022 // The lower-priority job completes first. The higher-priority request should
4023 // get the socket, and the lower-priority request should get the remaining
4024 // job.
4025 client_socket_factory_.SignalJob(1);
4026 EXPECT_THAT(callback1.WaitForResult(), IsOk());
4027 EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4028 EXPECT_EQ(0, pool_->NumNeverAssignedConnectJobsInGroup("a"));
4029 EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a"));
4030 EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
4031 EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a"));
4032 EXPECT_TRUE(handle1.socket());
4033 EXPECT_TRUE(pool_->RequestInGroupWithHandleHasJobForTesting("a", &handle2));
4034}
4035
[email protected]043b68c82013-08-22 23:41:524036class MockLayeredPool : public HigherLayeredPool {
[email protected]58e562f2013-04-22 17:32:204037 public:
4038 MockLayeredPool(TestClientSocketPool* pool,
4039 const std::string& group_name)
4040 : pool_(pool),
[email protected]58e562f2013-04-22 17:32:204041 group_name_(group_name),
4042 can_release_connection_(true) {
[email protected]043b68c82013-08-22 23:41:524043 pool_->AddHigherLayeredPool(this);
[email protected]58e562f2013-04-22 17:32:204044 }
4045
Daniel Cheng4496d0822018-04-26 21:52:154046 ~MockLayeredPool() override { pool_->RemoveHigherLayeredPool(this); }
[email protected]58e562f2013-04-22 17:32:204047
4048 int RequestSocket(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:154049 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:544050 return handle_.Init(group_name_, params, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154051 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204052 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204053 }
4054
4055 int RequestSocketWithoutLimits(TestClientSocketPool* pool) {
mmenked3641e12016-01-28 16:06:154056 scoped_refptr<TestSocketParams> params(new TestSocketParams());
Paul Jensen8d6f87ec2018-01-13 00:46:544057 return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154058 ClientSocketPool::RespectLimits::DISABLED,
tfarina428341112016-09-22 13:38:204059 callback_.callback(), pool, NetLogWithSource());
[email protected]58e562f2013-04-22 17:32:204060 }
4061
4062 bool ReleaseOneConnection() {
4063 if (!handle_.is_initialized() || !can_release_connection_) {
4064 return false;
4065 }
4066 handle_.socket()->Disconnect();
4067 handle_.Reset();
4068 return true;
4069 }
4070
4071 void set_can_release_connection(bool can_release_connection) {
4072 can_release_connection_ = can_release_connection;
4073 }
4074
4075 MOCK_METHOD0(CloseOneIdleConnection, bool());
4076
4077 private:
4078 TestClientSocketPool* const pool_;
[email protected]58e562f2013-04-22 17:32:204079 ClientSocketHandle handle_;
4080 TestCompletionCallback callback_;
4081 const std::string group_name_;
4082 bool can_release_connection_;
4083};
4084
4085TEST_F(ClientSocketPoolBaseTest, FailToCloseIdleSocketsNotHeldByLayeredPool) {
4086 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4087 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4088
4089 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014090 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204091 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4092 .WillOnce(Return(false));
[email protected]043b68c82013-08-22 23:41:524093 EXPECT_FALSE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:204094}
4095
4096TEST_F(ClientSocketPoolBaseTest, ForciblyCloseIdleSocketsHeldByLayeredPool) {
4097 CreatePool(kDefaultMaxSockets, kDefaultMaxSocketsPerGroup);
4098 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4099
4100 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014101 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204102 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4103 .WillOnce(Invoke(&mock_layered_pool,
4104 &MockLayeredPool::ReleaseOneConnection));
[email protected]043b68c82013-08-22 23:41:524105 EXPECT_TRUE(pool_->CloseOneIdleConnectionInHigherLayeredPool());
[email protected]58e562f2013-04-22 17:32:204106}
4107
4108// Tests the basic case of closing an idle socket in a higher layered pool when
4109// a new request is issued and the lower layer pool is stalled.
4110TEST_F(ClientSocketPoolBaseTest, CloseIdleSocketsHeldByLayeredPoolWhenNeeded) {
4111 CreatePool(1, 1);
4112 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4113
4114 MockLayeredPool mock_layered_pool(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014115 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204116 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4117 .WillOnce(Invoke(&mock_layered_pool,
4118 &MockLayeredPool::ReleaseOneConnection));
4119 ClientSocketHandle handle;
4120 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:154121 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544122 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154123 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204124 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014125 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204126}
4127
4128// Same as above, but the idle socket is in the same group as the stalled
4129// socket, and closes the only other request in its group when closing requests
4130// in higher layered pools. This generally shouldn't happen, but it may be
4131// possible if a higher level pool issues a request and the request is
4132// subsequently cancelled. Even if it's not possible, best not to crash.
4133TEST_F(ClientSocketPoolBaseTest,
4134 CloseIdleSocketsHeldByLayeredPoolWhenNeededSameGroup) {
4135 CreatePool(2, 2);
4136 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4137
4138 // Need a socket in another group for the pool to be stalled (If a group
4139 // has the maximum number of connections already, it's not stalled).
4140 ClientSocketHandle handle1;
4141 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204142 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:544143 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204144 ClientSocketPool::RespectLimits::ENABLED,
4145 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204146
4147 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014148 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204149 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4150 .WillOnce(Invoke(&mock_layered_pool,
4151 &MockLayeredPool::ReleaseOneConnection));
4152 ClientSocketHandle handle;
4153 TestCompletionCallback callback2;
mmenked3641e12016-01-28 16:06:154154 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544155 handle.Init("group2", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154156 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204157 callback2.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014158 EXPECT_THAT(callback2.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204159}
4160
4161// Tests the case when an idle socket can be closed when a new request is
4162// issued, and the new request belongs to a group that was previously stalled.
4163TEST_F(ClientSocketPoolBaseTest,
4164 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded) {
4165 CreatePool(2, 2);
4166 std::list<TestConnectJob::JobType> job_types;
4167 job_types.push_back(TestConnectJob::kMockJob);
4168 job_types.push_back(TestConnectJob::kMockJob);
4169 job_types.push_back(TestConnectJob::kMockJob);
4170 job_types.push_back(TestConnectJob::kMockJob);
4171 connect_job_factory_->set_job_types(&job_types);
4172
4173 ClientSocketHandle handle1;
4174 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204175 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:544176 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204177 ClientSocketPool::RespectLimits::ENABLED,
4178 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204179
4180 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014181 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204182 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4183 .WillRepeatedly(Invoke(&mock_layered_pool,
4184 &MockLayeredPool::ReleaseOneConnection));
4185 mock_layered_pool.set_can_release_connection(false);
4186
4187 // The third request is made when the socket pool is in a stalled state.
4188 ClientSocketHandle handle3;
4189 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204190 EXPECT_EQ(
4191 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544192 handle3.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204193 ClientSocketPool::RespectLimits::ENABLED,
4194 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204195
4196 base::RunLoop().RunUntilIdle();
4197 EXPECT_FALSE(callback3.have_result());
4198
4199 // The fourth request is made when the pool is no longer stalled. The third
4200 // request should be serviced first, since it was issued first and has the
4201 // same priority.
4202 mock_layered_pool.set_can_release_connection(true);
4203 ClientSocketHandle handle4;
4204 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204205 EXPECT_EQ(
4206 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544207 handle4.Init("group3", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204208 ClientSocketPool::RespectLimits::ENABLED,
4209 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014210 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204211 EXPECT_FALSE(callback4.have_result());
4212
4213 // Closing a handle should free up another socket slot.
4214 handle1.Reset();
robpercival214763f2016-07-01 23:27:014215 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204216}
4217
4218// Tests the case when an idle socket can be closed when a new request is
4219// issued, and the new request belongs to a group that was previously stalled.
4220//
4221// The two differences from the above test are that the stalled requests are not
4222// in the same group as the layered pool's request, and the the fourth request
4223// has a higher priority than the third one, so gets a socket first.
4224TEST_F(ClientSocketPoolBaseTest,
4225 CloseIdleSocketsHeldByLayeredPoolInSameGroupWhenNeeded2) {
4226 CreatePool(2, 2);
4227 std::list<TestConnectJob::JobType> job_types;
4228 job_types.push_back(TestConnectJob::kMockJob);
4229 job_types.push_back(TestConnectJob::kMockJob);
4230 job_types.push_back(TestConnectJob::kMockJob);
4231 job_types.push_back(TestConnectJob::kMockJob);
4232 connect_job_factory_->set_job_types(&job_types);
4233
4234 ClientSocketHandle handle1;
4235 TestCompletionCallback callback1;
tfarina428341112016-09-22 13:38:204236 EXPECT_EQ(
Paul Jensen8d6f87ec2018-01-13 00:46:544237 OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, SocketTag(),
tfarina428341112016-09-22 13:38:204238 ClientSocketPool::RespectLimits::ENABLED,
4239 callback1.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204240
4241 MockLayeredPool mock_layered_pool(pool_.get(), "group2");
robpercival214763f2016-07-01 23:27:014242 EXPECT_THAT(mock_layered_pool.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204243 EXPECT_CALL(mock_layered_pool, CloseOneIdleConnection())
4244 .WillRepeatedly(Invoke(&mock_layered_pool,
4245 &MockLayeredPool::ReleaseOneConnection));
4246 mock_layered_pool.set_can_release_connection(false);
4247
4248 // The third request is made when the socket pool is in a stalled state.
4249 ClientSocketHandle handle3;
4250 TestCompletionCallback callback3;
tfarina428341112016-09-22 13:38:204251 EXPECT_EQ(
4252 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544253 handle3.Init("group3", params_, MEDIUM, SocketTag(),
tfarina428341112016-09-22 13:38:204254 ClientSocketPool::RespectLimits::ENABLED,
4255 callback3.callback(), pool_.get(), NetLogWithSource()));
[email protected]58e562f2013-04-22 17:32:204256
4257 base::RunLoop().RunUntilIdle();
4258 EXPECT_FALSE(callback3.have_result());
4259
4260 // The fourth request is made when the pool is no longer stalled. This
4261 // request has a higher priority than the third request, so is serviced first.
4262 mock_layered_pool.set_can_release_connection(true);
4263 ClientSocketHandle handle4;
4264 TestCompletionCallback callback4;
tfarina428341112016-09-22 13:38:204265 EXPECT_EQ(
4266 ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544267 handle4.Init("group3", params_, HIGHEST, SocketTag(),
tfarina428341112016-09-22 13:38:204268 ClientSocketPool::RespectLimits::ENABLED,
4269 callback4.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014270 EXPECT_THAT(callback4.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204271 EXPECT_FALSE(callback3.have_result());
4272
4273 // Closing a handle should free up another socket slot.
4274 handle1.Reset();
robpercival214763f2016-07-01 23:27:014275 EXPECT_THAT(callback3.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204276}
4277
4278TEST_F(ClientSocketPoolBaseTest,
4279 CloseMultipleIdleSocketsHeldByLayeredPoolWhenNeeded) {
4280 CreatePool(1, 1);
4281 connect_job_factory_->set_job_type(TestConnectJob::kMockJob);
4282
4283 MockLayeredPool mock_layered_pool1(pool_.get(), "foo");
robpercival214763f2016-07-01 23:27:014284 EXPECT_THAT(mock_layered_pool1.RequestSocket(pool_.get()), IsOk());
[email protected]58e562f2013-04-22 17:32:204285 EXPECT_CALL(mock_layered_pool1, CloseOneIdleConnection())
4286 .WillRepeatedly(Invoke(&mock_layered_pool1,
4287 &MockLayeredPool::ReleaseOneConnection));
4288 MockLayeredPool mock_layered_pool2(pool_.get(), "bar");
robpercival214763f2016-07-01 23:27:014289 EXPECT_THAT(mock_layered_pool2.RequestSocketWithoutLimits(pool_.get()),
4290 IsOk());
[email protected]58e562f2013-04-22 17:32:204291 EXPECT_CALL(mock_layered_pool2, CloseOneIdleConnection())
4292 .WillRepeatedly(Invoke(&mock_layered_pool2,
4293 &MockLayeredPool::ReleaseOneConnection));
4294 ClientSocketHandle handle;
4295 TestCompletionCallback callback;
mmenked3641e12016-01-28 16:06:154296 EXPECT_EQ(ERR_IO_PENDING,
Paul Jensen8d6f87ec2018-01-13 00:46:544297 handle.Init("a", params_, DEFAULT_PRIORITY, SocketTag(),
mmenked3641e12016-01-28 16:06:154298 ClientSocketPool::RespectLimits::ENABLED,
tfarina428341112016-09-22 13:38:204299 callback.callback(), pool_.get(), NetLogWithSource()));
robpercival214763f2016-07-01 23:27:014300 EXPECT_THAT(callback.WaitForResult(), IsOk());
[email protected]58e562f2013-04-22 17:32:204301}
4302
[email protected]b021ece62013-06-11 11:06:334303// Test that when a socket pool and group are at their limits, a request
mmenked3641e12016-01-28 16:06:154304// with RespectLimits::DISABLED triggers creation of a new socket, and gets the
4305// socket instead of a request with the same priority that was issued earlier,
4306// but has RespectLimits::ENABLED.
[email protected]b021ece62013-06-11 11:06:334307TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) {
[email protected]b021ece62013-06-11 11:06:334308 CreatePool(1, 1);
4309
4310 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154311 EXPECT_EQ(
4312 OK, StartRequestWithIgnoreLimits(
4313 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334314 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4315
4316 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4317
mmenked3641e12016-01-28 16:06:154318 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4319 "a", MAXIMUM_PRIORITY,
4320 ClientSocketPool::RespectLimits::ENABLED));
[email protected]b021ece62013-06-11 11:06:334321 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4322
mmenked3641e12016-01-28 16:06:154323 // Issue a request that ignores the limits, so a new ConnectJob is
4324 // created.
4325 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4326 "a", MAXIMUM_PRIORITY,
4327 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334328 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4329
robpercival214763f2016-07-01 23:27:014330 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334331 EXPECT_FALSE(request(1)->have_result());
4332}
4333
[email protected]c55fabd2013-11-04 23:26:564334// Test that when a socket pool and group are at their limits, a ConnectJob
mmenked3641e12016-01-28 16:06:154335// issued for a request with RespectLimits::DISABLED is not cancelled when a
4336// request with RespectLimits::ENABLED issued to the same group is cancelled.
[email protected]c55fabd2013-11-04 23:26:564337TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) {
[email protected]c55fabd2013-11-04 23:26:564338 CreatePool(1, 1);
4339
4340 // Issue a request to reach the socket pool limit.
mmenked3641e12016-01-28 16:06:154341 EXPECT_EQ(
4342 OK, StartRequestWithIgnoreLimits(
4343 "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564344 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4345
4346 connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob);
4347
mmenked3641e12016-01-28 16:06:154348 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4349 "a", MAXIMUM_PRIORITY,
4350 ClientSocketPool::RespectLimits::ENABLED));
[email protected]c55fabd2013-11-04 23:26:564351 EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a"));
4352
mmenked3641e12016-01-28 16:06:154353 // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is
4354 // created.
4355 EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits(
4356 "a", MAXIMUM_PRIORITY,
4357 ClientSocketPool::RespectLimits::DISABLED));
[email protected]b021ece62013-06-11 11:06:334358 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4359
mmenked3641e12016-01-28 16:06:154360 // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob
[email protected]b021ece62013-06-11 11:06:334361 // should not be cancelled.
4362 request(1)->handle()->Reset();
4363 ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
4364
robpercival214763f2016-07-01 23:27:014365 EXPECT_THAT(request(2)->WaitForResult(), IsOk());
[email protected]b021ece62013-06-11 11:06:334366 EXPECT_FALSE(request(1)->have_result());
4367}
4368
[email protected]f6d1d6eb2009-06-24 20:16:094369} // namespace
4370
4371} // namespace net